From f77f973269b39f1e2110e874a368ac759af9a0fc Mon Sep 17 00:00:00 2001 From: Piotr Roslaniec Date: Tue, 25 Jun 2024 10:55:49 +0200 Subject: [PATCH] feat(auth): set defaults for eip4361 providers --- packages/taco-auth/src/helper.ts | 10 +++++--- packages/taco-auth/src/providers/eip4361.ts | 25 ++++++++++++++----- packages/taco-auth/test/taco-auth.test.ts | 4 +-- packages/taco/test/conditions/context.test.ts | 4 +-- packages/test-utils/src/variables.ts | 5 ++++ 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/packages/taco-auth/src/helper.ts b/packages/taco-auth/src/helper.ts index 864dd4952..22d94a0ad 100644 --- a/packages/taco-auth/src/helper.ts +++ b/packages/taco-auth/src/helper.ts @@ -1,12 +1,16 @@ import {ethers} from "ethers"; -import { EIP4361AuthProvider } from './providers/eip4361'; +import { EIP4361AuthProvider, EIP4361AuthProviderParams } from './providers/eip4361'; import { EIP712AuthProvider } from './providers/eip712'; import { AuthProviders, EIP4361_AUTH_METHOD, EIP712_AUTH_METHOD } from './types'; -export const makeAuthProviders = (provider: ethers.providers.Provider, signer?: ethers.Signer): AuthProviders => { +export const makeAuthProviders = ( + provider: ethers.providers.Provider, + signer?: ethers.Signer, + siweDefaultParams?: EIP4361AuthProviderParams +): AuthProviders => { return { [EIP712_AUTH_METHOD]: signer ? new EIP712AuthProvider(provider, signer) : undefined, - [EIP4361_AUTH_METHOD]: signer ? new EIP4361AuthProvider(provider, signer) : undefined + [EIP4361_AUTH_METHOD]: signer ? new EIP4361AuthProvider(provider, signer, siweDefaultParams) : undefined } as AuthProviders; }; diff --git a/packages/taco-auth/src/providers/eip4361.ts b/packages/taco-auth/src/providers/eip4361.ts index db35aee7f..48c3fc1a0 100644 --- a/packages/taco-auth/src/providers/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361.ts @@ -6,6 +6,13 @@ import { AuthSignature, EIP4361_AUTH_METHOD } from '../types'; export type EIP4361TypedData = string; +export type EIP4361AuthProviderParams = { + domain: string; + uri: string; +} + +const ERR_MISSING_SIWE_PARAMETERS = 'Missing default SIWE parameters'; + export class EIP4361AuthProvider { private readonly storage: LocalStorage; @@ -13,6 +20,7 @@ export class EIP4361AuthProvider { // TODO: We only need the provider to fetch the chainId, consider removing it private readonly provider: ethers.providers.Provider, private readonly signer: ethers.Signer, + private readonly providerParams?: EIP4361AuthProviderParams, ) { this.storage = new LocalStorage(); } @@ -55,7 +63,10 @@ export class EIP4361AuthProvider { } // TODO: Create a facility to set these parameters or expose them to the user - private getParametersOrDefault() { + private getParametersOrDefault(): { + domain: string; + uri: string; + } { // If we are in a browser environment, we can get the domain and uri from the window object if (typeof window !== 'undefined') { const maybeOrigin = window?.location?.origin; @@ -64,10 +75,12 @@ export class EIP4361AuthProvider { uri: maybeOrigin, }; } - // TODO: Add a facility to manage this case - return { - domain: 'localhost', - uri: 'http://localhost:3000', - }; + if (this.providerParams) { + return { + domain: this.providerParams.domain, + uri: this.providerParams.uri, + } + } + throw new Error(ERR_MISSING_SIWE_PARAMETERS); } } diff --git a/packages/taco-auth/test/taco-auth.test.ts b/packages/taco-auth/test/taco-auth.test.ts index 80e4da215..7cf7d0175 100644 --- a/packages/taco-auth/test/taco-auth.test.ts +++ b/packages/taco-auth/test/taco-auth.test.ts @@ -1,7 +1,7 @@ import { bobSecretKeyBytes, fakeProvider, - fakeSigner, + fakeSigner, TEST_SIWE_PARAMS, } from '@nucypher/test-utils'; import { SiweMessage } from 'siwe'; import { describe, expect, it } from 'vitest'; @@ -43,7 +43,7 @@ describe('taco authorization', () => { const provider = fakeProvider(bobSecretKeyBytes); const signer = fakeSigner(bobSecretKeyBytes); - const eip4361Provider = new EIP4361AuthProvider(provider, signer); + const eip4361Provider = new EIP4361AuthProvider(provider, signer, TEST_SIWE_PARAMS); const typedSignature = await eip4361Provider.getOrCreateAuthSignature(); expect(typedSignature.signature).toBeDefined(); expect(typedSignature.address).toEqual(await signer.getAddress()); diff --git a/packages/taco/test/conditions/context.test.ts b/packages/taco/test/conditions/context.test.ts index 7b17d16f2..a48aa7e45 100644 --- a/packages/taco/test/conditions/context.test.ts +++ b/packages/taco/test/conditions/context.test.ts @@ -11,7 +11,7 @@ import { USER_ADDRESS_PARAM_EIP4361, USER_ADDRESS_PARAM_EIP712 } from "@nucypher/taco-auth"; -import {fakeAuthProviders, fakeProvider, fakeSigner} from '@nucypher/test-utils'; +import { fakeAuthProviders, fakeProvider, fakeSigner, TEST_SIWE_PARAMS } from '@nucypher/test-utils'; import { ethers } from 'ethers'; import { beforeAll, describe, expect, it, vi } from 'vitest'; @@ -314,7 +314,7 @@ describe('No authentication provider', () => { await initialize(); provider = fakeProvider(); signer = fakeSigner(); - authProviders = makeAuthProviders(provider, signer); + authProviders = makeAuthProviders(provider, signer, TEST_SIWE_PARAMS); }); it('throws an error if there is no auth provider', () => { diff --git a/packages/test-utils/src/variables.ts b/packages/test-utils/src/variables.ts index 85da75d92..462f56609 100644 --- a/packages/test-utils/src/variables.ts +++ b/packages/test-utils/src/variables.ts @@ -14,3 +14,8 @@ export const TEST_CONTRACT_ADDR = '0x0000000000000000000000000000000000000001'; export const TEST_CONTRACT_ADDR_2 = '0x0000000000000000000000000000000000000002'; export const TEST_CHAIN_ID = ChainId.SEPOLIA; + +export const TEST_SIWE_PARAMS = { + domain: 'localhost', + uri: 'http://localhost:3000', +};