Skip to content

Commit

Permalink
feat(management): add DeviceCredentialsManager to mange device creden…
Browse files Browse the repository at this point in the history
…tials
  • Loading branch information
Zarux committed Mar 16, 2024
1 parent f0a5a2a commit 1c931a5
Show file tree
Hide file tree
Showing 8 changed files with 613 additions and 0 deletions.
60 changes: 60 additions & 0 deletions management/device_credentials.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package management

import "context"

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...)
}

// Retrieve 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
}

// Permanently 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...)
}
81 changes: 81 additions & 0 deletions management/device_credentials_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package management

import (
"context"
"testing"

"github.com/auth0/go-auth0"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

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)
}
61 changes: 61 additions & 0 deletions management/management.gen.go

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

78 changes: 78 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 @@ -168,6 +171,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
74 changes: 74 additions & 0 deletions test/data/recordings/TestDeviceCredentials_Create.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
version: 2
interactions:
- id: 0
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 178
transfer_encoding: []
trailer: {}
host: go-auth0-dev.eu.auth0.com
remote_addr: ""
request_uri: ""
body: |
{"client_id":"test_client","device_name":"TestDevice","device_id":"test_device","type":"public_key","value":"ABCD"}
form: {}
headers:
Content-Type:
- application/json
User-Agent:
- Go-Auth0-SDK/latest
url: https://go-auth0-dev.eu.auth0.com/api/v2/device-credentials
method: POST
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
transfer_encoding: []
trailer: {}
content_length: 26
uncompressed: false
body: '{"id":"test_credential"}'
headers:
Content-Type:
- application/json; charset=utf-8
status: 201 Created
code: 201
duration: 100ms
- id: 1
request:
proto: HTTP/1.1
proto_major: 1
proto_minor: 1
content_length: 0
transfer_encoding: []
trailer: {}
host: go-auth0-dev.eu.auth0.com
remote_addr: ""
request_uri: ""
body: ""
form: {}
headers:
Content-Type:
- application/json
User-Agent:
- Go-Auth0-SDK/latest
url: https://go-auth0-dev.eu.auth0.com/api/v2/device-credentials/test_credential
method: DELETE
response:
proto: HTTP/2.0
proto_major: 2
proto_minor: 0
transfer_encoding: []
trailer: {}
content_length: 0
uncompressed: false
body: ""
headers:
Content-Type:
- application/json; charset=utf-8
status: 204 No Content
code: 204
duration: 100ms
Loading

0 comments on commit 1c931a5

Please sign in to comment.