Non-custody 2/2: customer login and delegated wallets
Give your users ownership and power to use their wallets directly.
1
Clone the example
git clone https://github.com/dfns/dfns-sdk-ts.git --no-checkout
cd dfns-sdk-ts
git sparse-checkout set examples/sdk/nextjs-delegated
git checkout m
cd examples/sdk/nextjs-delegated/ transpilePackages: ['@dfns/sdk-browser'],npm i && npm remove @dfns/sdk @dfns/sdk-browser @dfns/sdk-keysigner && npm i @dfns/sdk @dfns/sdk-browser @dfns/sdk-keysigner3
Service account action signing
export const apiClient = (authToken?: string) => {
const signer = new AsymmetricKeySigner({
credId: process.env.DFNS_CRED_ID!,
privateKey: process.env.DFNS_PRIVATE_KEY!.replace(/\\n/g, '\n'),
})
return new DfnsApiClient({
orgId: process.env.DFNS_ORG_ID!,
authToken: authToken ?? process.env.DFNS_AUTH_TOKEN!,
baseUrl: process.env.DFNS_API_URL!,
signer,
})
}4
Delegated registration
const client = apiClient()
const challenge = await client.auth.createDelegatedRegistrationChallenge({
body: { kind: 'EndUser', email: username },
})import { WebAuthnSigner } from '@dfns/sdk-browser'
[...]
const attestation = await webauthn.create(challenge) const client = apiClient(temporaryAuthenticationToken)
const registration = await client.auth.registerEndUser({
body: {
...signedChallenge,
wallets: [{ network: 'EthereumSepolia' }],
},
})5
6
Delegated calls to the API
export const delegatedClient = (authToken: string) => {
return new DfnsDelegatedApiClient({
orgId: process.env.DFNS_ORG_ID!,
authToken,
baseUrl: process.env.DFNS_API_URL!,
})
}const client = delegatedClient(authToken) // end user token here
[...]
const challenge = await client.wallets.generateSignatureInit({ walletId, body })
import { WebAuthnSigner } from '@dfns/sdk-browser'
[...]
const attestation = await webauthn.sign(challenge)const client = delegatedClient(authToken)
[...]
const signature = await client.wallets.generateSignatureComplete(
{
walletId,
body: requestBody,
},
signedChallenge
)Last updated