@privy-io/node 0.1.0-alpha.3 → 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.
- package/CHANGELOG.md +20 -0
- package/client.d.mts +1 -1
- package/client.d.ts +1 -1
- package/client.js +1 -1
- package/client.js.map +1 -1
- package/client.mjs +1 -1
- package/client.mjs.map +1 -1
- package/index.d.mts +6 -1
- package/index.d.mts.map +1 -1
- package/index.d.ts +6 -1
- package/index.d.ts.map +1 -1
- package/index.js +6 -2
- package/index.js.map +1 -1
- package/index.mjs +2 -1
- package/index.mjs.map +1 -1
- package/lib/auth.d.mts +68 -0
- package/lib/auth.d.mts.map +1 -0
- package/lib/auth.d.ts +68 -0
- package/lib/auth.d.ts.map +1 -0
- package/lib/auth.js +130 -0
- package/lib/auth.js.map +1 -0
- package/lib/auth.mjs +123 -0
- package/lib/auth.mjs.map +1 -0
- package/lib/identity-token.d.mts +15 -0
- package/lib/identity-token.d.mts.map +1 -0
- package/lib/identity-token.d.ts +15 -0
- package/lib/identity-token.d.ts.map +1 -0
- package/lib/identity-token.js +273 -0
- package/lib/identity-token.js.map +1 -0
- package/lib/identity-token.mjs +268 -0
- package/lib/identity-token.mjs.map +1 -0
- package/lib/user-utils.d.mts +22 -0
- package/lib/user-utils.d.mts.map +1 -0
- package/lib/user-utils.d.ts +22 -0
- package/lib/user-utils.d.ts.map +1 -0
- package/lib/user-utils.js +15 -0
- package/lib/user-utils.js.map +1 -0
- package/lib/user-utils.mjs +11 -0
- package/lib/user-utils.mjs.map +1 -0
- package/package.json +1 -1
- package/public-api/PrivyClient.d.mts +2 -1
- package/public-api/PrivyClient.d.mts.map +1 -1
- package/public-api/PrivyClient.d.ts +2 -1
- package/public-api/PrivyClient.d.ts.map +1 -1
- package/public-api/PrivyClient.js +10 -3
- package/public-api/PrivyClient.js.map +1 -1
- package/public-api/PrivyClient.mjs +10 -3
- package/public-api/PrivyClient.mjs.map +1 -1
- package/public-api/services/ethereum.d.mts.map +1 -1
- package/public-api/services/ethereum.d.ts.map +1 -1
- package/public-api/services/ethereum.js +0 -6
- package/public-api/services/ethereum.js.map +1 -1
- package/public-api/services/ethereum.mjs +0 -6
- package/public-api/services/ethereum.mjs.map +1 -1
- package/public-api/services/solana.d.mts.map +1 -1
- package/public-api/services/solana.d.ts.map +1 -1
- package/public-api/services/solana.js +0 -3
- package/public-api/services/solana.js.map +1 -1
- package/public-api/services/solana.mjs +0 -3
- package/public-api/services/solana.mjs.map +1 -1
- package/public-api/services/users.d.mts +23 -1
- package/public-api/services/users.d.mts.map +1 -1
- package/public-api/services/users.d.ts +23 -1
- package/public-api/services/users.d.ts.map +1 -1
- package/public-api/services/users.js +24 -0
- package/public-api/services/users.js.map +1 -1
- package/public-api/services/users.mjs +24 -0
- package/public-api/services/users.mjs.map +1 -1
- package/public-api/services/utils/auth.d.mts +6 -17
- package/public-api/services/utils/auth.d.mts.map +1 -1
- package/public-api/services/utils/auth.d.ts +6 -17
- package/public-api/services/utils/auth.d.ts.map +1 -1
- package/public-api/services/utils/auth.js +17 -69
- package/public-api/services/utils/auth.js.map +1 -1
- package/public-api/services/utils/auth.mjs +15 -66
- package/public-api/services/utils/auth.mjs.map +1 -1
- package/public-api/services/utils.d.mts +2 -1
- package/public-api/services/utils.d.mts.map +1 -1
- package/public-api/services/utils.d.ts +2 -1
- package/public-api/services/utils.d.ts.map +1 -1
- package/public-api/services/utils.js +2 -2
- package/public-api/services/utils.js.map +1 -1
- package/public-api/services/utils.mjs +2 -2
- package/public-api/services/utils.mjs.map +1 -1
- package/resources/policies.d.mts +2 -1
- package/resources/policies.d.mts.map +1 -1
- package/resources/policies.d.ts +2 -1
- package/resources/policies.d.ts.map +1 -1
- package/resources/users.d.mts +14 -3
- package/resources/users.d.mts.map +1 -1
- package/resources/users.d.ts +14 -3
- package/resources/users.d.ts.map +1 -1
- package/resources/users.js +2 -2
- package/resources/users.js.map +1 -1
- package/resources/users.mjs +2 -2
- package/resources/users.mjs.map +1 -1
- package/resources/wallets/wallets.d.mts +3 -18
- package/resources/wallets/wallets.d.mts.map +1 -1
- package/resources/wallets/wallets.d.ts +3 -18
- package/resources/wallets/wallets.d.ts.map +1 -1
- package/resources/wallets/wallets.js.map +1 -1
- package/resources/wallets/wallets.mjs.map +1 -1
- package/src/client.ts +2 -2
- package/src/index.ts +15 -1
- package/src/lib/auth.ts +210 -0
- package/src/lib/identity-token.ts +280 -0
- package/src/lib/user-utils.ts +31 -0
- package/src/public-api/PrivyClient.ts +12 -2
- package/src/public-api/services/ethereum.ts +0 -8
- package/src/public-api/services/solana.ts +0 -4
- package/src/public-api/services/users.ts +36 -2
- package/src/public-api/services/utils/auth.ts +22 -86
- package/src/public-api/services/utils.ts +3 -2
- package/src/resources/policies.ts +2 -1
- package/src/resources/users.ts +23 -2
- package/src/resources/wallets/wallets.ts +6 -30
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.mts.map +1 -1
- package/version.d.ts +1 -1
- package/version.d.ts.map +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
- package/version.mjs +1 -1
- package/version.mjs.map +1 -1
package/lib/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
package/lib/auth.mjs
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { createRemoteJWKSet, importSPKI, errors as joseErrors, jwtVerify, } from 'jose';
|
|
2
|
+
import { PrivyAPIError } from "../core/error.mjs";
|
|
3
|
+
import { parseUserFromIdentityTokenPayload } from "./identity-token.mjs";
|
|
4
|
+
const JWT_ALGORITHM = 'ES256';
|
|
5
|
+
const JWT_ISSUER = 'privy.io';
|
|
6
|
+
/**
|
|
7
|
+
* Verifies a JWT issued by privy.io for the given app ID.
|
|
8
|
+
* This serves both auth tokens and identity tokens.
|
|
9
|
+
* @returns The verify result along with the token's payload.
|
|
10
|
+
* @throws If the token is invalid.
|
|
11
|
+
*/
|
|
12
|
+
async function verifyPrivyIssuedJwt(jwt, appId, verificationKey) {
|
|
13
|
+
// Because of a type difference, the calls cannot be merged into one.
|
|
14
|
+
let verifiedToken;
|
|
15
|
+
if (typeof verificationKey !== 'function') {
|
|
16
|
+
verifiedToken = await jwtVerify(jwt, verificationKey, {
|
|
17
|
+
typ: 'JWT',
|
|
18
|
+
algorithms: [JWT_ALGORITHM],
|
|
19
|
+
issuer: JWT_ISSUER,
|
|
20
|
+
audience: appId,
|
|
21
|
+
}).catch(mapAndThrowJoseErrors);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
verifiedToken = await jwtVerify(jwt, verificationKey, {
|
|
25
|
+
typ: 'JWT',
|
|
26
|
+
algorithms: [JWT_ALGORITHM],
|
|
27
|
+
issuer: JWT_ISSUER,
|
|
28
|
+
audience: appId,
|
|
29
|
+
}).catch(mapAndThrowJoseErrors);
|
|
30
|
+
}
|
|
31
|
+
return verifiedToken;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Verifies a Privy-issued authentication token.
|
|
35
|
+
*
|
|
36
|
+
* @returns The payload of the token if it is valid.
|
|
37
|
+
* @throws If the token is invalid.
|
|
38
|
+
*/
|
|
39
|
+
export async function verifyAuthToken({ auth_token: authToken, app_id: appId, verification_key: verificationKeyOrString, }) {
|
|
40
|
+
const verificationKey = typeof verificationKeyOrString === 'string' ?
|
|
41
|
+
await importSPKI(verificationKeyOrString, JWT_ALGORITHM)
|
|
42
|
+
: verificationKeyOrString;
|
|
43
|
+
const verifiedToken = await verifyPrivyIssuedJwt(authToken, appId, verificationKey);
|
|
44
|
+
return {
|
|
45
|
+
app_id: throwIfNotString(verifiedToken.payload.aud),
|
|
46
|
+
issuer: throwIfNotString(verifiedToken.payload.iss),
|
|
47
|
+
issued_at: throwIfNotNumber(verifiedToken.payload.iat),
|
|
48
|
+
expiration: throwIfNotNumber(verifiedToken.payload.exp),
|
|
49
|
+
session_id: throwIfNotString(verifiedToken.payload['sid']),
|
|
50
|
+
user_id: throwIfNotString(verifiedToken.payload.sub),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Verifies an identity token, parsing it into a `User` object if it is valid.
|
|
55
|
+
*
|
|
56
|
+
* @returns The user object parsed from the identity token.
|
|
57
|
+
* @throws If the token or its payload is invalid.
|
|
58
|
+
*/
|
|
59
|
+
export async function verifyIdentityToken({ identity_token: identityToken, app_id: appId, verification_key: verificationKeyOrString, }) {
|
|
60
|
+
const verificationKey = typeof verificationKeyOrString === 'string' ?
|
|
61
|
+
await importSPKI(verificationKeyOrString, JWT_ALGORITHM)
|
|
62
|
+
: verificationKeyOrString;
|
|
63
|
+
const verifiedToken = await verifyPrivyIssuedJwt(identityToken, appId, verificationKey);
|
|
64
|
+
if (!verifiedToken.payload) {
|
|
65
|
+
throw new InvalidAuthTokenError('Unable to parse identity token');
|
|
66
|
+
}
|
|
67
|
+
return parseUserFromIdentityTokenPayload(verifiedToken.payload);
|
|
68
|
+
}
|
|
69
|
+
export class InvalidAuthTokenError extends PrivyAPIError {
|
|
70
|
+
}
|
|
71
|
+
/** Used for asserting the values in the token payload are strings. */
|
|
72
|
+
function throwIfNotString(value) {
|
|
73
|
+
if (!value || typeof value !== 'string') {
|
|
74
|
+
throw new InvalidAuthTokenError("Token's payload is invalid");
|
|
75
|
+
}
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
/** Used for asserting the values in the token payload are numbers. */
|
|
79
|
+
function throwIfNotNumber(value) {
|
|
80
|
+
if (!value || typeof value !== 'number') {
|
|
81
|
+
throw new InvalidAuthTokenError("Token's payload is invalid");
|
|
82
|
+
}
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Used to catch errors thrown by async `jose` functions and map to our own error types.
|
|
87
|
+
* This method will **always** throw an error, so it's return type is `never`.
|
|
88
|
+
*/
|
|
89
|
+
function mapAndThrowJoseErrors(error) {
|
|
90
|
+
if (error instanceof joseErrors.JWTExpired) {
|
|
91
|
+
throw new InvalidAuthTokenError('Authentication token expired');
|
|
92
|
+
}
|
|
93
|
+
else if (error instanceof joseErrors.JWTClaimValidationFailed || error instanceof joseErrors.JWTInvalid) {
|
|
94
|
+
throw new InvalidAuthTokenError('Authentication token is invalid');
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
throw new InvalidAuthTokenError('Failed to verify authentication token');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export function createPrivyAppJWKS({ appId, apiUrl, headers, verificationKeyOverride, }) {
|
|
101
|
+
if (verificationKeyOverride !== undefined) {
|
|
102
|
+
// Use a closure to cache the verification key once imported
|
|
103
|
+
let verificationKey;
|
|
104
|
+
return async () => {
|
|
105
|
+
if (verificationKey === undefined) {
|
|
106
|
+
try {
|
|
107
|
+
verificationKey = await importSPKI(verificationKeyOverride, JWT_ALGORITHM);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
throw new InvalidAuthTokenError('Failed to import the provided verification key override');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return verificationKey;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const url = new URL(`${apiUrl}/v1/apps/${appId}/jwks.json`);
|
|
117
|
+
return createRemoteJWKSet(url, {
|
|
118
|
+
cacheMaxAge: 60 * 60 * 1000, // 60 minutes
|
|
119
|
+
cooldownDuration: 10 * 60 * 1000, // 10 minutes
|
|
120
|
+
headers,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=auth.mjs.map
|
package/lib/auth.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.mjs","sourceRoot":"","sources":["../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { JWTPayload } from 'jose';
|
|
2
|
+
import { User } from "../resources.mjs";
|
|
3
|
+
import { PrivyAPIError } from "../error.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* Parses the payload of an identity token (JWT) into a `User` object.
|
|
6
|
+
* Note that the user object may be incomplete due to the size constraints of the identity token.
|
|
7
|
+
*
|
|
8
|
+
* @param payload The payload of the identity token.
|
|
9
|
+
* @returns The user object parsed from the identity token.
|
|
10
|
+
* @throws If the payload is invalid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseUserFromIdentityTokenPayload(payload: JWTPayload): User;
|
|
13
|
+
export declare class InvalidIdentityTokenError extends PrivyAPIError {
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=identity-token.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-token.d.mts","sourceRoot":"","sources":["../src/lib/identity-token.ts"],"names":[],"mappings":"OAAO,EAAE,UAAU,EAAE,MAAM,MAAM;OAC1B,EAAE,IAAI,EAAE;OACR,EAAE,aAAa,EAAE;AAGxB;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAY3E;AA8PD,qBAAa,yBAA0B,SAAQ,aAAa;CAAG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { JWTPayload } from 'jose';
|
|
2
|
+
import { User } from "../resources.js";
|
|
3
|
+
import { PrivyAPIError } from "../error.js";
|
|
4
|
+
/**
|
|
5
|
+
* Parses the payload of an identity token (JWT) into a `User` object.
|
|
6
|
+
* Note that the user object may be incomplete due to the size constraints of the identity token.
|
|
7
|
+
*
|
|
8
|
+
* @param payload The payload of the identity token.
|
|
9
|
+
* @returns The user object parsed from the identity token.
|
|
10
|
+
* @throws If the payload is invalid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseUserFromIdentityTokenPayload(payload: JWTPayload): User;
|
|
13
|
+
export declare class InvalidIdentityTokenError extends PrivyAPIError {
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=identity-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-token.d.ts","sourceRoot":"","sources":["../src/lib/identity-token.ts"],"names":[],"mappings":"OAAO,EAAE,UAAU,EAAE,MAAM,MAAM;OAC1B,EAAE,IAAI,EAAE;OACR,EAAE,aAAa,EAAE;AAGxB;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAY3E;AA8PD,qBAAa,yBAA0B,SAAQ,aAAa;CAAG"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvalidIdentityTokenError = void 0;
|
|
4
|
+
exports.parseUserFromIdentityTokenPayload = parseUserFromIdentityTokenPayload;
|
|
5
|
+
const error_1 = require("../error.js");
|
|
6
|
+
/**
|
|
7
|
+
* Parses the payload of an identity token (JWT) into a `User` object.
|
|
8
|
+
* Note that the user object may be incomplete due to the size constraints of the identity token.
|
|
9
|
+
*
|
|
10
|
+
* @param payload The payload of the identity token.
|
|
11
|
+
* @returns The user object parsed from the identity token.
|
|
12
|
+
* @throws If the payload is invalid.
|
|
13
|
+
*/
|
|
14
|
+
function parseUserFromIdentityTokenPayload(payload) {
|
|
15
|
+
const customMetadata = parseCustomMetadataClaim(payload);
|
|
16
|
+
return {
|
|
17
|
+
id: payload.sub,
|
|
18
|
+
created_at: parseInt(payload['cr']),
|
|
19
|
+
is_guest: payload['guest'] === 't',
|
|
20
|
+
linked_accounts: parseLinkedAccountsClaim(payload),
|
|
21
|
+
...(customMetadata ? { custom_metadata: customMetadata } : {}),
|
|
22
|
+
has_accepted_terms: false,
|
|
23
|
+
mfa_methods: [],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function parseLinkedAccountsClaim(payload) {
|
|
27
|
+
const linkedAccountsClaim = payload['linked_accounts'];
|
|
28
|
+
if (typeof linkedAccountsClaim !== 'string') {
|
|
29
|
+
throw new InvalidIdentityTokenError('Unable to parse identity token');
|
|
30
|
+
}
|
|
31
|
+
const parsedLinkedAccounts = JSON.parse(linkedAccountsClaim);
|
|
32
|
+
if (!Array.isArray(parsedLinkedAccounts)) {
|
|
33
|
+
throw new InvalidIdentityTokenError('Unable to parse identity token');
|
|
34
|
+
}
|
|
35
|
+
return parsedLinkedAccounts
|
|
36
|
+
.map(mapIdLinkedAccountToUserLinkedAccount)
|
|
37
|
+
.filter((account) => account !== null);
|
|
38
|
+
}
|
|
39
|
+
function mapIdLinkedAccountToUserLinkedAccount(account) {
|
|
40
|
+
if (account.type === 'email') {
|
|
41
|
+
return {
|
|
42
|
+
type: 'email',
|
|
43
|
+
address: account.address,
|
|
44
|
+
first_verified_at: null,
|
|
45
|
+
verified_at: account.lv,
|
|
46
|
+
latest_verified_at: account.lv,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (account.type === 'phone') {
|
|
50
|
+
return {
|
|
51
|
+
type: 'phone',
|
|
52
|
+
phoneNumber: account.phone_number,
|
|
53
|
+
first_verified_at: null,
|
|
54
|
+
verified_at: account.lv,
|
|
55
|
+
latest_verified_at: account.lv,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Parses all wallet types
|
|
59
|
+
if (account.type === 'wallet') {
|
|
60
|
+
if (account.wallet_client_type === 'privy') {
|
|
61
|
+
return {
|
|
62
|
+
type: 'wallet',
|
|
63
|
+
wallet_client_type: 'privy',
|
|
64
|
+
wallet_client: 'privy',
|
|
65
|
+
connector_type: 'embedded',
|
|
66
|
+
id: account.id,
|
|
67
|
+
address: account.address,
|
|
68
|
+
chain_type: account.chain_type,
|
|
69
|
+
first_verified_at: null,
|
|
70
|
+
verified_at: account.lv,
|
|
71
|
+
latest_verified_at: account.lv,
|
|
72
|
+
// The following fields are not present in the identity token,
|
|
73
|
+
// but are required. We set them to some safe defaults.
|
|
74
|
+
chain_id: '',
|
|
75
|
+
delegated: false,
|
|
76
|
+
imported: false,
|
|
77
|
+
public_key: '',
|
|
78
|
+
wallet_index: 0,
|
|
79
|
+
recovery_method: account.id ? 'privy-v2' : 'privy',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
type: 'wallet',
|
|
84
|
+
wallet_client: 'unknown',
|
|
85
|
+
address: account.address,
|
|
86
|
+
chain_type: account.chain_type,
|
|
87
|
+
first_verified_at: null,
|
|
88
|
+
verified_at: account.lv,
|
|
89
|
+
latest_verified_at: account.lv,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (account.type === 'smart_wallet') {
|
|
93
|
+
return {
|
|
94
|
+
type: 'smart_wallet',
|
|
95
|
+
address: account.address,
|
|
96
|
+
smart_wallet_type: account.smart_wallet_type,
|
|
97
|
+
first_verified_at: null,
|
|
98
|
+
verified_at: account.lv,
|
|
99
|
+
latest_verified_at: account.lv,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (account.type === 'farcaster') {
|
|
103
|
+
return {
|
|
104
|
+
type: 'farcaster',
|
|
105
|
+
fid: account.fid,
|
|
106
|
+
username: account.username,
|
|
107
|
+
first_verified_at: null,
|
|
108
|
+
verified_at: account.lv,
|
|
109
|
+
latest_verified_at: account.lv,
|
|
110
|
+
owner_address: account.oa,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (account.type === 'google_oauth') {
|
|
114
|
+
return {
|
|
115
|
+
type: 'google_oauth',
|
|
116
|
+
subject: account.subject,
|
|
117
|
+
email: account.email,
|
|
118
|
+
name: account.name,
|
|
119
|
+
first_verified_at: null,
|
|
120
|
+
verified_at: account.lv,
|
|
121
|
+
latest_verified_at: account.lv,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (account.type === 'twitter_oauth') {
|
|
125
|
+
// We send along three potential URL shapes here based on possible profile picture URLs, all
|
|
126
|
+
// done to preserve size.
|
|
127
|
+
// 1. pfp begins with `default`, in which case we use the default profile picture URL structure
|
|
128
|
+
// 2. pfp does not start with https, in which case we assume the profile picture URL structure
|
|
129
|
+
// 3. Otherwise, we use the pfp URL as-is
|
|
130
|
+
let pfp = account.pfp ? account.pfp : null;
|
|
131
|
+
if (pfp?.startsWith('default')) {
|
|
132
|
+
pfp = `https://abs.twimg.com/sticky/default_profile_images/${pfp}`;
|
|
133
|
+
}
|
|
134
|
+
else if (!pfp?.startsWith('https://')) {
|
|
135
|
+
pfp = `https://pbs.twimg.com/profile_images/${pfp}`;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
type: 'twitter_oauth',
|
|
139
|
+
subject: account.subject,
|
|
140
|
+
username: account.username,
|
|
141
|
+
name: account.name ? account.name : null,
|
|
142
|
+
profile_picture_url: pfp,
|
|
143
|
+
first_verified_at: null,
|
|
144
|
+
verified_at: account.lv,
|
|
145
|
+
latest_verified_at: account.lv,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (account.type === 'discord_oauth') {
|
|
149
|
+
return {
|
|
150
|
+
type: 'discord_oauth',
|
|
151
|
+
subject: account.subject,
|
|
152
|
+
username: account.username,
|
|
153
|
+
email: null, // not a part of the identity token
|
|
154
|
+
first_verified_at: null,
|
|
155
|
+
verified_at: account.lv,
|
|
156
|
+
latest_verified_at: account.lv,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (account.type === 'github_oauth') {
|
|
160
|
+
return {
|
|
161
|
+
type: 'github_oauth',
|
|
162
|
+
subject: account.subject,
|
|
163
|
+
username: account.username,
|
|
164
|
+
email: null, // not a part of the identity token
|
|
165
|
+
name: null, // not a part of the identity token
|
|
166
|
+
first_verified_at: null,
|
|
167
|
+
verified_at: account.lv,
|
|
168
|
+
latest_verified_at: account.lv,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
if (account.type === 'spotify_oauth') {
|
|
172
|
+
return {
|
|
173
|
+
type: 'spotify_oauth',
|
|
174
|
+
subject: account.subject,
|
|
175
|
+
email: null, // not a part of the identity token
|
|
176
|
+
name: null, // not a part of the identity token
|
|
177
|
+
first_verified_at: null,
|
|
178
|
+
verified_at: account.lv,
|
|
179
|
+
latest_verified_at: account.lv,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
if (account.type === 'instagram_oauth') {
|
|
183
|
+
return {
|
|
184
|
+
type: 'instagram_oauth',
|
|
185
|
+
subject: account.subject,
|
|
186
|
+
username: account.username,
|
|
187
|
+
first_verified_at: null,
|
|
188
|
+
verified_at: account.lv,
|
|
189
|
+
latest_verified_at: account.lv,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (account.type === 'tiktok_oauth') {
|
|
193
|
+
return {
|
|
194
|
+
type: 'tiktok_oauth',
|
|
195
|
+
subject: account.subject,
|
|
196
|
+
username: account.username,
|
|
197
|
+
name: null, // not a part of the identity token
|
|
198
|
+
first_verified_at: null,
|
|
199
|
+
verified_at: account.lv,
|
|
200
|
+
latest_verified_at: account.lv,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
if (account.type === 'linkedin_oauth') {
|
|
204
|
+
return {
|
|
205
|
+
type: 'linkedin_oauth',
|
|
206
|
+
subject: account.subject,
|
|
207
|
+
email: account.email,
|
|
208
|
+
first_verified_at: null,
|
|
209
|
+
verified_at: account.lv,
|
|
210
|
+
latest_verified_at: account.lv,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
if (account.type === 'apple_oauth') {
|
|
214
|
+
return {
|
|
215
|
+
type: 'apple_oauth',
|
|
216
|
+
subject: account.subject,
|
|
217
|
+
email: account.email,
|
|
218
|
+
first_verified_at: null,
|
|
219
|
+
verified_at: account.lv,
|
|
220
|
+
latest_verified_at: account.lv,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
if (account.type === 'cross_app') {
|
|
224
|
+
return {
|
|
225
|
+
type: 'cross_app',
|
|
226
|
+
subject: account.subject,
|
|
227
|
+
provider_app_id: account.provider_app_id,
|
|
228
|
+
embedded_wallets: account.embedded_wallets,
|
|
229
|
+
smart_wallets: account.smart_wallets,
|
|
230
|
+
first_verified_at: null,
|
|
231
|
+
verified_at: account.lv,
|
|
232
|
+
latest_verified_at: account.lv,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
if (account.type === 'custom_auth') {
|
|
236
|
+
return {
|
|
237
|
+
type: 'custom_auth',
|
|
238
|
+
custom_user_id: account.custom_user_id,
|
|
239
|
+
first_verified_at: null,
|
|
240
|
+
verified_at: account.lv,
|
|
241
|
+
latest_verified_at: account.lv,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
if (account.type === 'telegram') {
|
|
245
|
+
return {
|
|
246
|
+
type: 'telegram',
|
|
247
|
+
telegram_user_id: account.telegram_user_id,
|
|
248
|
+
username: account.username,
|
|
249
|
+
first_verified_at: null,
|
|
250
|
+
verified_at: account.lv,
|
|
251
|
+
latest_verified_at: account.lv,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
function parseCustomMetadataClaim(payload) {
|
|
257
|
+
const customMetadataClaim = payload['custom_metadata'];
|
|
258
|
+
if (customMetadataClaim === undefined) {
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
if (typeof customMetadataClaim !== 'string') {
|
|
262
|
+
throw new InvalidIdentityTokenError('Unable to parse identity token');
|
|
263
|
+
}
|
|
264
|
+
const parsedCustomMetadata = JSON.parse(customMetadataClaim);
|
|
265
|
+
if (!parsedCustomMetadata || typeof parsedCustomMetadata !== 'object') {
|
|
266
|
+
throw new InvalidIdentityTokenError('Unable to parse identity token');
|
|
267
|
+
}
|
|
268
|
+
return parsedCustomMetadata;
|
|
269
|
+
}
|
|
270
|
+
class InvalidIdentityTokenError extends error_1.PrivyAPIError {
|
|
271
|
+
}
|
|
272
|
+
exports.InvalidIdentityTokenError = InvalidIdentityTokenError;
|
|
273
|
+
//# sourceMappingURL=identity-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-token.js","sourceRoot":"","sources":["../src/lib/identity-token.ts"],"names":[],"mappings":"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"}
|