@nucypher/taco-auth 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +675 -0
  2. package/README.md +3 -0
  3. package/dist/cjs/auth-provider.d.ts +12 -0
  4. package/dist/cjs/auth-provider.js +9 -0
  5. package/dist/cjs/auth-provider.js.map +1 -0
  6. package/dist/cjs/auth-sig.d.ts +18 -0
  7. package/dist/cjs/auth-sig.js +14 -0
  8. package/dist/cjs/auth-sig.js.map +1 -0
  9. package/dist/cjs/index.d.ts +3 -0
  10. package/dist/cjs/index.js +20 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/providers/eip4361.d.ts +18 -0
  13. package/dist/cjs/providers/eip4361.js +85 -0
  14. package/dist/cjs/providers/eip4361.js.map +1 -0
  15. package/dist/cjs/providers/external-eip4361.d.ts +9 -0
  16. package/dist/cjs/providers/external-eip4361.js +34 -0
  17. package/dist/cjs/providers/external-eip4361.js.map +1 -0
  18. package/dist/cjs/providers/index.d.ts +2 -0
  19. package/dist/cjs/providers/index.js +19 -0
  20. package/dist/cjs/providers/index.js.map +1 -0
  21. package/dist/cjs/storage.d.ts +7 -0
  22. package/dist/cjs/storage.js +43 -0
  23. package/dist/cjs/storage.js.map +1 -0
  24. package/dist/es/auth-provider.d.ts +12 -0
  25. package/dist/es/auth-provider.js +6 -0
  26. package/dist/es/auth-provider.js.map +1 -0
  27. package/dist/es/auth-sig.d.ts +18 -0
  28. package/dist/es/auth-sig.js +11 -0
  29. package/dist/es/auth-sig.js.map +1 -0
  30. package/dist/es/index.d.ts +3 -0
  31. package/dist/es/index.js +4 -0
  32. package/dist/es/index.js.map +1 -0
  33. package/dist/es/providers/eip4361.d.ts +18 -0
  34. package/dist/es/providers/eip4361.js +81 -0
  35. package/dist/es/providers/eip4361.js.map +1 -0
  36. package/dist/es/providers/external-eip4361.d.ts +9 -0
  37. package/dist/es/providers/external-eip4361.js +30 -0
  38. package/dist/es/providers/external-eip4361.js.map +1 -0
  39. package/dist/es/providers/index.d.ts +2 -0
  40. package/dist/es/providers/index.js +3 -0
  41. package/dist/es/providers/index.js.map +1 -0
  42. package/dist/es/storage.d.ts +7 -0
  43. package/dist/es/storage.js +39 -0
  44. package/dist/es/storage.js.map +1 -0
  45. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  46. package/dist/tsconfig.es.tsbuildinfo +1 -0
  47. package/package.json +54 -0
@@ -0,0 +1,12 @@
1
+ import { AuthSignature } from './auth-sig';
2
+ import { EIP4361AuthProvider } from './providers';
3
+ export declare const EIP4361_AUTH_METHOD = "EIP4361";
4
+ export interface AuthProvider {
5
+ getOrCreateAuthSignature(): Promise<AuthSignature>;
6
+ }
7
+ export type AuthProviders = {
8
+ [EIP4361_AUTH_METHOD]?: EIP4361AuthProvider;
9
+ [key: string]: AuthProvider | undefined;
10
+ };
11
+ export declare const USER_ADDRESS_PARAM_DEFAULT = ":userAddress";
12
+ export declare const AUTH_METHOD_FOR_PARAM: Record<string, string>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AUTH_METHOD_FOR_PARAM = exports.USER_ADDRESS_PARAM_DEFAULT = exports.EIP4361_AUTH_METHOD = void 0;
4
+ exports.EIP4361_AUTH_METHOD = 'EIP4361';
5
+ exports.USER_ADDRESS_PARAM_DEFAULT = ':userAddress';
6
+ exports.AUTH_METHOD_FOR_PARAM = {
7
+ [exports.USER_ADDRESS_PARAM_DEFAULT]: exports.EIP4361_AUTH_METHOD,
8
+ };
9
+ //# sourceMappingURL=auth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-provider.js","sourceRoot":"","sources":["../../src/auth-provider.ts"],"names":[],"mappings":";;;AAGa,QAAA,mBAAmB,GAAG,SAAS,CAAC;AAYhC,QAAA,0BAA0B,GAAG,cAAc,CAAC;AAE5C,QAAA,qBAAqB,GAA2B;IAC3D,CAAC,kCAA0B,CAAC,EAAE,2BAAmB;CAClD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const authSignatureSchema: z.ZodObject<{
3
+ signature: z.ZodString;
4
+ address: z.ZodEffects<z.ZodString, string, string>;
5
+ scheme: z.ZodEnum<["EIP4361"]>;
6
+ typedData: z.ZodEffects<z.ZodString, string, string>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ signature: string;
9
+ address: string;
10
+ scheme: "EIP4361";
11
+ typedData: string;
12
+ }, {
13
+ signature: string;
14
+ address: string;
15
+ scheme: "EIP4361";
16
+ typedData: string;
17
+ }>;
18
+ export type AuthSignature = z.infer<typeof authSignatureSchema>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authSignatureSchema = void 0;
4
+ const shared_1 = require("@nucypher/shared");
5
+ const zod_1 = require("zod");
6
+ const auth_provider_1 = require("./auth-provider");
7
+ const providers_1 = require("./providers");
8
+ exports.authSignatureSchema = zod_1.z.object({
9
+ signature: zod_1.z.string(),
10
+ address: shared_1.EthAddressSchema,
11
+ scheme: zod_1.z.enum([auth_provider_1.EIP4361_AUTH_METHOD]),
12
+ typedData: providers_1.EIP4361TypedDataSchema,
13
+ });
14
+ //# sourceMappingURL=auth-sig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-sig.js","sourceRoot":"","sources":["../../src/auth-sig.ts"],"names":[],"mappings":";;;AAAA,6CAAoD;AACpD,6BAAwB;AAExB,mDAAsD;AACtD,2CAAqD;AAExC,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,yBAAgB;IACzB,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,mCAAmB,CAAC,CAAC;IACrC,SAAS,EAAE,kCAAsB;CAClC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './auth-provider';
2
+ export * from './auth-sig';
3
+ export * from './providers';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./auth-provider"), exports);
18
+ __exportStar(require("./auth-sig"), exports);
19
+ __exportStar(require("./providers"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,6CAA2B;AAC3B,8CAA4B"}
@@ -0,0 +1,18 @@
1
+ import { ethers } from 'ethers';
2
+ import { z } from 'zod';
3
+ import { AuthSignature } from '../auth-sig';
4
+ export declare const EIP4361TypedDataSchema: z.ZodEffects<z.ZodString, string, string>;
5
+ export type EIP4361AuthProviderParams = {
6
+ domain: string;
7
+ uri: string;
8
+ };
9
+ export declare class EIP4361AuthProvider {
10
+ private readonly provider;
11
+ private readonly signer;
12
+ private readonly storage;
13
+ private readonly providerParams;
14
+ constructor(provider: ethers.providers.Provider, signer: ethers.Signer, providerParams?: EIP4361AuthProviderParams);
15
+ private getDefaultParameters;
16
+ getOrCreateAuthSignature(): Promise<AuthSignature>;
17
+ private createSIWEAuthMessage;
18
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EIP4361AuthProvider = exports.EIP4361TypedDataSchema = void 0;
4
+ const siwe_1 = require("siwe");
5
+ const zod_1 = require("zod");
6
+ const auth_provider_1 = require("../auth-provider");
7
+ const storage_1 = require("../storage");
8
+ const isSiweMessage = (message) => {
9
+ try {
10
+ new siwe_1.SiweMessage(message);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ };
17
+ exports.EIP4361TypedDataSchema = zod_1.z
18
+ .string()
19
+ .refine(isSiweMessage, { message: 'Invalid SIWE message' });
20
+ const ERR_MISSING_SIWE_PARAMETERS = 'Missing default SIWE parameters';
21
+ class EIP4361AuthProvider {
22
+ provider;
23
+ signer;
24
+ storage;
25
+ providerParams;
26
+ constructor(
27
+ // TODO: We only need the provider to fetch the chainId, consider removing it
28
+ provider, signer, providerParams) {
29
+ this.provider = provider;
30
+ this.signer = signer;
31
+ this.storage = new storage_1.LocalStorage();
32
+ if (providerParams) {
33
+ this.providerParams = providerParams;
34
+ }
35
+ else {
36
+ this.providerParams = this.getDefaultParameters();
37
+ }
38
+ }
39
+ getDefaultParameters() {
40
+ if (typeof window !== 'undefined') {
41
+ // If we are in a browser environment, we can get the domain and uri from the window object
42
+ return {
43
+ domain: window.location?.host,
44
+ uri: window.location?.origin,
45
+ };
46
+ }
47
+ // If not, we have no choice but to throw an error
48
+ throw new Error(ERR_MISSING_SIWE_PARAMETERS);
49
+ }
50
+ async getOrCreateAuthSignature() {
51
+ const address = await this.signer.getAddress();
52
+ const storageKey = `eth-${auth_provider_1.EIP4361_AUTH_METHOD}-message-${address}`;
53
+ // If we have a signature in localStorage, return it
54
+ const maybeSignature = this.storage.getAuthSignature(storageKey);
55
+ if (maybeSignature) {
56
+ return maybeSignature;
57
+ }
58
+ // If at this point we didn't return, we need to create a new message
59
+ const authMessage = await this.createSIWEAuthMessage();
60
+ this.storage.setAuthSignature(storageKey, authMessage);
61
+ return authMessage;
62
+ }
63
+ async createSIWEAuthMessage() {
64
+ const address = await this.signer.getAddress();
65
+ const { domain, uri } = this.providerParams;
66
+ const version = '1';
67
+ const nonce = (0, siwe_1.generateNonce)();
68
+ const chainId = (await this.provider.getNetwork()).chainId;
69
+ const siweMessage = new siwe_1.SiweMessage({
70
+ domain,
71
+ address,
72
+ statement: `${domain} wants you to sign in with your Ethereum account: ${address}`,
73
+ uri,
74
+ version,
75
+ nonce,
76
+ chainId,
77
+ });
78
+ const scheme = auth_provider_1.EIP4361_AUTH_METHOD;
79
+ const message = siweMessage.prepareMessage();
80
+ const signature = await this.signer.signMessage(message);
81
+ return { signature, address, scheme, typedData: message };
82
+ }
83
+ }
84
+ exports.EIP4361AuthProvider = EIP4361AuthProvider;
85
+ //# sourceMappingURL=eip4361.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eip4361.js","sourceRoot":"","sources":["../../../src/providers/eip4361.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { AuthSignature } from '../auth-sig';
2
+ export declare class SingleSignOnEIP4361AuthProvider {
3
+ private readonly existingSiweMessage;
4
+ private readonly address;
5
+ private readonly signature;
6
+ static fromExistingSiweInfo(existingSiweMessage: string, signature: string): Promise<SingleSignOnEIP4361AuthProvider>;
7
+ private constructor();
8
+ getOrCreateAuthSignature(): Promise<AuthSignature>;
9
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SingleSignOnEIP4361AuthProvider = void 0;
4
+ const siwe_1 = require("siwe");
5
+ const auth_provider_1 = require("../auth-provider");
6
+ class SingleSignOnEIP4361AuthProvider {
7
+ existingSiweMessage;
8
+ address;
9
+ signature;
10
+ static async fromExistingSiweInfo(existingSiweMessage, signature) {
11
+ // validation
12
+ const siweMessage = new siwe_1.SiweMessage(existingSiweMessage);
13
+ await siweMessage.verify({ signature });
14
+ // create provider
15
+ const authProvider = new SingleSignOnEIP4361AuthProvider(siweMessage.prepareMessage(), siweMessage.address, signature);
16
+ return authProvider;
17
+ }
18
+ constructor(existingSiweMessage, address, signature) {
19
+ this.existingSiweMessage = existingSiweMessage;
20
+ this.address = address;
21
+ this.signature = signature;
22
+ }
23
+ async getOrCreateAuthSignature() {
24
+ const scheme = auth_provider_1.EIP4361_AUTH_METHOD;
25
+ return {
26
+ signature: this.signature,
27
+ address: this.address,
28
+ scheme,
29
+ typedData: this.existingSiweMessage,
30
+ };
31
+ }
32
+ }
33
+ exports.SingleSignOnEIP4361AuthProvider = SingleSignOnEIP4361AuthProvider;
34
+ //# sourceMappingURL=external-eip4361.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-eip4361.js","sourceRoot":"","sources":["../../../src/providers/external-eip4361.ts"],"names":[],"mappings":";;;AAAA,+BAAmC;AAEnC,oDAAuD;AAGvD,MAAa,+BAA+B;IAkBvB;IACA;IACA;IAnBZ,MAAM,CAAC,KAAK,CAAC,oBAAoB,CACtC,mBAA2B,EAC3B,SAAiB;QAEjB,aAAa;QACb,MAAM,WAAW,GAAG,IAAI,kBAAW,CAAC,mBAAmB,CAAC,CAAC;QACzD,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACxC,kBAAkB;QAClB,MAAM,YAAY,GAAG,IAAI,+BAA+B,CACtD,WAAW,CAAC,cAAc,EAAE,EAC5B,WAAW,CAAC,OAAO,EACnB,SAAS,CACV,CAAC;QACF,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,YACmB,mBAA2B,EAC3B,OAAe,EACf,SAAiB;QAFjB,wBAAmB,GAAnB,mBAAmB,CAAQ;QAC3B,YAAO,GAAP,OAAO,CAAQ;QACf,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEG,KAAK,CAAC,wBAAwB;QACnC,MAAM,MAAM,GAAG,mCAAmB,CAAC;QACnC,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,mBAAmB;SACpC,CAAC;IACJ,CAAC;CACF;AAhCD,0EAgCC"}
@@ -0,0 +1,2 @@
1
+ export * from './eip4361';
2
+ export * from './external-eip4361';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./eip4361"), exports);
18
+ __exportStar(require("./external-eip4361"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,qDAAmC"}
@@ -0,0 +1,7 @@
1
+ import { AuthSignature } from './index';
2
+ export declare class LocalStorage {
3
+ private storage;
4
+ constructor();
5
+ getAuthSignature(key: string): AuthSignature | null;
6
+ setAuthSignature(key: string, authSignature: AuthSignature): void;
7
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalStorage = void 0;
4
+ const index_1 = require("./index");
5
+ class BrowserStorage {
6
+ getItem(key) {
7
+ return localStorage.getItem(key);
8
+ }
9
+ setItem(key, value) {
10
+ localStorage.setItem(key, value);
11
+ }
12
+ }
13
+ class NodeStorage {
14
+ storage = {};
15
+ getItem(key) {
16
+ return this.storage[key] || null;
17
+ }
18
+ setItem(key, value) {
19
+ this.storage[key] = value;
20
+ }
21
+ }
22
+ class LocalStorage {
23
+ storage;
24
+ constructor() {
25
+ this.storage =
26
+ typeof localStorage === 'undefined'
27
+ ? new NodeStorage()
28
+ : new BrowserStorage();
29
+ }
30
+ getAuthSignature(key) {
31
+ const asJson = this.storage.getItem(key);
32
+ if (!asJson) {
33
+ return null;
34
+ }
35
+ return index_1.authSignatureSchema.parse(JSON.parse(asJson));
36
+ }
37
+ setAuthSignature(key, authSignature) {
38
+ const asJson = JSON.stringify(authSignature);
39
+ this.storage.setItem(key, asJson);
40
+ }
41
+ }
42
+ exports.LocalStorage = LocalStorage;
43
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":";;;AAAA,mCAA6D;AAQ7D,MAAM,cAAc;IACX,OAAO,CAAC,GAAW;QACxB,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEM,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;CACF;AAED,MAAM,WAAW;IACP,OAAO,GAA2B,EAAE,CAAC;IAEtC,OAAO,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAEM,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;CACF;AAED,MAAa,YAAY;IACf,OAAO,CAAW;IAE1B;QACE,IAAI,CAAC,OAAO;YACV,OAAO,YAAY,KAAK,WAAW;gBACjC,CAAC,CAAC,IAAI,WAAW,EAAE;gBACnB,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC;IAC7B,CAAC;IAEM,gBAAgB,CAAC,GAAW;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,2BAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAEM,gBAAgB,CAAC,GAAW,EAAE,aAA4B;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;CACF;AAtBD,oCAsBC"}
@@ -0,0 +1,12 @@
1
+ import { AuthSignature } from './auth-sig';
2
+ import { EIP4361AuthProvider } from './providers';
3
+ export declare const EIP4361_AUTH_METHOD = "EIP4361";
4
+ export interface AuthProvider {
5
+ getOrCreateAuthSignature(): Promise<AuthSignature>;
6
+ }
7
+ export type AuthProviders = {
8
+ [EIP4361_AUTH_METHOD]?: EIP4361AuthProvider;
9
+ [key: string]: AuthProvider | undefined;
10
+ };
11
+ export declare const USER_ADDRESS_PARAM_DEFAULT = ":userAddress";
12
+ export declare const AUTH_METHOD_FOR_PARAM: Record<string, string>;
@@ -0,0 +1,6 @@
1
+ export const EIP4361_AUTH_METHOD = 'EIP4361';
2
+ export const USER_ADDRESS_PARAM_DEFAULT = ':userAddress';
3
+ export const AUTH_METHOD_FOR_PARAM = {
4
+ [USER_ADDRESS_PARAM_DEFAULT]: EIP4361_AUTH_METHOD,
5
+ };
6
+ //# sourceMappingURL=auth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-provider.js","sourceRoot":"","sources":["../../src/auth-provider.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAY7C,MAAM,CAAC,MAAM,0BAA0B,GAAG,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,CAAC,0BAA0B,CAAC,EAAE,mBAAmB;CAClD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const authSignatureSchema: z.ZodObject<{
3
+ signature: z.ZodString;
4
+ address: z.ZodEffects<z.ZodString, string, string>;
5
+ scheme: z.ZodEnum<["EIP4361"]>;
6
+ typedData: z.ZodEffects<z.ZodString, string, string>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ signature: string;
9
+ address: string;
10
+ scheme: "EIP4361";
11
+ typedData: string;
12
+ }, {
13
+ signature: string;
14
+ address: string;
15
+ scheme: "EIP4361";
16
+ typedData: string;
17
+ }>;
18
+ export type AuthSignature = z.infer<typeof authSignatureSchema>;
@@ -0,0 +1,11 @@
1
+ import { EthAddressSchema } from '@nucypher/shared';
2
+ import { z } from 'zod';
3
+ import { EIP4361_AUTH_METHOD } from './auth-provider';
4
+ import { EIP4361TypedDataSchema } from './providers';
5
+ export const authSignatureSchema = z.object({
6
+ signature: z.string(),
7
+ address: EthAddressSchema,
8
+ scheme: z.enum([EIP4361_AUTH_METHOD]),
9
+ typedData: EIP4361TypedDataSchema,
10
+ });
11
+ //# sourceMappingURL=auth-sig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-sig.js","sourceRoot":"","sources":["../../src/auth-sig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,gBAAgB;IACzB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACrC,SAAS,EAAE,sBAAsB;CAClC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './auth-provider';
2
+ export * from './auth-sig';
3
+ export * from './providers';
@@ -0,0 +1,4 @@
1
+ export * from './auth-provider';
2
+ export * from './auth-sig';
3
+ export * from './providers';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { ethers } from 'ethers';
2
+ import { z } from 'zod';
3
+ import { AuthSignature } from '../auth-sig';
4
+ export declare const EIP4361TypedDataSchema: z.ZodEffects<z.ZodString, string, string>;
5
+ export type EIP4361AuthProviderParams = {
6
+ domain: string;
7
+ uri: string;
8
+ };
9
+ export declare class EIP4361AuthProvider {
10
+ private readonly provider;
11
+ private readonly signer;
12
+ private readonly storage;
13
+ private readonly providerParams;
14
+ constructor(provider: ethers.providers.Provider, signer: ethers.Signer, providerParams?: EIP4361AuthProviderParams);
15
+ private getDefaultParameters;
16
+ getOrCreateAuthSignature(): Promise<AuthSignature>;
17
+ private createSIWEAuthMessage;
18
+ }
@@ -0,0 +1,81 @@
1
+ import { generateNonce, SiweMessage } from 'siwe';
2
+ import { z } from 'zod';
3
+ import { EIP4361_AUTH_METHOD } from '../auth-provider';
4
+ import { LocalStorage } from '../storage';
5
+ const isSiweMessage = (message) => {
6
+ try {
7
+ new SiweMessage(message);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ };
14
+ export const EIP4361TypedDataSchema = z
15
+ .string()
16
+ .refine(isSiweMessage, { message: 'Invalid SIWE message' });
17
+ const ERR_MISSING_SIWE_PARAMETERS = 'Missing default SIWE parameters';
18
+ export class EIP4361AuthProvider {
19
+ provider;
20
+ signer;
21
+ storage;
22
+ providerParams;
23
+ constructor(
24
+ // TODO: We only need the provider to fetch the chainId, consider removing it
25
+ provider, signer, providerParams) {
26
+ this.provider = provider;
27
+ this.signer = signer;
28
+ this.storage = new LocalStorage();
29
+ if (providerParams) {
30
+ this.providerParams = providerParams;
31
+ }
32
+ else {
33
+ this.providerParams = this.getDefaultParameters();
34
+ }
35
+ }
36
+ getDefaultParameters() {
37
+ if (typeof window !== 'undefined') {
38
+ // If we are in a browser environment, we can get the domain and uri from the window object
39
+ return {
40
+ domain: window.location?.host,
41
+ uri: window.location?.origin,
42
+ };
43
+ }
44
+ // If not, we have no choice but to throw an error
45
+ throw new Error(ERR_MISSING_SIWE_PARAMETERS);
46
+ }
47
+ async getOrCreateAuthSignature() {
48
+ const address = await this.signer.getAddress();
49
+ const storageKey = `eth-${EIP4361_AUTH_METHOD}-message-${address}`;
50
+ // If we have a signature in localStorage, return it
51
+ const maybeSignature = this.storage.getAuthSignature(storageKey);
52
+ if (maybeSignature) {
53
+ return maybeSignature;
54
+ }
55
+ // If at this point we didn't return, we need to create a new message
56
+ const authMessage = await this.createSIWEAuthMessage();
57
+ this.storage.setAuthSignature(storageKey, authMessage);
58
+ return authMessage;
59
+ }
60
+ async createSIWEAuthMessage() {
61
+ const address = await this.signer.getAddress();
62
+ const { domain, uri } = this.providerParams;
63
+ const version = '1';
64
+ const nonce = generateNonce();
65
+ const chainId = (await this.provider.getNetwork()).chainId;
66
+ const siweMessage = new SiweMessage({
67
+ domain,
68
+ address,
69
+ statement: `${domain} wants you to sign in with your Ethereum account: ${address}`,
70
+ uri,
71
+ version,
72
+ nonce,
73
+ chainId,
74
+ });
75
+ const scheme = EIP4361_AUTH_METHOD;
76
+ const message = siweMessage.prepareMessage();
77
+ const signature = await this.signer.signMessage(message);
78
+ return { signature, address, scheme, typedData: message };
79
+ }
80
+ }
81
+ //# sourceMappingURL=eip4361.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eip4361.js","sourceRoot":"","sources":["../../../src/providers/eip4361.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,aAAa,GAAG,CAAC,OAAe,EAAW,EAAE;IACjD,IAAI,CAAC;QACH,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,EAAE;KACR,MAAM,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;AAO9D,MAAM,2BAA2B,GAAG,iCAAiC,CAAC;AAEtE,MAAM,OAAO,mBAAmB;IAMX;IACA;IANF,OAAO,CAAe;IACtB,cAAc,CAA4B;IAE3D;IACE,6EAA6E;IAC5D,QAAmC,EACnC,MAAqB,EACtC,cAA0C;QAFzB,aAAQ,GAAR,QAAQ,CAA2B;QACnC,WAAM,GAAN,MAAM,CAAe;QAGtC,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC1B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,2FAA2F;YAC3F,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI;gBAC7B,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM;aAC7B,CAAC;QACJ,CAAC;QACD,kDAAkD;QAClD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,wBAAwB;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,OAAO,mBAAmB,YAAY,OAAO,EAAE,CAAC;QAEnE,oDAAoD;QACpD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,qEAAqE;QACrE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACvD,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC;QACpB,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;YAClC,MAAM;YACN,OAAO;YACP,SAAS,EAAE,GAAG,MAAM,qDAAqD,OAAO,EAAE;YAClF,GAAG;YACH,OAAO;YACP,KAAK;YACL,OAAO;SACR,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACnC,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAC5D,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { AuthSignature } from '../auth-sig';
2
+ export declare class SingleSignOnEIP4361AuthProvider {
3
+ private readonly existingSiweMessage;
4
+ private readonly address;
5
+ private readonly signature;
6
+ static fromExistingSiweInfo(existingSiweMessage: string, signature: string): Promise<SingleSignOnEIP4361AuthProvider>;
7
+ private constructor();
8
+ getOrCreateAuthSignature(): Promise<AuthSignature>;
9
+ }
@@ -0,0 +1,30 @@
1
+ import { SiweMessage } from 'siwe';
2
+ import { EIP4361_AUTH_METHOD } from '../auth-provider';
3
+ export class SingleSignOnEIP4361AuthProvider {
4
+ existingSiweMessage;
5
+ address;
6
+ signature;
7
+ static async fromExistingSiweInfo(existingSiweMessage, signature) {
8
+ // validation
9
+ const siweMessage = new SiweMessage(existingSiweMessage);
10
+ await siweMessage.verify({ signature });
11
+ // create provider
12
+ const authProvider = new SingleSignOnEIP4361AuthProvider(siweMessage.prepareMessage(), siweMessage.address, signature);
13
+ return authProvider;
14
+ }
15
+ constructor(existingSiweMessage, address, signature) {
16
+ this.existingSiweMessage = existingSiweMessage;
17
+ this.address = address;
18
+ this.signature = signature;
19
+ }
20
+ async getOrCreateAuthSignature() {
21
+ const scheme = EIP4361_AUTH_METHOD;
22
+ return {
23
+ signature: this.signature,
24
+ address: this.address,
25
+ scheme,
26
+ typedData: this.existingSiweMessage,
27
+ };
28
+ }
29
+ }
30
+ //# sourceMappingURL=external-eip4361.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-eip4361.js","sourceRoot":"","sources":["../../../src/providers/external-eip4361.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,OAAO,+BAA+B;IAkBvB;IACA;IACA;IAnBZ,MAAM,CAAC,KAAK,CAAC,oBAAoB,CACtC,mBAA2B,EAC3B,SAAiB;QAEjB,aAAa;QACb,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,CAAC;QACzD,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACxC,kBAAkB;QAClB,MAAM,YAAY,GAAG,IAAI,+BAA+B,CACtD,WAAW,CAAC,cAAc,EAAE,EAC5B,WAAW,CAAC,OAAO,EACnB,SAAS,CACV,CAAC;QACF,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,YACmB,mBAA2B,EAC3B,OAAe,EACf,SAAiB;QAFjB,wBAAmB,GAAnB,mBAAmB,CAAQ;QAC3B,YAAO,GAAP,OAAO,CAAQ;QACf,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEG,KAAK,CAAC,wBAAwB;QACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACnC,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,mBAAmB;SACpC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export * from './eip4361';
2
+ export * from './external-eip4361';
@@ -0,0 +1,3 @@
1
+ export * from './eip4361';
2
+ export * from './external-eip4361';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { AuthSignature } from './index';
2
+ export declare class LocalStorage {
3
+ private storage;
4
+ constructor();
5
+ getAuthSignature(key: string): AuthSignature | null;
6
+ setAuthSignature(key: string, authSignature: AuthSignature): void;
7
+ }
@@ -0,0 +1,39 @@
1
+ import { authSignatureSchema } from './index';
2
+ class BrowserStorage {
3
+ getItem(key) {
4
+ return localStorage.getItem(key);
5
+ }
6
+ setItem(key, value) {
7
+ localStorage.setItem(key, value);
8
+ }
9
+ }
10
+ class NodeStorage {
11
+ storage = {};
12
+ getItem(key) {
13
+ return this.storage[key] || null;
14
+ }
15
+ setItem(key, value) {
16
+ this.storage[key] = value;
17
+ }
18
+ }
19
+ export class LocalStorage {
20
+ storage;
21
+ constructor() {
22
+ this.storage =
23
+ typeof localStorage === 'undefined'
24
+ ? new NodeStorage()
25
+ : new BrowserStorage();
26
+ }
27
+ getAuthSignature(key) {
28
+ const asJson = this.storage.getItem(key);
29
+ if (!asJson) {
30
+ return null;
31
+ }
32
+ return authSignatureSchema.parse(JSON.parse(asJson));
33
+ }
34
+ setAuthSignature(key, authSignature) {
35
+ const asJson = JSON.stringify(authSignature);
36
+ this.storage.setItem(key, asJson);
37
+ }
38
+ }
39
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAQ7D,MAAM,cAAc;IACX,OAAO,CAAC,GAAW;QACxB,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEM,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;CACF;AAED,MAAM,WAAW;IACP,OAAO,GAA2B,EAAE,CAAC;IAEtC,OAAO,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAEM,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IACf,OAAO,CAAW;IAE1B;QACE,IAAI,CAAC,OAAO;YACV,OAAO,YAAY,KAAK,WAAW;gBACjC,CAAC,CAAC,IAAI,WAAW,EAAE;gBACnB,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC;IAC7B,CAAC;IAEM,gBAAgB,CAAC,GAAW;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAEM,gBAAgB,CAAC,GAAW,EAAE,aAA4B;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;CACF"}