Skip to content

Commit

Permalink
Merge branch 'main' into sso_v2
Browse files Browse the repository at this point in the history
  • Loading branch information
duedares-rvj authored Nov 6, 2024
2 parents 1e73ae9 + 1d32c21 commit 9c5c6dc
Show file tree
Hide file tree
Showing 10 changed files with 637 additions and 9 deletions.
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require (
github.com/PuerkitoBio/rehttp v1.4.0
github.com/google/uuid v1.6.0
github.com/joho/godotenv v1.5.1
github.com/lestrrat-go/jwx/v2 v2.1.1
github.com/lestrrat-go/jwx/v2 v2.1.2
github.com/stretchr/testify v1.9.0
go.devnw.com/structs v1.0.0
golang.org/x/oauth2 v0.23.0
Expand All @@ -25,8 +25,8 @@ require (
github.com/lestrrat-go/option v1.0.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/segmentio/asm v1.2.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/crypto v0.28.0 // indirect
golang.org/x/net v0.23.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/sys v0.26.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
12 changes: 6 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ github.com/lestrrat-go/httprc v1.0.6 h1:qgmgIRhpvBqexMJjA/PmwSvhNk679oqD1RbovdCG
github.com/lestrrat-go/httprc v1.0.6/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo=
github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
github.com/lestrrat-go/jwx/v2 v2.1.1 h1:Y2ltVl8J6izLYFs54BVcpXLv5msSW4o8eXwnzZLI32E=
github.com/lestrrat-go/jwx/v2 v2.1.1/go.mod h1:4LvZg7oxu6Q5VJwn7Mk/UwooNRnTHUpXBj2C4j3HNx0=
github.com/lestrrat-go/jwx/v2 v2.1.2 h1:6poete4MPsO8+LAEVhpdrNI4Xp2xdiafgl2RD89moBc=
github.com/lestrrat-go/jwx/v2 v2.1.2/go.mod h1:pO+Gz9whn7MPdbsqSJzG8TlEpMZCwQDXnFJ+zsUVh8Y=
github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand All @@ -42,17 +42,17 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
go.devnw.com/structs v1.0.0 h1:FFkBoBOkapCdxFEIkpOZRmMOMr9b9hxjKTD3bJYl9lk=
go.devnw.com/structs v1.0.0/go.mod h1:wHBkdQpNeazdQHszJ2sxwVEpd8zGTEsKkeywDLGbrmg=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
Expand Down
61 changes: 61 additions & 0 deletions management/device_credentials.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package management

import "context"

// DeviceCredential is a device credential.
type DeviceCredential struct {
// ID of this device credential
ID *string `json:"id,omitempty"`

// The id of the client.
ClientID *string `json:"client_id,omitempty"`

// The id of the user.
UserID *string `json:"user_id,omitempty"`

// User agent for this device
DeviceName *string `json:"device_name,omitempty"`

// Unique identifier for the device. NOTE: This field is generally not populated for refresh_tokens and rotating_refresh_tokens
DeviceID *string `json:"device_id,omitempty"`

// Type of credential. Can be public_key, refresh_token, or rotating_refresh_token
Type *string `json:"type,omitempty"`

// Base64 encoded string containing the credential
Value *string `json:"value,omitempty"`
}

// DeviceCredentialList is a list of DeviceCredentials.
type DeviceCredentialList struct {
List
DeviceCredentials []*DeviceCredential `json:"device_credentials"`
}

// DeviceCredentialsManager manages Auth0 device-credentials resources.
type DeviceCredentialsManager manager

// Create a device credential public key to manage refresh token rotation for a given user_id
// Type of credential must be "public_key".
//
// See: https://auth0.com/docs/api/management/v2/device-credentials/post-device-credentials
func (m *DeviceCredentialsManager) Create(ctx context.Context, d *DeviceCredential, opts ...RequestOption) error {
return m.management.Request(ctx, "POST", m.management.URI("device-credentials"), d, opts...)
}

// List device credential information (public_key, refresh_token, or rotating_refresh_token) associated with a specific user.
//
// For information on how to paginate using this function see https://pkg.go.dev/github.com/auth0/go-auth0/management#hdr-Page_Based_Pagination
//
// See: https://auth0.com/docs/api/management/v2/device-credentials/get-device-credentials
func (m *DeviceCredentialsManager) List(ctx context.Context, opts ...RequestOption) (d *DeviceCredentialList, err error) {
err = m.management.Request(ctx, "GET", m.management.URI("device-credentials"), &d, applyListDefaults(opts))
return
}

// Delete a device credential (such as a refresh token or public key) with the given ID.
//
// See: https://auth0.com/docs/api/management/v2/device-credentials/delete-device-credentials-by-id
func (m *DeviceCredentialsManager) Delete(ctx context.Context, id string, opts ...RequestOption) error {
return m.management.Request(ctx, "DELETE", m.management.URI("device-credentials", id), nil, opts...)
}
82 changes: 82 additions & 0 deletions management/device_credentials_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package management

import (
"context"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/auth0/go-auth0"
)

func TestDeviceCredentials_Create(t *testing.T) {
configureHTTPTestRecordings(t)

expectedDeviceCredential := &DeviceCredential{
DeviceName: auth0.String("TestDevice"),
Type: auth0.String("public_key"),
Value: auth0.String("ABCD"),
DeviceID: auth0.String("test_device"),
ClientID: auth0.String("test_client"),
}

err := api.DeviceCredentials.Create(context.Background(), expectedDeviceCredential)
assert.NoError(t, err)
assert.NotEmpty(t, expectedDeviceCredential.GetID())

t.Cleanup(func() {
cleanupDeviceCredential(t, expectedDeviceCredential.GetID())
})
}

func TestDeviceCredentials_List(t *testing.T) {
configureHTTPTestRecordings(t)

expectedDeviceCredential := givenADeviceCredential(t)

deviceCredentialList, err := api.DeviceCredentials.List(context.Background(), IncludeFields("id"))

assert.NoError(t, err)
assert.Contains(t, deviceCredentialList.DeviceCredentials, &DeviceCredential{ID: expectedDeviceCredential.ID})
}

func TestDeviceCredentials_Delete(t *testing.T) {
configureHTTPTestRecordings(t)

expectedDeviceCredential := givenADeviceCredential(t)

err := api.DeviceCredentials.Delete(context.Background(), expectedDeviceCredential.GetID())
assert.NoError(t, err)

actualDeviceCredentials, err := api.DeviceCredentials.List(context.Background())
assert.NoError(t, err)
assert.Empty(t, actualDeviceCredentials.DeviceCredentials)
}

func givenADeviceCredential(t *testing.T) *DeviceCredential {
t.Helper()

deviceCredential := &DeviceCredential{
DeviceName: auth0.String("TestDevice"),
Type: auth0.String("refresh_token"),
Value: auth0.String("ABCD"),
DeviceID: auth0.String("test_device"),
ClientID: auth0.String("test_client"),
}
err := api.DeviceCredentials.Create(context.Background(), deviceCredential)
require.NoError(t, err)

t.Cleanup(func() {
cleanupDeviceCredential(t, deviceCredential.GetID())
})

return deviceCredential
}

func cleanupDeviceCredential(t *testing.T, id string) {
t.Helper()

err := api.DeviceCredentials.Delete(context.Background(), id)
require.NoError(t, err)
}
66 changes: 66 additions & 0 deletions management/management.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

86 changes: 86 additions & 0 deletions management/management.gen_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions management/management.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ type Management struct {
// CustomDomain manages Auth0 Custom Domains.
CustomDomain *CustomDomainManager

// DeviceCredentials manages Auth0 device credentials.
DeviceCredentials *DeviceCredentialsManager

// Grant manages Auth0 Grants.
Grant *GrantManager

Expand Down Expand Up @@ -180,6 +183,7 @@ func New(domain string, options ...Option) (*Management, error) {
m.ClientGrant = (*ClientGrantManager)(&m.common)
m.Connection = (*ConnectionManager)(&m.common)
m.CustomDomain = (*CustomDomainManager)(&m.common)
m.DeviceCredentials = (*DeviceCredentialsManager)(&m.common)
m.EmailProvider = (*EmailProviderManager)(&m.common)
m.EmailTemplate = (*EmailTemplateManager)(&m.common)
m.Grant = (*GrantManager)(&m.common)
Expand Down
Loading

0 comments on commit 9c5c6dc

Please sign in to comment.