// Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package auth import ( "testing" "code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/services/auth/source/oauth2" "github.com/golang-jwt/jwt/v5" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func createAndParseToken(t *testing.T, grant *auth.OAuth2Grant) *oauth2.OIDCToken { signingKey, err := oauth2.CreateJWTSigningKey("HS256", make([]byte, 32)) require.NoError(t, err) assert.NotNil(t, signingKey) response, terr := newAccessTokenResponse(db.DefaultContext, grant, signingKey, signingKey) assert.Nil(t, terr) assert.NotNil(t, response) parsedToken, err := jwt.ParseWithClaims(response.IDToken, &oauth2.OIDCToken{}, func(token *jwt.Token) (any, error) { assert.NotNil(t, token.Method) assert.Equal(t, signingKey.SigningMethod().Alg(), token.Method.Alg()) return signingKey.VerifyKey(), nil }) require.NoError(t, err) assert.True(t, parsedToken.Valid) oidcToken, ok := parsedToken.Claims.(*oauth2.OIDCToken) assert.True(t, ok) assert.NotNil(t, oidcToken) return oidcToken } func TestNewAccessTokenResponse_OIDCToken(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) grants, err := auth.GetOAuth2GrantsByUserID(db.DefaultContext, 3) require.NoError(t, err) assert.Len(t, grants, 1) // Scopes: openid oidcToken := createAndParseToken(t, grants[0]) assert.Empty(t, oidcToken.Name) assert.Empty(t, oidcToken.PreferredUsername) assert.Empty(t, oidcToken.Profile) assert.Empty(t, oidcToken.Picture) assert.Empty(t, oidcToken.Website) assert.Empty(t, oidcToken.UpdatedAt) assert.Empty(t, oidcToken.Email) assert.False(t, oidcToken.EmailVerified) user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}) grants, err = auth.GetOAuth2GrantsByUserID(db.DefaultContext, user.ID) require.NoError(t, err) assert.Len(t, grants, 1) // Scopes: openid profile email oidcToken = createAndParseToken(t, grants[0]) assert.Equal(t, user.Name, oidcToken.Name) assert.Equal(t, user.Name, oidcToken.PreferredUsername) assert.Equal(t, user.HTMLURL(), oidcToken.Profile) assert.Equal(t, user.AvatarLink(db.DefaultContext), oidcToken.Picture) assert.Equal(t, user.Website, oidcToken.Website) assert.Equal(t, user.UpdatedUnix, oidcToken.UpdatedAt) assert.Equal(t, user.Email, oidcToken.Email) assert.Equal(t, user.IsActive, oidcToken.EmailVerified) // set DefaultShowFullName to true oldDefaultShowFullName := setting.UI.DefaultShowFullName setting.UI.DefaultShowFullName = true defer func() { setting.UI.DefaultShowFullName = oldDefaultShowFullName }() // Scopes: openid profile email oidcToken = createAndParseToken(t, grants[0]) assert.Equal(t, user.FullName, oidcToken.Name) assert.Equal(t, user.Name, oidcToken.PreferredUsername) assert.Equal(t, user.HTMLURL(), oidcToken.Profile) assert.Equal(t, user.AvatarLink(db.DefaultContext), oidcToken.Picture) assert.Equal(t, user.Website, oidcToken.Website) assert.Equal(t, user.UpdatedUnix, oidcToken.UpdatedAt) assert.Equal(t, user.Email, oidcToken.Email) assert.Equal(t, user.IsActive, oidcToken.EmailVerified) }