@@ -29,12 +29,12 @@ const clientID = "https://test.myapp.com"
29const secret = "secret"
29const secret = "secret"
31type idTokenClaims struct {
31type idTokenClaims struct {
32− Name string `json:"name,omitempty"`
32+ Name string `json:"name,omitempty"`
33− Email string `json:"email,omitempty"`
33+ Email string `json:"email,omitempty"`
34− Phone string `json:"phone_number,omitempty"`
34+ Phone string `json:"phone_number,omitempty"`
35− Picture string `json:"picture,omitempty"`
35+ Picture string `json:"picture,omitempty"`
36− Groups []string `json:"groups,omitempty"`
36+ Groups interface{} `json:"groups,omitempty"`
37− OtherGroups []string `json:"other_groups,omitempty"`
37+ OtherGroups interface{} `json:"other_groups,omitempty"`
38 jwt.StandardClaims
38 jwt.StandardClaims
@@ -64,6 +64,29 @@ var defaultIDToken idTokenClaims = idTokenClaims{
67+var customGroupClaimIDToken idTokenClaims = idTokenClaims{
71+ "http://mugbook.com/janed/me.jpg",
72+ []map[string]interface{}{
74+ "groupId": "Admin Group Id",
75+ "roles": []string{"Admin"},
78+ []string{"test:c", "test:d"},
80+ Audience: "https://test.myapp.com",
81+ ExpiresAt: time.Now().Add(time.Duration(5) * time.Minute).Unix(),
83+ IssuedAt: time.Now().Unix(),
84+ Issuer: "https://issuer.example.com",
86+ Subject: "123456789",
67var minimalIDToken idTokenClaims = idTokenClaims{
90var minimalIDToken idTokenClaims = idTokenClaims{
@@ -283,7 +306,7 @@ func TestCreateSessionStateFromBearerToken(t *testing.T) {
283 GroupsClaim string
306 GroupsClaim string
284 ExpectedUser string
307 ExpectedUser string
285 ExpectedEmail string
308 ExpectedEmail string
286− ExpectedGroups []string
309+ ExpectedGroups interface{}
288 "Default IDToken": {
311 "Default IDToken": {
289 IDToken: defaultIDToken,
312 IDToken: defaultIDToken,
@@ -306,6 +329,13 @@ func TestCreateSessionStateFromBearerToken(t *testing.T) {
306 ExpectedEmail: defaultIDToken.Email,
329 ExpectedEmail: defaultIDToken.Email,
307 ExpectedGroups: []string{"test:c", "test:d"},
330 ExpectedGroups: []string{"test:c", "test:d"},
332+ "Custom Groups Claim2": {
333+ IDToken: customGroupClaimIDToken,
334+ GroupsClaim: "groups",
335+ ExpectedUser: customGroupClaimIDToken.Subject,
336+ ExpectedEmail: customGroupClaimIDToken.Email,
337+ ExpectedGroups: []string{"{\"groupId\":\"Admin Group Id\",\"roles\":[\"Admin\"]}"},
310 for testName, tc := range testCases {
340 for testName, tc := range testCases {
311 t.Run(testName, func(t *testing.T) {
341 t.Run(testName, func(t *testing.T) {
@@ -373,3 +403,31 @@ func TestOIDCProvider_findVerifiedIdToken(t *testing.T) {
373 assert.Equal(t, nil, err)
403 assert.Equal(t, nil, err)
374 assert.Equal(t, true, verifiedIDToken == nil)
404 assert.Equal(t, true, verifiedIDToken == nil)
407+func Test_formatGroup(t *testing.T) {
408+ testCases := map[string]struct {
409+ RawGroup interface{}
410+ ExpectedFormattedGroupValue string
414+ ExpectedFormattedGroupValue: "group",
417+ RawGroup: map[string]string{"id": "1", "name": "Test"},
418+ ExpectedFormattedGroupValue: "{\"id\":\"1\",\"name\":\"Test\"}",
421+ RawGroup: []string{"First", "Second"},
422+ ExpectedFormattedGroupValue: "[\"First\",\"Second\"]",
426+ for testName, tc := range testCases {
427+ t.Run(testName, func(t *testing.T) {
428+ formattedGroup, err := formatGroup(tc.RawGroup)
430+ assert.Equal(t, tc.ExpectedFormattedGroupValue, formattedGroup)