Skip to content

Commit

Permalink
Add DeviceCredentialsManager to manage device credentials (#369)
Browse files Browse the repository at this point in the history
  • Loading branch information
Zarux authored Nov 6, 2024
1 parent 89bcb9b commit bfcb685
Show file tree
Hide file tree
Showing 8 changed files with 628 additions and 0 deletions.
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 bfcb685

Please sign in to comment.