Skip to content

Commit e80d6c8

Browse files
committed
[4384] Fix the groups coming as JSON string
Signed-off-by: sabith <sks@stackgen.com>
1 parent 29c7b6f commit e80d6c8

2 files changed

Lines changed: 48 additions & 3 deletions

File tree

connector/oauth/oauth.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,12 @@ func (c *oauthConnector) HandleCallback(s connector.Scopes, r *http.Request) (id
191191
if s.Groups {
192192
groups := map[string]struct{}{}
193193

194-
c.addGroupsFromMap(groups, userInfoResult)
195-
c.addGroupsFromToken(groups, token.AccessToken)
194+
if err := c.addGroupsFromMap(groups, userInfoResult); err != nil {
195+
c.logger.Warn("OAuth Connector: failed to add groups from userinfo", "error", err)
196+
}
197+
if err := c.addGroupsFromToken(groups, token.AccessToken); err != nil {
198+
c.logger.Warn("OAuth Connector: failed to add groups from token", "error", err)
199+
}
196200

197201
for groupName := range groups {
198202
identity.Groups = append(identity.Groups, groupName)
@@ -214,7 +218,15 @@ func (c *oauthConnector) HandleCallback(s connector.Scopes, r *http.Request) (id
214218
func (c *oauthConnector) addGroupsFromMap(groups map[string]struct{}, result map[string]interface{}) error {
215219
groupsClaim, ok := result[c.groupsKey].([]interface{})
216220
if !ok {
217-
return errors.New("cannot convert to slice")
221+
// sometimes the groups claim is a slice encoded as a JSON string
222+
groupsStr, ok := result[c.groupsKey].(string)
223+
if !ok {
224+
return fmt.Errorf("%T claim is not a list or JSON-encoded list", result[c.groupsKey])
225+
}
226+
err := json.Unmarshal([]byte(groupsStr), &groupsClaim)
227+
if err != nil {
228+
return fmt.Errorf("failed to decode groups claim: %v", err)
229+
}
218230
}
219231

220232
for _, group := range groupsClaim {

connector/oauth/oauth_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,39 @@ func TestHandleCallBackForGroupsInUserInfo(t *testing.T) {
100100
assert.Equal(t, identity.EmailVerified, false)
101101
}
102102

103+
func TestHandleCallBackForGroupsInUserInfoIsString(t *testing.T) {
104+
tokenClaims := map[string]interface{}{}
105+
106+
userInfoClaims := map[string]interface{}{
107+
"name": "test-name",
108+
"user_id_key": "test-user-id",
109+
"user_name_key": "test-username",
110+
"preferred_username": "test-preferred-username",
111+
"mail": "mod_mail",
112+
"has_verified_email": false,
113+
"groups_key": `["admin-group", "user-group"]`,
114+
}
115+
116+
testServer := testSetup(t, tokenClaims, userInfoClaims)
117+
defer testServer.Close()
118+
119+
conn := newConnector(t, testServer.URL)
120+
req := newRequestWithAuthCode(t, testServer.URL, "TestHandleCallBackForGroupsInUserInfo")
121+
122+
identity, err := conn.HandleCallback(connector.Scopes{Groups: true}, req)
123+
assert.Equal(t, err, nil)
124+
125+
sort.Strings(identity.Groups)
126+
assert.Equal(t, len(identity.Groups), 2)
127+
assert.Equal(t, identity.Groups[0], "admin-group")
128+
assert.Equal(t, identity.Groups[1], "user-group")
129+
assert.Equal(t, identity.UserID, "test-user-id")
130+
assert.Equal(t, identity.Username, "test-username")
131+
assert.Equal(t, identity.PreferredUsername, "test-preferred-username")
132+
assert.Equal(t, identity.Email, "mod_mail")
133+
assert.Equal(t, identity.EmailVerified, false)
134+
}
135+
103136
func TestHandleCallBackForGroupMapsInUserInfo(t *testing.T) {
104137
tokenClaims := map[string]interface{}{}
105138

0 commit comments

Comments
 (0)