Skip to content

Commit b96116b

Browse files
committed
squash to simplify rebase
1 parent 4b98fd9 commit b96116b

File tree

7 files changed

+196
-54
lines changed

7 files changed

+196
-54
lines changed

builtin/credential/okta/backend.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/hashicorp/vault/sdk/framework"
1414
"github.com/hashicorp/vault/sdk/helper/cidrutil"
1515
"github.com/hashicorp/vault/sdk/logical"
16-
"github.com/okta/okta-sdk-golang/v2/okta"
16+
"github.com/okta/okta-sdk-golang/v5/okta"
1717
"github.com/patrickmn/go-cache"
1818
)
1919

@@ -90,6 +90,7 @@ func (b *backend) Login(ctx context.Context, req *logical.Request, username, pas
9090
}
9191

9292
shim, err := cfg.OktaClient(ctx)
93+
// oktaCfg, err := cfg.OktaConfiguration(ctx)
9394
if err != nil {
9495
return nil, nil, nil, err
9596
}
@@ -118,6 +119,7 @@ func (b *backend) Login(ctx context.Context, req *logical.Request, username, pas
118119
StateToken string `json:"stateToken"`
119120
}
120121

122+
// The okta-sdk-golang API says to construct your own requests for auth, and the Request Executor is gone, so
121123
authReq, err := shim.NewRequest("POST", "authn", map[string]interface{}{
122124
"username": username,
123125
"password": password,
@@ -129,9 +131,9 @@ func (b *backend) Login(ctx context.Context, req *logical.Request, username, pas
129131
var result authResult
130132
rsp, err := shim.Do(authReq, &result)
131133
if err != nil {
132-
if oe, ok := err.(*okta.Error); ok {
133-
return nil, logical.ErrorResponse("Okta auth failed: %v (code=%v)", err, oe.ErrorCode), nil, nil
134-
}
134+
//if oe, ok := err; ok {
135+
// return nil, logical.ErrorResponse("Okta auth failed: %v (code=%v)", err, oe.ErrorCode), nil, nil
136+
//}
135137
return nil, logical.ErrorResponse(fmt.Sprintf("Okta auth failed: %v", err)), nil, nil
136138
}
137139
if rsp == nil {
@@ -370,23 +372,23 @@ func (b *backend) Login(ctx context.Context, req *logical.Request, username, pas
370372
return policies, oktaResponse, allGroups, nil
371373
}
372374

373-
func (b *backend) getOktaGroups(ctx context.Context, client *okta.Client, user *okta.User) ([]string, error) {
374-
groups, resp, err := client.User.ListUserGroups(ctx, user.Id)
375+
func (b *backend) getOktaGroups(ctx context.Context, client *okta.APIClient, user *okta.User) ([]string, error) {
376+
groups, resp, err := client.UserAPI.ListUserGroups(ctx, user.GetId()).Execute()
375377
if err != nil {
376378
return nil, err
377379
}
378380
oktaGroups := make([]string, 0, len(groups))
379381
for _, group := range groups {
380-
oktaGroups = append(oktaGroups, group.Profile.Name)
382+
oktaGroups = append(oktaGroups, group.Profile.GetName())
381383
}
382384
for resp.HasNextPage() {
383385
var nextGroups []*okta.Group
384-
resp, err = resp.Next(ctx, &nextGroups)
386+
resp, err = resp.Next(&nextGroups)
385387
if err != nil {
386388
return nil, err
387389
}
388390
for _, group := range nextGroups {
389-
oktaGroups = append(oktaGroups, group.Profile.Name)
391+
oktaGroups = append(oktaGroups, group.Profile.GetName())
390392
}
391393
}
392394
if b.Logger().IsDebug() {

builtin/credential/okta/backend_test.go

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ import (
1717
"github.com/hashicorp/vault/sdk/helper/logging"
1818
"github.com/hashicorp/vault/sdk/helper/policyutil"
1919
"github.com/hashicorp/vault/sdk/logical"
20-
"github.com/okta/okta-sdk-golang/v2/okta"
21-
"github.com/okta/okta-sdk-golang/v2/okta/query"
20+
"github.com/okta/okta-sdk-golang/v4/okta"
2221
"github.com/stretchr/testify/require"
2322
)
2423

@@ -115,15 +114,15 @@ func TestBackend_Config(t *testing.T) {
115114

116115
func createOktaGroups(t *testing.T, username string, token string, org string) []string {
117116
orgURL := "https://" + org + "." + previewBaseURL
118-
ctx, client, err := okta.NewClient(context.Background(), okta.WithOrgUrl(orgURL), okta.WithToken(token))
117+
cfg, err := okta.NewConfiguration(okta.WithOrgUrl(orgURL), okta.WithToken(token))
119118
require.Nil(t, err)
119+
client := okta.NewAPIClient(cfg)
120+
ctx := context.Background()
120121

121-
users, _, err := client.User.ListUsers(ctx, &query.Params{
122-
Q: username,
123-
})
122+
users, _, err := client.UserAPI.ListUsers(ctx).Filter(username).Execute()
124123
require.Nil(t, err)
125124
require.Len(t, users, 1)
126-
userID := users[0].Id
125+
userID := users[0].GetId()
127126
var groupIDs []string
128127

129128
// Verify that login's call to list the groups of the user logging in will page
@@ -133,38 +132,37 @@ func createOktaGroups(t *testing.T, username string, token string, org string) [
133132
// only 200 results are returned for most orgs."
134133
for i := 0; i < 201; i++ {
135134
name := fmt.Sprintf("TestGroup%d", i)
136-
groups, _, err := client.Group.ListGroups(ctx, &query.Params{
137-
Q: name,
138-
})
135+
groups, _, err := client.GroupAPI.ListGroups(ctx).Filter(name).Execute()
139136
require.Nil(t, err)
140137

141138
var groupID string
142139
if len(groups) == 0 {
143-
group, _, err := client.Group.CreateGroup(ctx, okta.Group{
140+
group, _, err := client.GroupAPI.CreateGroup(ctx).Group(okta.Group{
144141
Profile: &okta.GroupProfile{
145-
Name: fmt.Sprintf("TestGroup%d", i),
142+
Name: okta.PtrString(fmt.Sprintf("TestGroup%d", i)),
146143
},
147-
})
144+
}).Execute()
148145
require.Nil(t, err)
149-
groupID = group.Id
146+
groupID = group.GetId()
150147
} else {
151-
groupID = groups[0].Id
148+
groupID = groups[0].GetId()
152149
}
153150
groupIDs = append(groupIDs, groupID)
154151

155-
_, err = client.Group.AddUserToGroup(ctx, groupID, userID)
152+
_, err = client.GroupAPI.AssignUserToGroup(ctx, groupID, userID).Execute()
156153
require.Nil(t, err)
157154
}
158155
return groupIDs
159156
}
160157

161158
func deleteOktaGroups(t *testing.T, token string, org string, groupIDs []string) {
162159
orgURL := "https://" + org + "." + previewBaseURL
163-
ctx, client, err := okta.NewClient(context.Background(), okta.WithOrgUrl(orgURL), okta.WithToken(token))
160+
cfg, err := okta.NewConfiguration(okta.WithOrgUrl(orgURL), okta.WithToken(token))
164161
require.Nil(t, err)
162+
client := okta.NewAPIClient(cfg)
165163

166164
for _, groupID := range groupIDs {
167-
_, err := client.Group.DeleteGroup(ctx, groupID)
165+
_, err := client.GroupAPI.DeleteGroup(context.Background(), groupID).Execute()
168166
require.Nil(t, err)
169167
}
170168
}

builtin/credential/okta/path_config.go

Lines changed: 121 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
package okta
55

66
import (
7+
"bytes"
78
"context"
9+
"encoding/json"
810
"fmt"
11+
"io"
912
"net/http"
1013
"net/url"
1114
"strings"
@@ -16,7 +19,7 @@ import (
1619
"github.com/hashicorp/vault/sdk/framework"
1720
"github.com/hashicorp/vault/sdk/helper/tokenutil"
1821
"github.com/hashicorp/vault/sdk/logical"
19-
oktanew "github.com/okta/okta-sdk-golang/v2/okta"
22+
oktanew "github.com/okta/okta-sdk-golang/v5/okta"
2023
)
2124

2225
const (
@@ -290,36 +293,127 @@ func (b *backend) pathConfigExistenceCheck(ctx context.Context, req *logical.Req
290293
}
291294

292295
type oktaShim interface {
293-
Client() (*oktanew.Client, context.Context)
296+
Client() (*oktanew.APIClient, context.Context)
294297
NewRequest(method string, url string, body interface{}) (*http.Request, error)
295298
Do(req *http.Request, v interface{}) (interface{}, error)
296299
}
297300

298301
type oktaShimNew struct {
299-
client *oktanew.Client
302+
cfg *oktanew.Configuration
303+
client *oktanew.APIClient
300304
ctx context.Context
301305
}
302306

303-
func (new *oktaShimNew) Client() (*oktanew.Client, context.Context) {
307+
func (new *oktaShimNew) Client() (*oktanew.APIClient, context.Context) {
304308
return new.client, new.ctx
305309
}
306310

307311
func (new *oktaShimNew) NewRequest(method string, url string, body interface{}) (*http.Request, error) {
308312
if !strings.HasPrefix(url, "/") {
309313
url = "/api/v1/" + url
310314
}
311-
return new.client.GetRequestExecutor().NewRequest(method, url, body)
315+
316+
// reimplementation of RequestExecutor.NewRequest() in v2 of okta-golang-sdk
317+
var buff io.ReadWriter
318+
if body != nil {
319+
switch v := body.(type) {
320+
case []byte:
321+
buff = bytes.NewBuffer(v)
322+
case *bytes.Buffer:
323+
buff = v
324+
default:
325+
buff = &bytes.Buffer{}
326+
// need to create an encoder specifically to disable html escaping
327+
encoder := json.NewEncoder(buff)
328+
encoder.SetEscapeHTML(false)
329+
err := encoder.Encode(body)
330+
if err != nil {
331+
return nil, err
332+
}
333+
}
334+
}
335+
336+
url = new.cfg.Okta.Client.OrgUrl + url
337+
//url = re.config.Okta.Client.OrgUrl + url
338+
//
339+
req, err := http.NewRequest(method, url, buff)
340+
if err != nil {
341+
return nil, err
342+
}
343+
//
344+
var auth oktanew.Authorization
345+
//
346+
switch new.cfg.Okta.Client.AuthorizationMode {
347+
case "SSWS":
348+
auth = oktanew.NewSSWSAuth(new.cfg.Okta.Client.Token, req)
349+
case "Bearer":
350+
auth = oktanew.NewBearerAuth(new.cfg.Okta.Client.Token, req)
351+
case "PrivateKey":
352+
auth = oktanew.NewPrivateKeyAuth(oktanew.PrivateKeyAuthConfig{
353+
// TokenCache: new.cfg., hmm
354+
HttpClient: new.cfg.HTTPClient,
355+
PrivateKeySigner: new.cfg.PrivateKeySigner,
356+
PrivateKey: new.cfg.Okta.Client.PrivateKey,
357+
PrivateKeyId: new.cfg.Okta.Client.PrivateKeyId,
358+
ClientId: new.cfg.Okta.Client.ClientId,
359+
OrgURL: new.cfg.Okta.Client.OrgUrl,
360+
Scopes: new.cfg.Okta.Client.Scopes,
361+
MaxRetries: new.cfg.Okta.Client.RateLimit.MaxRetries,
362+
MaxBackoff: new.cfg.Okta.Client.RateLimit.MaxBackoff,
363+
Req: req,
364+
})
365+
case "JWT":
366+
auth = oktanew.NewJWTAuth(oktanew.JWTAuthConfig{
367+
// TokenCache: new.cfg.etokenCache,
368+
HttpClient: new.cfg.HTTPClient,
369+
OrgURL: new.cfg.Okta.Client.OrgUrl,
370+
Scopes: new.cfg.Okta.Client.Scopes,
371+
ClientAssertion: new.cfg.Okta.Client.ClientAssertion,
372+
MaxRetries: new.cfg.Okta.Client.RateLimit.MaxRetries,
373+
MaxBackoff: new.cfg.Okta.Client.RateLimit.MaxBackoff,
374+
Req: req,
375+
})
376+
default:
377+
return nil, fmt.Errorf("unknown authorization mode %v", new.cfg.Okta.Client.AuthorizationMode)
378+
}
379+
380+
err = auth.Authorize("POST", url)
381+
if err != nil {
382+
return nil, err
383+
}
384+
385+
// req.Header.Add("User-Agent", NewUserAgent(re.config).String())
386+
req.Header.Add("Accept", "application/json")
387+
388+
if body != nil {
389+
req.Header.Set("Content-Type", "application/json")
390+
}
391+
//
392+
//// Force reset defaults
393+
//re.binary = false
394+
//re.headerAccept = "application/json"
395+
//re.headerContentType = "application/json"
396+
//return req, nil
397+
398+
return req, nil
312399
}
313400

314401
func (new *oktaShimNew) Do(req *http.Request, v interface{}) (interface{}, error) {
315-
return new.client.GetRequestExecutor().Do(new.ctx, req, v)
402+
resp, err := new.cfg.HTTPClient.Do(req)
403+
if err != nil {
404+
return nil, err
405+
}
406+
407+
defer resp.Body.Close()
408+
409+
return nil, nil
316410
}
317411

318412
type oktaShimOld struct {
319413
client *oktaold.Client
320414
}
321415

322-
func (new *oktaShimOld) Client() (*oktanew.Client, context.Context) {
416+
func (new *oktaShimOld) Client() (*oktanew.APIClient, context.Context) {
323417
return nil, nil
324418
}
325419

@@ -331,6 +425,24 @@ func (new *oktaShimOld) Do(req *http.Request, v interface{}) (interface{}, error
331425
return new.client.Do(req, v)
332426
}
333427

428+
func (c *ConfigEntry) OktaConfiguration(ctx context.Context) (*oktanew.Configuration, error) {
429+
baseURL := defaultBaseURL
430+
if c.Production != nil {
431+
if !*c.Production {
432+
baseURL = previewBaseURL
433+
}
434+
}
435+
if c.BaseURL != "" {
436+
baseURL = c.BaseURL
437+
}
438+
439+
cfg, err := oktanew.NewConfiguration(oktanew.WithOrgUrl("https://"+c.Org+"."+baseURL), oktanew.WithToken(c.Token))
440+
if err != nil {
441+
return nil, err
442+
}
443+
return cfg, nil
444+
}
445+
334446
// OktaClient creates a basic okta client connection
335447
func (c *ConfigEntry) OktaClient(ctx context.Context) (oktaShim, error) {
336448
baseURL := defaultBaseURL
@@ -344,13 +456,13 @@ func (c *ConfigEntry) OktaClient(ctx context.Context) (oktaShim, error) {
344456
}
345457

346458
if c.Token != "" {
347-
ctx, client, err := oktanew.NewClient(ctx,
459+
cfg, err := oktanew.NewConfiguration(
348460
oktanew.WithOrgUrl("https://"+c.Org+"."+baseURL),
349461
oktanew.WithToken(c.Token))
350462
if err != nil {
351463
return nil, err
352464
}
353-
return &oktaShimNew{client, ctx}, nil
465+
return &oktaShimNew{cfg, oktanew.NewAPIClient(cfg), ctx}, nil
354466
}
355467
client, err := oktaold.NewClientWithDomain(cleanhttp.DefaultClient(), c.Org, baseURL, "")
356468
if err != nil {

changelog/28121.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:improvement
2+
auth/okta: update to okta sdk v4
3+
```

go.mod

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ require (
177177
github.com/mitchellh/reflectwalk v1.0.2
178178
github.com/ncw/swift v1.0.47
179179
github.com/oklog/run v1.1.0
180-
github.com/okta/okta-sdk-golang/v2 v2.20.0
180+
github.com/okta/okta-sdk-golang/v4 v4.1.2
181+
github.com/okta/okta-sdk-golang/v5 v5.0.2
181182
github.com/oracle/oci-go-sdk v24.3.0+incompatible
182183
github.com/ory/dockertest v3.3.5+incompatible
183184
github.com/ory/dockertest/v3 v3.10.0
@@ -230,11 +231,18 @@ require (
230231
require (
231232
cel.dev/expr v0.15.0 // indirect
232233
cloud.google.com/go/longrunning v0.6.0 // indirect
234+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
233235
github.com/fsnotify/fsnotify v1.6.0 // indirect
234236
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
235237
github.com/go-viper/mapstructure/v2 v2.1.0 // indirect
236238
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
237239
github.com/hashicorp/go-secure-stdlib/httputil v0.1.0 // indirect
240+
github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect
241+
github.com/lestrrat-go/blackmagic v1.0.2 // indirect
242+
github.com/lestrrat-go/httpcc v1.0.1 // indirect
243+
github.com/lestrrat-go/iter v1.0.2 // indirect
244+
github.com/lestrrat-go/jwx v1.2.29 // indirect
245+
github.com/lestrrat-go/option v1.0.1 // indirect
238246
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
239247
github.com/moby/docker-image-spec v1.3.1 // indirect
240248
github.com/moby/sys/userns v0.1.0 // indirect

0 commit comments

Comments
 (0)