@privy-io/node 0.1.0-alpha.3 → 0.2.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 +38 -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/cryptography.d.mts +3 -0
- package/lib/cryptography.d.mts.map +1 -1
- package/lib/cryptography.d.ts +3 -0
- package/lib/cryptography.d.ts.map +1 -1
- package/lib/cryptography.js +8 -1
- package/lib/cryptography.js.map +1 -1
- package/lib/cryptography.mjs +7 -1
- package/lib/cryptography.mjs.map +1 -1
- 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 +16 -5
- package/resources/users.d.mts.map +1 -1
- package/resources/users.d.ts +16 -5
- 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 +7 -22
- package/resources/wallets/wallets.d.mts.map +1 -1
- package/resources/wallets/wallets.d.ts +7 -22
- 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/cryptography.ts +9 -1
- 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 +27 -3
- package/src/resources/wallets/wallets.ts +14 -33
- 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
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvalidAuthTokenError = void 0;
|
|
4
|
+
exports.verifyAuthToken = verifyAuthToken;
|
|
5
|
+
exports.verifyIdentityToken = verifyIdentityToken;
|
|
6
|
+
exports.createPrivyAppJWKS = createPrivyAppJWKS;
|
|
7
|
+
const jose_1 = require("jose");
|
|
8
|
+
const error_1 = require("../core/error.js");
|
|
9
|
+
const identity_token_1 = require("./identity-token.js");
|
|
10
|
+
const JWT_ALGORITHM = 'ES256';
|
|
11
|
+
const JWT_ISSUER = 'privy.io';
|
|
12
|
+
/**
|
|
13
|
+
* Verifies a JWT issued by privy.io for the given app ID.
|
|
14
|
+
* This serves both auth tokens and identity tokens.
|
|
15
|
+
* @returns The verify result along with the token's payload.
|
|
16
|
+
* @throws If the token is invalid.
|
|
17
|
+
*/
|
|
18
|
+
async function verifyPrivyIssuedJwt(jwt, appId, verificationKey) {
|
|
19
|
+
// Because of a type difference, the calls cannot be merged into one.
|
|
20
|
+
let verifiedToken;
|
|
21
|
+
if (typeof verificationKey !== 'function') {
|
|
22
|
+
verifiedToken = await (0, jose_1.jwtVerify)(jwt, verificationKey, {
|
|
23
|
+
typ: 'JWT',
|
|
24
|
+
algorithms: [JWT_ALGORITHM],
|
|
25
|
+
issuer: JWT_ISSUER,
|
|
26
|
+
audience: appId,
|
|
27
|
+
}).catch(mapAndThrowJoseErrors);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
verifiedToken = await (0, jose_1.jwtVerify)(jwt, verificationKey, {
|
|
31
|
+
typ: 'JWT',
|
|
32
|
+
algorithms: [JWT_ALGORITHM],
|
|
33
|
+
issuer: JWT_ISSUER,
|
|
34
|
+
audience: appId,
|
|
35
|
+
}).catch(mapAndThrowJoseErrors);
|
|
36
|
+
}
|
|
37
|
+
return verifiedToken;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Verifies a Privy-issued authentication token.
|
|
41
|
+
*
|
|
42
|
+
* @returns The payload of the token if it is valid.
|
|
43
|
+
* @throws If the token is invalid.
|
|
44
|
+
*/
|
|
45
|
+
async function verifyAuthToken({ auth_token: authToken, app_id: appId, verification_key: verificationKeyOrString, }) {
|
|
46
|
+
const verificationKey = typeof verificationKeyOrString === 'string' ?
|
|
47
|
+
await (0, jose_1.importSPKI)(verificationKeyOrString, JWT_ALGORITHM)
|
|
48
|
+
: verificationKeyOrString;
|
|
49
|
+
const verifiedToken = await verifyPrivyIssuedJwt(authToken, appId, verificationKey);
|
|
50
|
+
return {
|
|
51
|
+
app_id: throwIfNotString(verifiedToken.payload.aud),
|
|
52
|
+
issuer: throwIfNotString(verifiedToken.payload.iss),
|
|
53
|
+
issued_at: throwIfNotNumber(verifiedToken.payload.iat),
|
|
54
|
+
expiration: throwIfNotNumber(verifiedToken.payload.exp),
|
|
55
|
+
session_id: throwIfNotString(verifiedToken.payload['sid']),
|
|
56
|
+
user_id: throwIfNotString(verifiedToken.payload.sub),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Verifies an identity token, parsing it into a `User` object if it is valid.
|
|
61
|
+
*
|
|
62
|
+
* @returns The user object parsed from the identity token.
|
|
63
|
+
* @throws If the token or its payload is invalid.
|
|
64
|
+
*/
|
|
65
|
+
async function verifyIdentityToken({ identity_token: identityToken, app_id: appId, verification_key: verificationKeyOrString, }) {
|
|
66
|
+
const verificationKey = typeof verificationKeyOrString === 'string' ?
|
|
67
|
+
await (0, jose_1.importSPKI)(verificationKeyOrString, JWT_ALGORITHM)
|
|
68
|
+
: verificationKeyOrString;
|
|
69
|
+
const verifiedToken = await verifyPrivyIssuedJwt(identityToken, appId, verificationKey);
|
|
70
|
+
if (!verifiedToken.payload) {
|
|
71
|
+
throw new InvalidAuthTokenError('Unable to parse identity token');
|
|
72
|
+
}
|
|
73
|
+
return (0, identity_token_1.parseUserFromIdentityTokenPayload)(verifiedToken.payload);
|
|
74
|
+
}
|
|
75
|
+
class InvalidAuthTokenError extends error_1.PrivyAPIError {
|
|
76
|
+
}
|
|
77
|
+
exports.InvalidAuthTokenError = InvalidAuthTokenError;
|
|
78
|
+
/** Used for asserting the values in the token payload are strings. */
|
|
79
|
+
function throwIfNotString(value) {
|
|
80
|
+
if (!value || typeof value !== 'string') {
|
|
81
|
+
throw new InvalidAuthTokenError("Token's payload is invalid");
|
|
82
|
+
}
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
/** Used for asserting the values in the token payload are numbers. */
|
|
86
|
+
function throwIfNotNumber(value) {
|
|
87
|
+
if (!value || typeof value !== 'number') {
|
|
88
|
+
throw new InvalidAuthTokenError("Token's payload is invalid");
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Used to catch errors thrown by async `jose` functions and map to our own error types.
|
|
94
|
+
* This method will **always** throw an error, so it's return type is `never`.
|
|
95
|
+
*/
|
|
96
|
+
function mapAndThrowJoseErrors(error) {
|
|
97
|
+
if (error instanceof jose_1.errors.JWTExpired) {
|
|
98
|
+
throw new InvalidAuthTokenError('Authentication token expired');
|
|
99
|
+
}
|
|
100
|
+
else if (error instanceof jose_1.errors.JWTClaimValidationFailed || error instanceof jose_1.errors.JWTInvalid) {
|
|
101
|
+
throw new InvalidAuthTokenError('Authentication token is invalid');
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
throw new InvalidAuthTokenError('Failed to verify authentication token');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function createPrivyAppJWKS({ appId, apiUrl, headers, verificationKeyOverride, }) {
|
|
108
|
+
if (verificationKeyOverride !== undefined) {
|
|
109
|
+
// Use a closure to cache the verification key once imported
|
|
110
|
+
let verificationKey;
|
|
111
|
+
return async () => {
|
|
112
|
+
if (verificationKey === undefined) {
|
|
113
|
+
try {
|
|
114
|
+
verificationKey = await (0, jose_1.importSPKI)(verificationKeyOverride, JWT_ALGORITHM);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new InvalidAuthTokenError('Failed to import the provided verification key override');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return verificationKey;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const url = new URL(`${apiUrl}/v1/apps/${appId}/jwks.json`);
|
|
124
|
+
return (0, jose_1.createRemoteJWKSet)(url, {
|
|
125
|
+
cacheMaxAge: 60 * 60 * 1000, // 60 minutes
|
|
126
|
+
cooldownDuration: 10 * 60 * 1000, // 10 minutes
|
|
127
|
+
headers,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=auth.js.map
|
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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"}
|
package/lib/cryptography.d.mts
CHANGED
|
@@ -5,4 +5,7 @@ export declare namespace HPKESender {
|
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
7
|
export declare function setupHPKESender(): Promise<HPKESender>;
|
|
8
|
+
/** This prefix is no longer used, but we need to support existing keys */
|
|
9
|
+
export declare const WALLET_API_PRIVATE_KEY_PREFIX = "wallet-api:";
|
|
10
|
+
export declare const AUTHORIZATION_PRIVATE_KEY_PREFIX = "wallet-auth:";
|
|
8
11
|
//# sourceMappingURL=cryptography.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cryptography.d.mts","sourceRoot":"","sources":["../src/lib/cryptography.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cryptography.d.mts","sourceRoot":"","sources":["../src/lib/cryptography.ts"],"names":[],"mappings":"AAmFA,yBAAiB,UAAU,CAAC;IAC1B,UAAiB,oBAAoB;QACnC,UAAU,EAAE,UAAU,CAAC;QACvB,eAAe,EAAE,UAAU,CAAC;KAC7B;CACF;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,CAsB3D;AAED,0EAA0E;AAC1E,eAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAC3D,eAAO,MAAM,gCAAgC,iBAAiB,CAAC"}
|
package/lib/cryptography.d.ts
CHANGED
|
@@ -5,4 +5,7 @@ export declare namespace HPKESender {
|
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
7
|
export declare function setupHPKESender(): Promise<HPKESender>;
|
|
8
|
+
/** This prefix is no longer used, but we need to support existing keys */
|
|
9
|
+
export declare const WALLET_API_PRIVATE_KEY_PREFIX = "wallet-api:";
|
|
10
|
+
export declare const AUTHORIZATION_PRIVATE_KEY_PREFIX = "wallet-auth:";
|
|
8
11
|
//# sourceMappingURL=cryptography.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cryptography.d.ts","sourceRoot":"","sources":["../src/lib/cryptography.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cryptography.d.ts","sourceRoot":"","sources":["../src/lib/cryptography.ts"],"names":[],"mappings":"AAmFA,yBAAiB,UAAU,CAAC;IAC1B,UAAiB,oBAAoB;QACnC,UAAU,EAAE,UAAU,CAAC;QACvB,eAAe,EAAE,UAAU,CAAC;KAC7B;CACF;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,CAsB3D;AAED,0EAA0E;AAC1E,eAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAC3D,eAAO,MAAM,gCAAgC,iBAAiB,CAAC"}
|
package/lib/cryptography.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AUTHORIZATION_PRIVATE_KEY_PREFIX = exports.WALLET_API_PRIVATE_KEY_PREFIX = void 0;
|
|
3
4
|
exports.importPKCS8PrivateKey = importPKCS8PrivateKey;
|
|
4
5
|
exports.setupHPKERecipient = setupHPKERecipient;
|
|
5
6
|
exports.setupHPKESender = setupHPKESender;
|
|
@@ -14,8 +15,11 @@ const nist_1 = require("@noble/curves/nist");
|
|
|
14
15
|
* @internal
|
|
15
16
|
*/
|
|
16
17
|
function importPKCS8PrivateKey(privateKey) {
|
|
18
|
+
const strippedPrivateKey = privateKey
|
|
19
|
+
.replace(exports.AUTHORIZATION_PRIVATE_KEY_PREFIX, '')
|
|
20
|
+
.replace(exports.WALLET_API_PRIVATE_KEY_PREFIX, '');
|
|
17
21
|
// We fall back to `Buffer` here as Uint8Array.fromBase64 is not widely supported yet
|
|
18
|
-
const pkcs8Bytes = Buffer.from(
|
|
22
|
+
const pkcs8Bytes = Buffer.from(strippedPrivateKey, 'base64');
|
|
19
23
|
const privateKeyStart = pkcs8Bytes.indexOf(Buffer.from([0x04, 0x20]));
|
|
20
24
|
if (privateKeyStart === -1) {
|
|
21
25
|
throw new Error('Invalid wallet authorization private key');
|
|
@@ -69,4 +73,7 @@ async function setupHPKESender() {
|
|
|
69
73
|
},
|
|
70
74
|
};
|
|
71
75
|
}
|
|
76
|
+
/** This prefix is no longer used, but we need to support existing keys */
|
|
77
|
+
exports.WALLET_API_PRIVATE_KEY_PREFIX = 'wallet-api:';
|
|
78
|
+
exports.AUTHORIZATION_PRIVATE_KEY_PREFIX = 'wallet-auth:';
|
|
72
79
|
//# sourceMappingURL=cryptography.js.map
|
package/lib/cryptography.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cryptography.js","sourceRoot":"","sources":["../src/lib/cryptography.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cryptography.js","sourceRoot":"","sources":["../src/lib/cryptography.ts"],"names":[],"mappings":"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"}
|
package/lib/cryptography.mjs
CHANGED
|
@@ -9,8 +9,11 @@ import { p256 } from '@noble/curves/nist';
|
|
|
9
9
|
* @internal
|
|
10
10
|
*/
|
|
11
11
|
export function importPKCS8PrivateKey(privateKey) {
|
|
12
|
+
const strippedPrivateKey = privateKey
|
|
13
|
+
.replace(AUTHORIZATION_PRIVATE_KEY_PREFIX, '')
|
|
14
|
+
.replace(WALLET_API_PRIVATE_KEY_PREFIX, '');
|
|
12
15
|
// We fall back to `Buffer` here as Uint8Array.fromBase64 is not widely supported yet
|
|
13
|
-
const pkcs8Bytes = Buffer.from(
|
|
16
|
+
const pkcs8Bytes = Buffer.from(strippedPrivateKey, 'base64');
|
|
14
17
|
const privateKeyStart = pkcs8Bytes.indexOf(Buffer.from([0x04, 0x20]));
|
|
15
18
|
if (privateKeyStart === -1) {
|
|
16
19
|
throw new Error('Invalid wallet authorization private key');
|
|
@@ -64,4 +67,7 @@ export async function setupHPKESender() {
|
|
|
64
67
|
},
|
|
65
68
|
};
|
|
66
69
|
}
|
|
70
|
+
/** This prefix is no longer used, but we need to support existing keys */
|
|
71
|
+
export const WALLET_API_PRIVATE_KEY_PREFIX = 'wallet-api:';
|
|
72
|
+
export const AUTHORIZATION_PRIVATE_KEY_PREFIX = 'wallet-auth:';
|
|
67
73
|
//# sourceMappingURL=cryptography.mjs.map
|
package/lib/cryptography.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cryptography.mjs","sourceRoot":"","sources":["../src/lib/cryptography.ts"],"names":[],"mappings":"OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB;OAClD,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY;OAClE,EAAE,IAAI,EAAE,MAAM,oBAAoB;AAGzC;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,qFAAqF;IACrF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"cryptography.mjs","sourceRoot":"","sources":["../src/lib/cryptography.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"}
|