@@ -68,7 +68,7 @@ func newOIDCServer(body []byte) (*url.URL, *httptest.Server) {
68 return u, s
68 return u, s
71−func newTestSetup(body []byte) (*httptest.Server, *OIDCProvider) {
71+func newTestOIDCSetup(body []byte) (*httptest.Server, *OIDCProvider) {
72 redeemURL, server := newOIDCServer(body)
72 redeemURL, server := newOIDCServer(body)
73 provider := newOIDCProvider(redeemURL)
73 provider := newOIDCProvider(redeemURL)
74 return server, provider
74 return server, provider
@@ -85,7 +85,7 @@ func TestOIDCProviderRedeem(t *testing.T) {
85 IDToken: idToken,
85 IDToken: idToken,
88− server, provider := newTestSetup(body)
88+ server, provider := newTestOIDCSetup(body)
89 defer server.Close()
89 defer server.Close()
91 session, err := provider.Redeem(context.Background(), provider.RedeemURL.String(), "code1234")
91 session, err := provider.Redeem(context.Background(), provider.RedeemURL.String(), "code1234")
@@ -108,7 +108,7 @@ func TestOIDCProviderRedeem_custom_userid(t *testing.T) {
108 IDToken: idToken,
108 IDToken: idToken,
111− server, provider := newTestSetup(body)
111+ server, provider := newTestOIDCSetup(body)
112 provider.EmailClaim = "phone_number"
112 provider.EmailClaim = "phone_number"
113 defer server.Close()
113 defer server.Close()
@@ -247,7 +247,7 @@ func TestOIDCProvider_EnrichSession(t *testing.T) {
247 ExistingSession: &sessions.SessionState{
247 ExistingSession: &sessions.SessionState{
248 User: "already",
248 User: "already",
249 Email: "already@populated.com",
249 Email: "already@populated.com",
250− Groups: []string{},
250+ Groups: nil,
251 IDToken: idToken,
251 IDToken: idToken,
252 AccessToken: accessToken,
252 AccessToken: accessToken,
253 RefreshToken: refreshToken,
253 RefreshToken: refreshToken,
@@ -268,6 +268,89 @@ func TestOIDCProvider_EnrichSession(t *testing.T) {
268 RefreshToken: refreshToken,
268 RefreshToken: refreshToken,
271+ "Missing Groups with Complex Groups in Profile URL": {
272+ ExistingSession: &sessions.SessionState{
274+ Email: "already@populated.com",
277+ AccessToken: accessToken,
278+ RefreshToken: refreshToken,
280+ EmailClaim: "email",
281+ GroupsClaim: "groups",
282+ ProfileJSON: map[string]interface{}{
283+ "email": "new@thing.com",
284+ "groups": []map[string]interface{}{
286+ "groupId": "Admin Group Id",
287+ "roles": []string{"Admin"},
292+ ExpectedSession: &sessions.SessionState{
294+ Email: "already@populated.com",
295+ Groups: []string{"{\"groupId\":\"Admin Group Id\",\"roles\":[\"Admin\"]}"},
297+ AccessToken: accessToken,
298+ RefreshToken: refreshToken,
301+ "Missing Groups with Singleton Complex Group in Profile URL": {
302+ ExistingSession: &sessions.SessionState{
304+ Email: "already@populated.com",
307+ AccessToken: accessToken,
308+ RefreshToken: refreshToken,
310+ EmailClaim: "email",
311+ GroupsClaim: "groups",
312+ ProfileJSON: map[string]interface{}{
313+ "email": "new@thing.com",
314+ "groups": map[string]interface{}{
315+ "groupId": "Admin Group Id",
316+ "roles": []string{"Admin"},
320+ ExpectedSession: &sessions.SessionState{
322+ Email: "already@populated.com",
323+ Groups: []string{"{\"groupId\":\"Admin Group Id\",\"roles\":[\"Admin\"]}"},
325+ AccessToken: accessToken,
326+ RefreshToken: refreshToken,
329+ "Empty Groups Claims": {
330+ ExistingSession: &sessions.SessionState{
332+ Email: "already@populated.com",
335+ AccessToken: accessToken,
336+ RefreshToken: refreshToken,
338+ EmailClaim: "email",
339+ GroupsClaim: "groups",
340+ ProfileJSON: map[string]interface{}{
341+ "email": "new@thing.com",
342+ "groups": []string{"new", "thing"},
345+ ExpectedSession: &sessions.SessionState{
347+ Email: "already@populated.com",
350+ AccessToken: accessToken,
351+ RefreshToken: refreshToken,
271 "Missing Groups with Custom Claim": {
354 "Missing Groups with Custom Claim": {
272 ExistingSession: &sessions.SessionState{
355 ExistingSession: &sessions.SessionState{
273 User: "already",
356 User: "already",
@@ -297,7 +380,7 @@ func TestOIDCProvider_EnrichSession(t *testing.T) {
297 ExistingSession: &sessions.SessionState{
380 ExistingSession: &sessions.SessionState{
298 User: "already",
381 User: "already",
299 Email: "already@populated.com",
382 Email: "already@populated.com",
300− Groups: []string{},
383+ Groups: nil,
301 IDToken: idToken,
384 IDToken: idToken,
302 AccessToken: accessToken,
385 AccessToken: accessToken,
303 RefreshToken: refreshToken,
386 RefreshToken: refreshToken,
@@ -346,7 +429,7 @@ func TestOIDCProvider_EnrichSession(t *testing.T) {
346 jsonResp, err := json.Marshal(tc.ProfileJSON)
429 jsonResp, err := json.Marshal(tc.ProfileJSON)
347 assert.NoError(t, err)
430 assert.NoError(t, err)
349− server, provider := newTestSetup(jsonResp)
432+ server, provider := newTestOIDCSetup(jsonResp)
350 provider.ProfileURL, err = url.Parse(server.URL)
433 provider.ProfileURL, err = url.Parse(server.URL)
351 assert.NoError(t, err)
434 assert.NoError(t, err)
@@ -371,7 +454,7 @@ func TestOIDCProviderRefreshSessionIfNeededWithoutIdToken(t *testing.T) {
371 RefreshToken: refreshToken,
454 RefreshToken: refreshToken,
374− server, provider := newTestSetup(body)
457+ server, provider := newTestOIDCSetup(body)
375 defer server.Close()
458 defer server.Close()
377 existingSession := &sessions.SessionState{
460 existingSession := &sessions.SessionState{
@@ -405,7 +488,7 @@ func TestOIDCProviderRefreshSessionIfNeededWithIdToken(t *testing.T) {
405 IDToken: idToken,
488 IDToken: idToken,
408− server, provider := newTestSetup(body)
491+ server, provider := newTestOIDCSetup(body)
409 defer server.Close()
492 defer server.Close()
411 existingSession := &sessions.SessionState{
494 existingSession := &sessions.SessionState{
@@ -433,7 +516,7 @@ func TestOIDCProviderCreateSessionFromToken(t *testing.T) {
433 GroupsClaim string
516 GroupsClaim string
434 ExpectedUser string
517 ExpectedUser string
435 ExpectedEmail string
518 ExpectedEmail string
436− ExpectedGroups interface{}
519+ ExpectedGroups []string
438 "Default IDToken": {
521 "Default IDToken": {
439 IDToken: defaultIDToken,
522 IDToken: defaultIDToken,
@@ -447,7 +530,7 @@ func TestOIDCProviderCreateSessionFromToken(t *testing.T) {
447 GroupsClaim: "groups",
530 GroupsClaim: "groups",
448 ExpectedUser: "123456789",
531 ExpectedUser: "123456789",
449 ExpectedEmail: "123456789",
532 ExpectedEmail: "123456789",
450− ExpectedGroups: []string{},
533+ ExpectedGroups: nil,
452 "Custom Groups Claim": {
535 "Custom Groups Claim": {
453 IDToken: defaultIDToken,
536 IDToken: defaultIDToken,
@@ -466,7 +549,7 @@ func TestOIDCProviderCreateSessionFromToken(t *testing.T) {
467 for testName, tc := range testCases {
550 for testName, tc := range testCases {
468 t.Run(testName, func(t *testing.T) {
551 t.Run(testName, func(t *testing.T) {
469− server, provider := newTestSetup([]byte(`{}`))
552+ server, provider := newTestOIDCSetup([]byte(`{}`))
470 provider.GroupsClaim = tc.GroupsClaim
553 provider.GroupsClaim = tc.GroupsClaim
471 defer server.Close()
554 defer server.Close()
@@ -478,9 +561,9 @@ func TestOIDCProviderCreateSessionFromToken(t *testing.T) {
479 assert.Equal(t, tc.ExpectedUser, ss.User)
562 assert.Equal(t, tc.ExpectedUser, ss.User)
480 assert.Equal(t, tc.ExpectedEmail, ss.Email)
563 assert.Equal(t, tc.ExpectedEmail, ss.Email)
564+ assert.Equal(t, tc.ExpectedGroups, ss.Groups)
481 assert.Equal(t, rawIDToken, ss.IDToken)
565 assert.Equal(t, rawIDToken, ss.IDToken)
482 assert.Equal(t, rawIDToken, ss.AccessToken)
566 assert.Equal(t, rawIDToken, ss.AccessToken)
483− assert.Equal(t, tc.ExpectedGroups, ss.Groups)
484 assert.Equal(t, "", ss.RefreshToken)
567 assert.Equal(t, "", ss.RefreshToken)