Skip to content

Commit 24c5b35

Browse files
authored
feat: add user info claims to id token (#681)
* feat: add user info claims to id token * fix: omit empty user info values
1 parent 0d7daaf commit 24c5b35

1 file changed

Lines changed: 36 additions & 14 deletions

File tree

internal/service/oidc_service.go

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,23 @@ var (
4141
)
4242

4343
type ClaimSet struct {
44-
Iss string `json:"iss"`
45-
Aud string `json:"aud"`
46-
Sub string `json:"sub"`
47-
Iat int64 `json:"iat"`
48-
Exp int64 `json:"exp"`
44+
Iss string `json:"iss"`
45+
Aud string `json:"aud"`
46+
Sub string `json:"sub"`
47+
Iat int64 `json:"iat"`
48+
Exp int64 `json:"exp"`
49+
Name string `json:"name,omitempty"`
50+
Email string `json:"email,omitempty"`
51+
PreferredUsername string `json:"preferred_username,omitempty"`
52+
Groups []string `json:"groups,omitempty"`
4953
}
5054

5155
type UserinfoResponse struct {
5256
Sub string `json:"sub"`
5357
Name string `json:"name"`
5458
Email string `json:"email"`
5559
PreferredUsername string `json:"preferred_username"`
56-
Groups []string `json:"groups"`
60+
Groups []string `json:"groups,omitempty"`
5761
UpdatedAt int64 `json:"updated_at"`
5862
}
5963

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

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

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

374+
userInfo := service.CompileUserinfo(user, scope)
375+
370376
claims := ClaimSet{
371-
Iss: service.issuer,
372-
Aud: client.ClientID,
373-
Sub: sub,
374-
Iat: createdAt,
375-
Exp: expiresAt,
377+
Iss: service.issuer,
378+
Aud: client.ClientID,
379+
Sub: user.Sub,
380+
Iat: createdAt,
381+
Exp: expiresAt,
382+
Name: userInfo.Name,
383+
Email: userInfo.Email,
384+
PreferredUsername: userInfo.PreferredUsername,
385+
Groups: userInfo.Groups,
376386
}
377387

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

399409
func (service *OIDCService) GenerateAccessToken(c *gin.Context, client config.OIDCClientConfig, sub string, scope string) (TokenResponse, error) {
400-
idToken, err := service.generateIDToken(client, sub)
410+
user, err := service.GetUserinfo(c, sub)
411+
412+
if err != nil {
413+
return TokenResponse{}, err
414+
}
415+
416+
idToken, err := service.generateIDToken(client, user, scope)
401417

402418
if err != nil {
403419
return TokenResponse{}, err
@@ -456,9 +472,15 @@ func (service *OIDCService) RefreshAccessToken(c *gin.Context, refreshToken stri
456472
return TokenResponse{}, ErrInvalidClient
457473
}
458474

475+
user, err := service.GetUserinfo(c, entry.Sub)
476+
477+
if err != nil {
478+
return TokenResponse{}, err
479+
}
480+
459481
idToken, err := service.generateIDToken(config.OIDCClientConfig{
460482
ClientID: entry.ClientID,
461-
}, entry.Sub)
483+
}, user, entry.Scope)
462484

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

0 commit comments

Comments
 (0)