Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 36 additions & 14 deletions internal/service/oidc_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,19 +41,23 @@ var (
)

type ClaimSet struct {
Iss string `json:"iss"`
Aud string `json:"aud"`
Sub string `json:"sub"`
Iat int64 `json:"iat"`
Exp int64 `json:"exp"`
Iss string `json:"iss"`
Aud string `json:"aud"`
Sub string `json:"sub"`
Iat int64 `json:"iat"`
Exp int64 `json:"exp"`
Name string `json:"name,omitempty"`
Email string `json:"email,omitempty"`
PreferredUsername string `json:"preferred_username,omitempty"`
Groups []string `json:"groups,omitempty"`
}

type UserinfoResponse struct {
Sub string `json:"sub"`
Name string `json:"name"`
Email string `json:"email"`
PreferredUsername string `json:"preferred_username"`
Groups []string `json:"groups"`
Groups []string `json:"groups,omitempty"`
UpdatedAt int64 `json:"updated_at"`
}

Expand Down Expand Up @@ -349,7 +353,7 @@ func (service *OIDCService) GetCodeEntry(c *gin.Context, codeHash string) (repos
return oidcCode, nil
}

func (service *OIDCService) generateIDToken(client config.OIDCClientConfig, sub string) (string, error) {
func (service *OIDCService) generateIDToken(client config.OIDCClientConfig, user repository.OidcUserinfo, scope string) (string, error) {
createdAt := time.Now().Unix()
expiresAt := time.Now().Add(time.Duration(service.config.SessionExpiry) * time.Second).Unix()

Expand All @@ -367,12 +371,18 @@ func (service *OIDCService) generateIDToken(client config.OIDCClientConfig, sub
return "", err
}

userInfo := service.CompileUserinfo(user, scope)

claims := ClaimSet{
Iss: service.issuer,
Aud: client.ClientID,
Sub: sub,
Iat: createdAt,
Exp: expiresAt,
Iss: service.issuer,
Aud: client.ClientID,
Sub: user.Sub,
Iat: createdAt,
Exp: expiresAt,
Name: userInfo.Name,
Email: userInfo.Email,
PreferredUsername: userInfo.PreferredUsername,
Groups: userInfo.Groups,
}

payload, err := json.Marshal(claims)
Expand All @@ -397,7 +407,13 @@ func (service *OIDCService) generateIDToken(client config.OIDCClientConfig, sub
}

func (service *OIDCService) GenerateAccessToken(c *gin.Context, client config.OIDCClientConfig, sub string, scope string) (TokenResponse, error) {
idToken, err := service.generateIDToken(client, sub)
user, err := service.GetUserinfo(c, sub)

if err != nil {
return TokenResponse{}, err
}
Comment thread
steveiliop56 marked this conversation as resolved.

idToken, err := service.generateIDToken(client, user, scope)

if err != nil {
return TokenResponse{}, err
Expand Down Expand Up @@ -456,9 +472,15 @@ func (service *OIDCService) RefreshAccessToken(c *gin.Context, refreshToken stri
return TokenResponse{}, ErrInvalidClient
}

user, err := service.GetUserinfo(c, entry.Sub)

if err != nil {
return TokenResponse{}, err
}

idToken, err := service.generateIDToken(config.OIDCClientConfig{
ClientID: entry.ClientID,
}, entry.Sub)
}, user, entry.Scope)

if err != nil {
return TokenResponse{}, err
Expand Down