Skip to content

Commit 924fcf9

Browse files
Okta IDP Integration (#3648)
* fix(go): handle pagination correctly; * fix(go): handle api rate limits;
1 parent 0932049 commit 924fcf9

File tree

1 file changed

+64
-27
lines changed

1 file changed

+64
-27
lines changed

pro/idp/okta/okta.go

Lines changed: 64 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func NewOktaClient(oktaOrgURL, oktaAPIToken string) (*Client, error) {
1717
config, err := okta.NewConfiguration(
1818
okta.WithOrgUrl(oktaOrgURL),
1919
okta.WithToken(oktaAPIToken),
20+
okta.WithRateLimitPrevent(true),
2021
)
2122
if err != nil {
2223
return nil, err
@@ -45,18 +46,17 @@ func (o *Client) Verify() error {
4546

4647
func (o *Client) GetUsers(filters []string) ([]idp.User, error) {
4748
var retval []idp.User
48-
var allUsersFetched bool
49-
50-
for !allUsersFetched {
51-
users, resp, err := o.client.UserAPI.ListUsers(context.TODO()).
52-
Search(buildPrefixFilter("profile.login", filters)).
53-
Execute()
54-
if err != nil {
55-
return nil, err
56-
}
5749

58-
allUsersFetched = !resp.HasNextPage()
50+
users, resp, err := o.client.UserAPI.ListUsers(context.TODO()).
51+
Search(buildPrefixFilter("profile.login", filters)).
52+
Execute()
53+
if err != nil {
54+
return nil, err
55+
}
5956

57+
usersProcessingPending := len(users) > 0 || resp.HasNextPage()
58+
59+
for usersProcessingPending {
6060
for _, user := range users {
6161
id := *user.Id
6262
username := *user.Profile.Login
@@ -79,42 +79,66 @@ func (o *Client) GetUsers(filters []string) ([]idp.User, error) {
7979
AccountArchived: false,
8080
})
8181
}
82+
83+
if resp.HasNextPage() {
84+
users = make([]okta.User, 0)
85+
86+
resp, err = resp.Next(&users)
87+
if err != nil {
88+
return nil, err
89+
}
90+
91+
usersProcessingPending = len(users) > 0 || resp.HasNextPage()
92+
} else {
93+
usersProcessingPending = false
94+
}
8295
}
8396

8497
return retval, nil
8598
}
8699

87100
func (o *Client) GetGroups(filters []string) ([]idp.Group, error) {
88101
var retval []idp.Group
89-
var allGroupsFetched bool
90-
91-
for !allGroupsFetched {
92-
groups, resp, err := o.client.GroupAPI.ListGroups(context.TODO()).
93-
Search(buildPrefixFilter("profile.name", filters)).
94-
Execute()
95-
if err != nil {
96-
return nil, err
97-
}
98102

99-
allGroupsFetched = !resp.HasNextPage()
103+
groups, resp, err := o.client.GroupAPI.ListGroups(context.TODO()).
104+
Search(buildPrefixFilter("profile.name", filters)).
105+
Execute()
106+
if err != nil {
107+
return nil, err
108+
}
109+
110+
groupsProcessingPending := len(groups) > 0 || resp.HasNextPage()
100111

112+
for groupsProcessingPending {
101113
for _, group := range groups {
102-
var allMembersFetched bool
103114
id := *group.Id
104115
name := *group.Profile.Name
105116

106117
var members []string
107-
for !allMembersFetched {
108-
groupUsers, resp, err := o.client.GroupAPI.ListGroupUsers(context.TODO(), id).Execute()
109-
if err != nil {
110-
return nil, err
111-
}
118+
groupUsers, groupUsersResp, err := o.client.GroupAPI.ListGroupUsers(context.TODO(), id).Execute()
119+
if err != nil {
120+
return nil, err
121+
}
112122

113-
allMembersFetched = !resp.HasNextPage()
123+
groupUsersProcessingPending := len(groupUsers) > 0 || groupUsersResp.HasNextPage()
114124

125+
for groupUsersProcessingPending {
115126
for _, groupUser := range groupUsers {
116127
members = append(members, *groupUser.Id)
117128
}
129+
130+
if groupUsersResp.HasNextPage() {
131+
groupUsers = make([]okta.GroupMember, 0)
132+
133+
groupUsersResp, err = groupUsersResp.Next(&groupUsers)
134+
if err != nil {
135+
return nil, err
136+
}
137+
138+
groupUsersProcessingPending = len(groupUsers) > 0 || groupUsersResp.HasNextPage()
139+
} else {
140+
groupUsersProcessingPending = false
141+
}
118142
}
119143

120144
retval = append(retval, idp.Group{
@@ -123,6 +147,19 @@ func (o *Client) GetGroups(filters []string) ([]idp.Group, error) {
123147
Members: members,
124148
})
125149
}
150+
151+
if resp.HasNextPage() {
152+
groups = make([]okta.Group, 0)
153+
154+
resp, err = resp.Next(&groups)
155+
if err != nil {
156+
return nil, err
157+
}
158+
159+
groupsProcessingPending = len(groups) > 0 || resp.HasNextPage()
160+
} else {
161+
groupsProcessingPending = false
162+
}
126163
}
127164

128165
return retval, nil

0 commit comments

Comments
 (0)