@originals/auth 1.8.2 → 1.8.3
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.
- package/{src/client/index.ts → dist/client/index.d.ts} +2 -15
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +23 -0
- package/dist/client/index.js.map +1 -0
- package/{src/client/server-auth.ts → dist/client/server-auth.d.ts} +5 -45
- package/dist/client/server-auth.d.ts.map +1 -0
- package/dist/client/server-auth.js +77 -0
- package/dist/client/server-auth.js.map +1 -0
- package/dist/client/turnkey-client.d.ts +59 -0
- package/dist/client/turnkey-client.d.ts.map +1 -0
- package/dist/client/turnkey-client.js +279 -0
- package/dist/client/turnkey-client.js.map +1 -0
- package/dist/client/turnkey-did-signer.d.ts +58 -0
- package/dist/client/turnkey-did-signer.d.ts.map +1 -0
- package/dist/client/turnkey-did-signer.js +131 -0
- package/dist/client/turnkey-did-signer.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/{src/index.ts → dist/index.js} +1 -6
- package/dist/index.js.map +1 -0
- package/dist/server/email-auth.d.ts +42 -0
- package/dist/server/email-auth.d.ts.map +1 -0
- package/dist/server/email-auth.js +187 -0
- package/dist/server/email-auth.js.map +1 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.d.ts.map +1 -0
- package/{src/server/index.ts → dist/server/index.js} +3 -23
- package/dist/server/index.js.map +1 -0
- package/dist/server/jwt.d.ts +49 -0
- package/dist/server/jwt.d.ts.map +1 -0
- package/dist/server/jwt.js +113 -0
- package/dist/server/jwt.js.map +1 -0
- package/dist/server/middleware.d.ts +39 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +112 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/turnkey-client.d.ts +24 -0
- package/dist/server/turnkey-client.d.ts.map +1 -0
- package/dist/server/turnkey-client.js +118 -0
- package/dist/server/turnkey-client.js.map +1 -0
- package/dist/server/turnkey-signer.d.ts +40 -0
- package/dist/server/turnkey-signer.d.ts.map +1 -0
- package/dist/server/turnkey-signer.js +121 -0
- package/dist/server/turnkey-signer.js.map +1 -0
- package/dist/types.d.ts +155 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +13 -12
- package/src/client/turnkey-client.ts +0 -364
- package/src/client/turnkey-did-signer.ts +0 -203
- package/src/server/email-auth.ts +0 -258
- package/src/server/jwt.ts +0 -154
- package/src/server/middleware.ts +0 -142
- package/src/server/turnkey-client.ts +0 -156
- package/src/server/turnkey-signer.ts +0 -170
- package/src/types.ts +0 -172
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/server/jwt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express authentication middleware factory
|
|
3
|
+
*/
|
|
4
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
5
|
+
import type { AuthMiddlewareOptions } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Create an authentication middleware for Express
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { createAuthMiddleware } from '@originals/auth/server';
|
|
12
|
+
*
|
|
13
|
+
* const authenticateUser = createAuthMiddleware({
|
|
14
|
+
* getUserByTurnkeyId: async (turnkeyId) => {
|
|
15
|
+
* return db.query.users.findFirst({
|
|
16
|
+
* where: eq(users.turnkeySubOrgId, turnkeyId)
|
|
17
|
+
* });
|
|
18
|
+
* },
|
|
19
|
+
* createUser: async (turnkeyId, email, temporaryDid) => {
|
|
20
|
+
* return db.insert(users).values({
|
|
21
|
+
* turnkeySubOrgId: turnkeyId,
|
|
22
|
+
* email,
|
|
23
|
+
* did: temporaryDid,
|
|
24
|
+
* }).returning().then(rows => rows[0]);
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* app.get('/api/protected', authenticateUser, (req, res) => {
|
|
29
|
+
* res.json({ user: req.user });
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function createAuthMiddleware(options: AuthMiddlewareOptions): (req: Request, res: Response, next: NextFunction) => Promise<void | Response>;
|
|
34
|
+
/**
|
|
35
|
+
* Optional authentication middleware - doesn't fail if not authenticated
|
|
36
|
+
* Attaches user to request if valid token exists, otherwise continues without user
|
|
37
|
+
*/
|
|
38
|
+
export declare function createOptionalAuthMiddleware(options: AuthMiddlewareOptions): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
39
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAkC,MAAM,UAAU,CAAC;AAEtF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAsD/E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,qBAAqB,GAC7B,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAmCpE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express authentication middleware factory
|
|
3
|
+
*/
|
|
4
|
+
import { verifyToken } from './jwt.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create an authentication middleware for Express
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { createAuthMiddleware } from '@originals/auth/server';
|
|
11
|
+
*
|
|
12
|
+
* const authenticateUser = createAuthMiddleware({
|
|
13
|
+
* getUserByTurnkeyId: async (turnkeyId) => {
|
|
14
|
+
* return db.query.users.findFirst({
|
|
15
|
+
* where: eq(users.turnkeySubOrgId, turnkeyId)
|
|
16
|
+
* });
|
|
17
|
+
* },
|
|
18
|
+
* createUser: async (turnkeyId, email, temporaryDid) => {
|
|
19
|
+
* return db.insert(users).values({
|
|
20
|
+
* turnkeySubOrgId: turnkeyId,
|
|
21
|
+
* email,
|
|
22
|
+
* did: temporaryDid,
|
|
23
|
+
* }).returning().then(rows => rows[0]);
|
|
24
|
+
* }
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* app.get('/api/protected', authenticateUser, (req, res) => {
|
|
28
|
+
* res.json({ user: req.user });
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function createAuthMiddleware(options) {
|
|
33
|
+
const cookieName = options.cookieName ?? 'auth_token';
|
|
34
|
+
return async (req, res, next) => {
|
|
35
|
+
try {
|
|
36
|
+
// Get JWT token from HTTP-only cookie
|
|
37
|
+
const cookies = req.cookies;
|
|
38
|
+
const token = cookies?.[cookieName];
|
|
39
|
+
if (!token) {
|
|
40
|
+
return res.status(401).json({ error: 'Not authenticated' });
|
|
41
|
+
}
|
|
42
|
+
// Verify JWT token
|
|
43
|
+
const payload = verifyToken(token, { secret: options.jwtSecret });
|
|
44
|
+
const turnkeySubOrgId = payload.sub;
|
|
45
|
+
const email = payload.email;
|
|
46
|
+
// Check if user already exists
|
|
47
|
+
let user = await options.getUserByTurnkeyId(turnkeySubOrgId);
|
|
48
|
+
// If user doesn't exist and createUser is provided, create user
|
|
49
|
+
if (!user && options.createUser) {
|
|
50
|
+
console.log(`Creating user record for ${email}...`);
|
|
51
|
+
// Use temporary DID as placeholder until user creates real DID
|
|
52
|
+
const temporaryDid = `temp:turnkey:${turnkeySubOrgId}`;
|
|
53
|
+
user = await options.createUser(turnkeySubOrgId, email, temporaryDid);
|
|
54
|
+
console.log(`✅ User created: ${email}`);
|
|
55
|
+
console.log(` Turnkey sub-org ID: ${turnkeySubOrgId}`);
|
|
56
|
+
console.log(` Temporary DID: ${temporaryDid}`);
|
|
57
|
+
}
|
|
58
|
+
if (!user) {
|
|
59
|
+
return res.status(401).json({ error: 'User not found' });
|
|
60
|
+
}
|
|
61
|
+
// Add user info to request
|
|
62
|
+
req.user = {
|
|
63
|
+
id: user.id,
|
|
64
|
+
turnkeySubOrgId,
|
|
65
|
+
email,
|
|
66
|
+
did: user.did,
|
|
67
|
+
sessionToken: payload.sessionToken,
|
|
68
|
+
};
|
|
69
|
+
next();
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('Authentication error:', error);
|
|
73
|
+
return res.status(401).json({ error: 'Invalid or expired token' });
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Optional authentication middleware - doesn't fail if not authenticated
|
|
79
|
+
* Attaches user to request if valid token exists, otherwise continues without user
|
|
80
|
+
*/
|
|
81
|
+
export function createOptionalAuthMiddleware(options) {
|
|
82
|
+
const cookieName = options.cookieName ?? 'auth_token';
|
|
83
|
+
return async (req, res, next) => {
|
|
84
|
+
try {
|
|
85
|
+
const cookies = req.cookies;
|
|
86
|
+
const token = cookies?.[cookieName];
|
|
87
|
+
if (!token) {
|
|
88
|
+
next();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const payload = verifyToken(token, { secret: options.jwtSecret });
|
|
92
|
+
const turnkeySubOrgId = payload.sub;
|
|
93
|
+
const email = payload.email;
|
|
94
|
+
const user = await options.getUserByTurnkeyId(turnkeySubOrgId);
|
|
95
|
+
if (user) {
|
|
96
|
+
req.user = {
|
|
97
|
+
id: user.id,
|
|
98
|
+
turnkeySubOrgId,
|
|
99
|
+
email,
|
|
100
|
+
did: user.did,
|
|
101
|
+
sessionToken: payload.sessionToken,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
next();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Token invalid or expired, continue without user
|
|
108
|
+
next();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side Turnkey client utilities
|
|
3
|
+
*/
|
|
4
|
+
import { Turnkey } from '@turnkey/sdk-server';
|
|
5
|
+
export interface TurnkeyClientConfig {
|
|
6
|
+
/** Turnkey API base URL (default: https://api.turnkey.com) */
|
|
7
|
+
apiBaseUrl?: string;
|
|
8
|
+
/** Turnkey API public key */
|
|
9
|
+
apiPublicKey: string;
|
|
10
|
+
/** Turnkey API private key */
|
|
11
|
+
apiPrivateKey: string;
|
|
12
|
+
/** Default organization ID */
|
|
13
|
+
organizationId: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a Turnkey server client
|
|
17
|
+
*/
|
|
18
|
+
export declare function createTurnkeyClient(config?: Partial<TurnkeyClientConfig>): Turnkey;
|
|
19
|
+
/**
|
|
20
|
+
* Get or create a Turnkey sub-organization for a user
|
|
21
|
+
* Creates sub-org with email-only root user and required wallet accounts
|
|
22
|
+
*/
|
|
23
|
+
export declare function getOrCreateTurnkeySubOrg(email: string, turnkeyClient: Turnkey): Promise<string>;
|
|
24
|
+
//# sourceMappingURL=turnkey-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnkey-client.d.ts","sourceRoot":"","sources":["../../src/server/turnkey-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAqBlF;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,MAAM,CAAC,CAkGjB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side Turnkey client utilities
|
|
3
|
+
*/
|
|
4
|
+
import { Turnkey } from '@turnkey/sdk-server';
|
|
5
|
+
/**
|
|
6
|
+
* Create a Turnkey server client
|
|
7
|
+
*/
|
|
8
|
+
export function createTurnkeyClient(config) {
|
|
9
|
+
const apiPublicKey = config?.apiPublicKey ?? process.env.TURNKEY_API_PUBLIC_KEY;
|
|
10
|
+
const apiPrivateKey = config?.apiPrivateKey ?? process.env.TURNKEY_API_PRIVATE_KEY;
|
|
11
|
+
const organizationId = config?.organizationId ?? process.env.TURNKEY_ORGANIZATION_ID;
|
|
12
|
+
if (!apiPublicKey) {
|
|
13
|
+
throw new Error('TURNKEY_API_PUBLIC_KEY is required');
|
|
14
|
+
}
|
|
15
|
+
if (!apiPrivateKey) {
|
|
16
|
+
throw new Error('TURNKEY_API_PRIVATE_KEY is required');
|
|
17
|
+
}
|
|
18
|
+
if (!organizationId) {
|
|
19
|
+
throw new Error('TURNKEY_ORGANIZATION_ID is required');
|
|
20
|
+
}
|
|
21
|
+
return new Turnkey({
|
|
22
|
+
apiBaseUrl: config?.apiBaseUrl ?? 'https://api.turnkey.com',
|
|
23
|
+
apiPublicKey,
|
|
24
|
+
apiPrivateKey,
|
|
25
|
+
defaultOrganizationId: organizationId,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get or create a Turnkey sub-organization for a user
|
|
30
|
+
* Creates sub-org with email-only root user and required wallet accounts
|
|
31
|
+
*/
|
|
32
|
+
export async function getOrCreateTurnkeySubOrg(email, turnkeyClient) {
|
|
33
|
+
const organizationId = process.env.TURNKEY_ORGANIZATION_ID;
|
|
34
|
+
if (!organizationId) {
|
|
35
|
+
throw new Error('TURNKEY_ORGANIZATION_ID is required');
|
|
36
|
+
}
|
|
37
|
+
// Generate a consistent base name for lookup
|
|
38
|
+
const baseSubOrgName = `user-${email.replace(/[^a-z0-9]/gi, '-').toLowerCase()}`;
|
|
39
|
+
console.log(`🔍 Checking for existing sub-organization for ${email}...`);
|
|
40
|
+
try {
|
|
41
|
+
// Try to get existing sub-organizations by email filter
|
|
42
|
+
const subOrgs = await turnkeyClient.apiClient().getSubOrgIds({
|
|
43
|
+
organizationId,
|
|
44
|
+
filterType: 'EMAIL',
|
|
45
|
+
filterValue: email,
|
|
46
|
+
});
|
|
47
|
+
const subOrgIds = subOrgs.organizationIds || [];
|
|
48
|
+
const existingSubOrgId = subOrgIds.length > 0 ? subOrgIds[0] : null;
|
|
49
|
+
if (existingSubOrgId) {
|
|
50
|
+
console.log(`✅ Found existing sub-organization: ${existingSubOrgId}`);
|
|
51
|
+
// Check if this sub-org has a wallet
|
|
52
|
+
try {
|
|
53
|
+
const walletsCheck = await turnkeyClient.apiClient().getWallets({
|
|
54
|
+
organizationId: existingSubOrgId,
|
|
55
|
+
});
|
|
56
|
+
const walletCount = walletsCheck.wallets?.length || 0;
|
|
57
|
+
if (walletCount > 0) {
|
|
58
|
+
return existingSubOrgId;
|
|
59
|
+
}
|
|
60
|
+
console.log(`⚠️ Sub-org has no wallet, creating new sub-org with wallet...`);
|
|
61
|
+
}
|
|
62
|
+
catch (walletCheckErr) {
|
|
63
|
+
console.error('Could not check wallet in sub-org:', walletCheckErr);
|
|
64
|
+
return existingSubOrgId;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
console.log(`📝 No existing sub-org found, will create new one`);
|
|
70
|
+
}
|
|
71
|
+
// Generate a unique name for the new sub-org
|
|
72
|
+
const subOrgName = `${baseSubOrgName}-${Date.now()}`;
|
|
73
|
+
console.log(`📧 Creating new Turnkey sub-organization for ${email}...`);
|
|
74
|
+
// Create sub-organization with wallet containing required keys
|
|
75
|
+
const result = await turnkeyClient.apiClient().createSubOrganization({
|
|
76
|
+
subOrganizationName: subOrgName,
|
|
77
|
+
rootUsers: [
|
|
78
|
+
{
|
|
79
|
+
userName: email,
|
|
80
|
+
userEmail: email,
|
|
81
|
+
apiKeys: [],
|
|
82
|
+
authenticators: [],
|
|
83
|
+
oauthProviders: [],
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
rootQuorumThreshold: 1,
|
|
87
|
+
wallet: {
|
|
88
|
+
walletName: 'default-wallet',
|
|
89
|
+
accounts: [
|
|
90
|
+
{
|
|
91
|
+
curve: 'CURVE_SECP256K1',
|
|
92
|
+
pathFormat: 'PATH_FORMAT_BIP32',
|
|
93
|
+
path: "m/44'/0'/0'/0/0", // Bitcoin path for auth-key
|
|
94
|
+
addressFormat: 'ADDRESS_FORMAT_ETHEREUM',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
curve: 'CURVE_ED25519',
|
|
98
|
+
pathFormat: 'PATH_FORMAT_BIP32',
|
|
99
|
+
path: "m/44'/501'/0'/0'", // Ed25519 for assertion-key
|
|
100
|
+
addressFormat: 'ADDRESS_FORMAT_SOLANA',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
curve: 'CURVE_ED25519',
|
|
104
|
+
pathFormat: 'PATH_FORMAT_BIP32',
|
|
105
|
+
path: "m/44'/501'/1'/0'", // Ed25519 for update-key
|
|
106
|
+
addressFormat: 'ADDRESS_FORMAT_SOLANA',
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
const subOrgId = result.activity?.result?.createSubOrganizationResultV7?.subOrganizationId;
|
|
112
|
+
if (!subOrgId) {
|
|
113
|
+
throw new Error('No sub-organization ID returned from Turnkey');
|
|
114
|
+
}
|
|
115
|
+
console.log(`✅ Created sub-organization: ${subOrgId}`);
|
|
116
|
+
return subOrgId;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=turnkey-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnkey-client.js","sourceRoot":"","sources":["../../src/server/turnkey-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turnkey Signer - Integration between Turnkey key management and Originals SDK
|
|
3
|
+
*
|
|
4
|
+
* Provides an ExternalSigner implementation that works with Turnkey-managed
|
|
5
|
+
* keys for use with the Originals SDK's DID creation and signing operations.
|
|
6
|
+
*/
|
|
7
|
+
import { Turnkey } from '@turnkey/sdk-server';
|
|
8
|
+
import { ExternalSigner, ExternalVerifier } from '@originals/sdk';
|
|
9
|
+
/**
|
|
10
|
+
* Turnkey-based signer for use with Originals SDK
|
|
11
|
+
* Implements the ExternalSigner and ExternalVerifier interfaces
|
|
12
|
+
*/
|
|
13
|
+
export declare class TurnkeyWebVHSigner implements ExternalSigner, ExternalVerifier {
|
|
14
|
+
private subOrgId;
|
|
15
|
+
private keyId;
|
|
16
|
+
private publicKeyMultibase;
|
|
17
|
+
private turnkeyClient;
|
|
18
|
+
private verificationMethodId;
|
|
19
|
+
constructor(subOrgId: string, keyId: string, publicKeyMultibase: string, turnkeyClient: Turnkey, verificationMethodId: string);
|
|
20
|
+
/**
|
|
21
|
+
* Sign data using Turnkey's API
|
|
22
|
+
*/
|
|
23
|
+
sign(input: {
|
|
24
|
+
document: Record<string, unknown>;
|
|
25
|
+
proof: Record<string, unknown>;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
proofValue: string;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Verify a signature
|
|
31
|
+
*/
|
|
32
|
+
verify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): Promise<boolean>;
|
|
33
|
+
getVerificationMethodId(): string;
|
|
34
|
+
getPublicKeyMultibase(): string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a Turnkey signer for use with the Originals SDK
|
|
38
|
+
*/
|
|
39
|
+
export declare function createTurnkeySigner(subOrgId: string, keyId: string, turnkeyClient: Turnkey, verificationMethodId: string, publicKeyMultibase: string): TurnkeyWebVHSigner;
|
|
40
|
+
//# sourceMappingURL=turnkey-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnkey-signer.d.ts","sourceRoot":"","sources":["../../src/server/turnkey-signer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAA0B,MAAM,gBAAgB,CAAC;AAwB1F;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,cAAc,EAAE,gBAAgB;IACzE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,oBAAoB,CAAS;gBAGnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,MAAM,EAC1B,aAAa,EAAE,OAAO,EACtB,oBAAoB,EAAE,MAAM;IAS9B;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAgDnC;;OAEG;IACG,MAAM,CACV,SAAS,EAAE,UAAU,EACrB,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,OAAO,CAAC;IAwBnB,uBAAuB,IAAI,MAAM;IAIjC,qBAAqB,IAAI,MAAM;CAGhC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,EACtB,oBAAoB,EAAE,MAAM,EAC5B,kBAAkB,EAAE,MAAM,GACzB,kBAAkB,CAQpB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turnkey Signer - Integration between Turnkey key management and Originals SDK
|
|
3
|
+
*
|
|
4
|
+
* Provides an ExternalSigner implementation that works with Turnkey-managed
|
|
5
|
+
* keys for use with the Originals SDK's DID creation and signing operations.
|
|
6
|
+
*/
|
|
7
|
+
import { multikey, OriginalsSDK } from '@originals/sdk';
|
|
8
|
+
import { sha512 } from '@noble/hashes/sha2.js';
|
|
9
|
+
import { concatBytes, bytesToHex } from '@noble/hashes/utils.js';
|
|
10
|
+
import * as ed25519 from '@noble/ed25519';
|
|
11
|
+
// Configure @noble/ed25519 with required SHA-512 function
|
|
12
|
+
const sha512Fn = (...msgs) => sha512(concatBytes(...msgs));
|
|
13
|
+
// Initialize Ed25519 configuration
|
|
14
|
+
try {
|
|
15
|
+
const ed25519Module = ed25519;
|
|
16
|
+
if (ed25519Module.utils) {
|
|
17
|
+
ed25519Module.utils.sha512Sync = sha512Fn;
|
|
18
|
+
}
|
|
19
|
+
if (ed25519Module.etc) {
|
|
20
|
+
ed25519Module.etc.sha512Sync = sha512Fn;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.warn('Failed to configure ed25519 utils:', error);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Turnkey-based signer for use with Originals SDK
|
|
28
|
+
* Implements the ExternalSigner and ExternalVerifier interfaces
|
|
29
|
+
*/
|
|
30
|
+
export class TurnkeyWebVHSigner {
|
|
31
|
+
subOrgId;
|
|
32
|
+
keyId;
|
|
33
|
+
publicKeyMultibase;
|
|
34
|
+
turnkeyClient;
|
|
35
|
+
verificationMethodId;
|
|
36
|
+
constructor(subOrgId, keyId, publicKeyMultibase, turnkeyClient, verificationMethodId) {
|
|
37
|
+
this.subOrgId = subOrgId;
|
|
38
|
+
this.keyId = keyId;
|
|
39
|
+
this.publicKeyMultibase = publicKeyMultibase;
|
|
40
|
+
this.turnkeyClient = turnkeyClient;
|
|
41
|
+
this.verificationMethodId = verificationMethodId;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Sign data using Turnkey's API
|
|
45
|
+
*/
|
|
46
|
+
async sign(input) {
|
|
47
|
+
try {
|
|
48
|
+
// Prepare the data for signing using the SDK's canonical approach
|
|
49
|
+
const dataToSign = await OriginalsSDK.prepareDIDDataForSigning(input.document, input.proof);
|
|
50
|
+
// Convert canonical data to hex format for Turnkey's sign API
|
|
51
|
+
const dataHex = `0x${bytesToHex(dataToSign)}`;
|
|
52
|
+
// Sign using Turnkey's API
|
|
53
|
+
const result = await this.turnkeyClient.apiClient().signRawPayload({
|
|
54
|
+
organizationId: this.subOrgId,
|
|
55
|
+
signWith: this.keyId,
|
|
56
|
+
payload: dataHex,
|
|
57
|
+
encoding: 'PAYLOAD_ENCODING_HEXADECIMAL',
|
|
58
|
+
hashFunction: 'HASH_FUNCTION_NO_OP',
|
|
59
|
+
});
|
|
60
|
+
const signRawResult = result.activity?.result?.signRawPayloadResult;
|
|
61
|
+
if (!signRawResult?.r || !signRawResult?.s) {
|
|
62
|
+
throw new Error('No signature returned from Turnkey');
|
|
63
|
+
}
|
|
64
|
+
const signature = signRawResult.r + signRawResult.s;
|
|
65
|
+
// Convert signature to bytes
|
|
66
|
+
const cleanSig = signature.startsWith('0x') ? signature.slice(2) : signature;
|
|
67
|
+
let signatureBytes = Buffer.from(cleanSig, 'hex');
|
|
68
|
+
// Ed25519 signatures should be exactly 64 bytes
|
|
69
|
+
if (signatureBytes.length === 65) {
|
|
70
|
+
signatureBytes = signatureBytes.slice(0, 64);
|
|
71
|
+
}
|
|
72
|
+
else if (signatureBytes.length !== 64) {
|
|
73
|
+
throw new Error(`Invalid Ed25519 signature length: ${signatureBytes.length} (expected 64 bytes)`);
|
|
74
|
+
}
|
|
75
|
+
// Encode signature as multibase
|
|
76
|
+
const proofValue = multikey.encodeMultibase(signatureBytes);
|
|
77
|
+
return { proofValue };
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error('Error signing with Turnkey:', error);
|
|
81
|
+
throw new Error(`Failed to sign with Turnkey: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Verify a signature
|
|
86
|
+
*/
|
|
87
|
+
async verify(signature, message, publicKey) {
|
|
88
|
+
try {
|
|
89
|
+
// Ed25519 public keys must be exactly 32 bytes
|
|
90
|
+
let ed25519PublicKey = publicKey;
|
|
91
|
+
if (publicKey.length === 33) {
|
|
92
|
+
ed25519PublicKey = publicKey.slice(1);
|
|
93
|
+
}
|
|
94
|
+
else if (publicKey.length !== 32) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const ed25519Module = ed25519;
|
|
98
|
+
if (typeof ed25519Module.utils?.sha512Sync !== 'function') {
|
|
99
|
+
ed25519Module.utils.sha512Sync = sha512Fn;
|
|
100
|
+
}
|
|
101
|
+
return await ed25519.verifyAsync(signature, message, ed25519PublicKey);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('Error verifying signature:', error);
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
getVerificationMethodId() {
|
|
109
|
+
return this.verificationMethodId;
|
|
110
|
+
}
|
|
111
|
+
getPublicKeyMultibase() {
|
|
112
|
+
return this.publicKeyMultibase;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create a Turnkey signer for use with the Originals SDK
|
|
117
|
+
*/
|
|
118
|
+
export function createTurnkeySigner(subOrgId, keyId, turnkeyClient, verificationMethodId, publicKeyMultibase) {
|
|
119
|
+
return new TurnkeyWebVHSigner(subOrgId, keyId, publicKeyMultibase, turnkeyClient, verificationMethodId);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=turnkey-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnkey-signer.js","sourceRoot":"","sources":["../../src/server/turnkey-signer.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for @originals/auth
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Authenticated user information
|
|
6
|
+
*/
|
|
7
|
+
export interface AuthUser {
|
|
8
|
+
/** Database user ID */
|
|
9
|
+
id: string;
|
|
10
|
+
/** User's email address */
|
|
11
|
+
email: string;
|
|
12
|
+
/** User's DID identifier */
|
|
13
|
+
did: string;
|
|
14
|
+
/** Turnkey sub-organization ID */
|
|
15
|
+
turnkeySubOrgId: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* JWT token payload structure
|
|
19
|
+
*/
|
|
20
|
+
export interface TokenPayload {
|
|
21
|
+
/** Subject - Turnkey sub-organization ID (stable identifier) */
|
|
22
|
+
sub: string;
|
|
23
|
+
/** User email (metadata) */
|
|
24
|
+
email: string;
|
|
25
|
+
/** Optional Turnkey session token for user authentication */
|
|
26
|
+
sessionToken?: string;
|
|
27
|
+
/** Issued at timestamp */
|
|
28
|
+
iat: number;
|
|
29
|
+
/** Expiration timestamp */
|
|
30
|
+
exp: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Options for creating auth middleware
|
|
34
|
+
*/
|
|
35
|
+
export interface AuthMiddlewareOptions {
|
|
36
|
+
/** Function to look up user by Turnkey sub-org ID */
|
|
37
|
+
getUserByTurnkeyId: (turnkeyId: string) => Promise<AuthUser | null>;
|
|
38
|
+
/** Optional function to create user on first auth */
|
|
39
|
+
createUser?: (turnkeyId: string, email: string, temporaryDid: string) => Promise<AuthUser>;
|
|
40
|
+
/** Cookie name for JWT token (default: 'auth_token') */
|
|
41
|
+
cookieName?: string;
|
|
42
|
+
/** JWT secret (default: process.env.JWT_SECRET) */
|
|
43
|
+
jwtSecret?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Email authentication session
|
|
47
|
+
*/
|
|
48
|
+
export interface EmailAuthSession {
|
|
49
|
+
/** User's email address */
|
|
50
|
+
email: string;
|
|
51
|
+
/** Turnkey sub-organization ID */
|
|
52
|
+
subOrgId?: string;
|
|
53
|
+
/** Turnkey OTP ID */
|
|
54
|
+
otpId?: string;
|
|
55
|
+
/** Session creation timestamp */
|
|
56
|
+
timestamp: number;
|
|
57
|
+
/** Whether the session has been verified */
|
|
58
|
+
verified: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Result of initiating email authentication
|
|
62
|
+
*/
|
|
63
|
+
export interface InitiateAuthResult {
|
|
64
|
+
/** Session ID for verification step */
|
|
65
|
+
sessionId: string;
|
|
66
|
+
/** User-friendly message */
|
|
67
|
+
message: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Result of verifying email authentication
|
|
71
|
+
*/
|
|
72
|
+
export interface VerifyAuthResult {
|
|
73
|
+
/** Whether verification was successful */
|
|
74
|
+
verified: boolean;
|
|
75
|
+
/** User's email address */
|
|
76
|
+
email: string;
|
|
77
|
+
/** Turnkey sub-organization ID */
|
|
78
|
+
subOrgId: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Cookie configuration for auth tokens
|
|
82
|
+
*/
|
|
83
|
+
export interface AuthCookieConfig {
|
|
84
|
+
/** Cookie name */
|
|
85
|
+
name: string;
|
|
86
|
+
/** Cookie value (JWT token) */
|
|
87
|
+
value: string;
|
|
88
|
+
/** Cookie options */
|
|
89
|
+
options: {
|
|
90
|
+
httpOnly: boolean;
|
|
91
|
+
secure: boolean;
|
|
92
|
+
sameSite: 'strict' | 'lax' | 'none';
|
|
93
|
+
maxAge: number;
|
|
94
|
+
path: string;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Turnkey wallet information
|
|
99
|
+
*/
|
|
100
|
+
export interface TurnkeyWallet {
|
|
101
|
+
/** Wallet ID */
|
|
102
|
+
walletId: string;
|
|
103
|
+
/** Wallet name */
|
|
104
|
+
walletName: string;
|
|
105
|
+
/** Wallet accounts */
|
|
106
|
+
accounts: TurnkeyWalletAccount[];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Turnkey wallet account
|
|
110
|
+
*/
|
|
111
|
+
export interface TurnkeyWalletAccount {
|
|
112
|
+
/** Account address */
|
|
113
|
+
address: string;
|
|
114
|
+
/** Cryptographic curve */
|
|
115
|
+
curve: 'CURVE_SECP256K1' | 'CURVE_ED25519';
|
|
116
|
+
/** Derivation path */
|
|
117
|
+
path: string;
|
|
118
|
+
/** Address format */
|
|
119
|
+
addressFormat: string;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Client-side Turnkey authentication state
|
|
123
|
+
*/
|
|
124
|
+
export interface TurnkeyAuthState {
|
|
125
|
+
/** Whether the user is authenticated */
|
|
126
|
+
isAuthenticated: boolean;
|
|
127
|
+
/** Whether an auth operation is in progress */
|
|
128
|
+
isLoading: boolean;
|
|
129
|
+
/** Error message if any */
|
|
130
|
+
error: string | null;
|
|
131
|
+
/** User's email address */
|
|
132
|
+
email: string | null;
|
|
133
|
+
/** User's wallets */
|
|
134
|
+
wallets: TurnkeyWallet[];
|
|
135
|
+
/** OTP ID for verification step */
|
|
136
|
+
otpId: string | null;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Request context with authenticated user
|
|
140
|
+
*/
|
|
141
|
+
export interface AuthenticatedRequest {
|
|
142
|
+
user: {
|
|
143
|
+
/** Database user ID */
|
|
144
|
+
id: string;
|
|
145
|
+
/** Turnkey sub-organization ID */
|
|
146
|
+
turnkeySubOrgId: string;
|
|
147
|
+
/** User's email */
|
|
148
|
+
email: string;
|
|
149
|
+
/** User's DID */
|
|
150
|
+
did: string;
|
|
151
|
+
/** Turnkey session token (if available) */
|
|
152
|
+
sessionToken?: string;
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|