@crossmint/client-sdk-auth 1.0.0 → 1.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/dist/CrossmintAuthClient.cjs +2 -2
- package/dist/CrossmintAuthClient.d.cts +3 -3
- package/dist/CrossmintAuthClient.d.ts +3 -3
- package/dist/CrossmintAuthClient.js +1 -1
- package/dist/chunk-5H2QWRZD.js +270 -0
- package/dist/chunk-5H2QWRZD.js.map +1 -0
- package/dist/chunk-M4V2KE2Y.cjs +270 -0
- package/dist/chunk-M4V2KE2Y.cjs.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/src/CrossmintAuthClient.ts +144 -97
- package/dist/chunk-7YATBCAU.js +0 -229
- package/dist/chunk-7YATBCAU.js.map +0 -1
- package/dist/chunk-ILL57KWX.cjs +0 -229
- package/dist/chunk-ILL57KWX.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkM4V2KE2Ycjs = require('./chunk-M4V2KE2Y.cjs');
|
|
4
4
|
require('./chunk-VQ3HTIQ3.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
@@ -25,5 +25,5 @@ var _commonsdkbase = require('@crossmint/common-sdk-base');
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
exports.CrossmintAuth =
|
|
28
|
+
exports.CrossmintAuth = _chunkM4V2KE2Ycjs.CrossmintAuthClient; exports.TIME_BEFORE_EXPIRING_JWT_IN_SECONDS = _chunkTIUX4OOQcjs.TIME_BEFORE_EXPIRING_JWT_IN_SECONDS; exports.createCrossmint = _commonsdkbase.createCrossmint; exports.deleteCookie = _chunkBGMXXFQ4cjs.deleteCookie; exports.getCookie = _chunkBGMXXFQ4cjs.getCookie; exports.getJWTExpiration = _chunkQY4RIGNMcjs.getJWTExpiration; exports.setCookie = _chunkBGMXXFQ4cjs.setCookie;
|
|
29
29
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crossmint/client-sdk-auth",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"repository": "https://github.com/Crossmint/crossmint-sdk",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Paella Labs Inc",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"jwt-decode": "4.0.0",
|
|
23
23
|
"@farcaster/auth-kit": "0.6.0",
|
|
24
24
|
"@crossmint/client-sdk-base": "1.3.2",
|
|
25
|
-
"@crossmint/common-sdk-auth": "1.0.
|
|
25
|
+
"@crossmint/common-sdk-auth": "1.0.1",
|
|
26
26
|
"@crossmint/common-sdk-base": "0.3.0"
|
|
27
27
|
},
|
|
28
28
|
"scripts": {
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type AuthMaterialWithUser,
|
|
5
5
|
CROSSMINT_API_VERSION,
|
|
6
6
|
CrossmintAuth,
|
|
7
|
+
CrossmintAuthenticationError,
|
|
7
8
|
type CrossmintAuthOptions,
|
|
8
9
|
type OAuthProvider,
|
|
9
10
|
REFRESH_TOKEN_PREFIX,
|
|
@@ -40,14 +41,21 @@ export class CrossmintAuthClient extends CrossmintAuth {
|
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
public async getUser() {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"Content-Type": "application/json",
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
try {
|
|
45
|
+
const response = await this.apiClient.get(`api/${CROSSMINT_API_VERSION}/sdk/auth/user`, {
|
|
46
|
+
headers: { "Content-Type": "application/json" },
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
throw await response.text();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return await response.json();
|
|
54
|
+
} catch (error) {
|
|
55
|
+
throw new CrossmintAuthenticationError(
|
|
56
|
+
`Failed to fetch user: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
public storeAuthMaterial(authMaterial: AuthMaterialWithUser) {
|
|
@@ -56,19 +64,21 @@ export class CrossmintAuthClient extends CrossmintAuth {
|
|
|
56
64
|
}
|
|
57
65
|
|
|
58
66
|
public async logout() {
|
|
59
|
-
//
|
|
67
|
+
// Store the old refresh token to pass it to the logout route before deleting the cookies
|
|
68
|
+
const oldRefreshToken = getCookie(REFRESH_TOKEN_PREFIX);
|
|
69
|
+
|
|
70
|
+
// Even if there's a server error, we want to clear the cookies and we do it first to load faster
|
|
71
|
+
deleteCookie(REFRESH_TOKEN_PREFIX);
|
|
72
|
+
deleteCookie(SESSION_PREFIX);
|
|
73
|
+
this.callbacks.onLogout?.();
|
|
60
74
|
try {
|
|
61
75
|
if (this.logoutRoute != null) {
|
|
62
76
|
await this.logoutFromCustomRoute();
|
|
63
|
-
} else {
|
|
64
|
-
await this.logoutFromDefaultRoute(
|
|
77
|
+
} else if (oldRefreshToken != null) {
|
|
78
|
+
await this.logoutFromDefaultRoute(oldRefreshToken);
|
|
65
79
|
}
|
|
66
80
|
} catch (error) {
|
|
67
81
|
console.error(error);
|
|
68
|
-
} finally {
|
|
69
|
-
deleteCookie(REFRESH_TOKEN_PREFIX);
|
|
70
|
-
deleteCookie(SESSION_PREFIX);
|
|
71
|
-
this.callbacks.onLogout?.();
|
|
72
82
|
}
|
|
73
83
|
}
|
|
74
84
|
|
|
@@ -100,107 +110,144 @@ export class CrossmintAuthClient extends CrossmintAuth {
|
|
|
100
110
|
}
|
|
101
111
|
|
|
102
112
|
public async getOAuthUrl(provider: OAuthProvider) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
"Content-Type": "application/json",
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
113
|
+
try {
|
|
114
|
+
const response = await this.apiClient.get(`${AUTH_SDK_ROOT_ENDPOINT}/social/${provider}/start`, {
|
|
115
|
+
headers: { "Content-Type": "application/json" },
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
throw await response.text();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const data = await response.json();
|
|
123
|
+
return data.oauthUrl;
|
|
124
|
+
} catch (error) {
|
|
125
|
+
throw new CrossmintAuthenticationError(
|
|
126
|
+
`Failed to get OAuth URL for provider ${provider}: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
127
|
+
);
|
|
128
|
+
}
|
|
111
129
|
}
|
|
112
130
|
|
|
113
131
|
public async sendEmailOtp(email: string) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
"Content-Type": "application/json",
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
132
|
+
try {
|
|
133
|
+
const response = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/otps/send`, {
|
|
134
|
+
headers: { "Content-Type": "application/json" },
|
|
135
|
+
body: JSON.stringify({ email }),
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
throw await response.text();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return await response.json();
|
|
143
|
+
} catch (error) {
|
|
144
|
+
throw new CrossmintAuthenticationError(
|
|
145
|
+
`Failed to send email OTP: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
146
|
+
);
|
|
147
|
+
}
|
|
122
148
|
}
|
|
123
149
|
|
|
124
150
|
public async confirmEmailOtp(email: string, emailId: string, token: string) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
"Content-Type": "application/json",
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
151
|
+
try {
|
|
152
|
+
const queryParams = new URLSearchParams({
|
|
153
|
+
email,
|
|
154
|
+
signinAuthenticationMethod: "email",
|
|
155
|
+
token,
|
|
156
|
+
locale: "en",
|
|
157
|
+
state: emailId,
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
const response = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {
|
|
161
|
+
headers: { "Content-Type": "application/json" },
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
if (!response.ok) {
|
|
165
|
+
throw await response.text();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const resData = await response.json();
|
|
169
|
+
return resData.oneTimeSecret;
|
|
170
|
+
} catch (error) {
|
|
171
|
+
throw new CrossmintAuthenticationError(
|
|
172
|
+
`Failed to confirm email OTP: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
173
|
+
);
|
|
174
|
+
}
|
|
144
175
|
}
|
|
145
176
|
|
|
146
177
|
public async signInWithFarcaster(data: UseSignInData) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
const result = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {
|
|
153
|
-
headers: {
|
|
154
|
-
"Content-Type": "application/json",
|
|
155
|
-
},
|
|
156
|
-
body: JSON.stringify({
|
|
157
|
-
...data,
|
|
158
|
-
domain: data.signatureParams.domain,
|
|
159
|
-
redirect: true,
|
|
178
|
+
try {
|
|
179
|
+
const queryParams = new URLSearchParams({
|
|
180
|
+
signinAuthenticationMethod: "farcaster",
|
|
160
181
|
callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`,
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const response = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {
|
|
185
|
+
headers: { "Content-Type": "application/json" },
|
|
186
|
+
body: JSON.stringify({
|
|
187
|
+
...data,
|
|
188
|
+
domain: data.signatureParams.domain,
|
|
189
|
+
redirect: true,
|
|
190
|
+
callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`,
|
|
191
|
+
}),
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
if (!response.ok) {
|
|
195
|
+
throw await response.text();
|
|
196
|
+
}
|
|
166
197
|
|
|
167
|
-
|
|
168
|
-
|
|
198
|
+
const resData = await response.json();
|
|
199
|
+
return resData.oneTimeSecret;
|
|
200
|
+
} catch (error) {
|
|
201
|
+
throw new CrossmintAuthenticationError(
|
|
202
|
+
`Failed to sign in with Farcaster: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
203
|
+
);
|
|
204
|
+
}
|
|
169
205
|
}
|
|
170
206
|
|
|
171
207
|
public async signInWithSmartWallet(address: string) {
|
|
172
|
-
|
|
173
|
-
signinAuthenticationMethod: "evm"
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
208
|
+
try {
|
|
209
|
+
const queryParams = new URLSearchParams({ signinAuthenticationMethod: "evm" });
|
|
210
|
+
const response = await this.apiClient.post(
|
|
211
|
+
`${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate/start?${queryParams}`,
|
|
212
|
+
{
|
|
213
|
+
headers: { "Content-Type": "application/json" },
|
|
214
|
+
body: JSON.stringify({ walletAddress: address }),
|
|
215
|
+
}
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
if (!response.ok) {
|
|
219
|
+
throw await response.text();
|
|
183
220
|
}
|
|
184
|
-
|
|
185
|
-
|
|
221
|
+
|
|
222
|
+
return await response.json();
|
|
223
|
+
} catch (error) {
|
|
224
|
+
throw new CrossmintAuthenticationError(
|
|
225
|
+
`Failed to initiate smart wallet sign in: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
226
|
+
);
|
|
227
|
+
}
|
|
186
228
|
}
|
|
187
229
|
|
|
188
230
|
public async authenticateSmartWallet(address: string, signature: string) {
|
|
189
|
-
|
|
190
|
-
signinAuthenticationMethod: "evm"
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
231
|
+
try {
|
|
232
|
+
const queryParams = new URLSearchParams({ signinAuthenticationMethod: "evm" });
|
|
233
|
+
const response = await this.apiClient.post(
|
|
234
|
+
`${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate?${queryParams}`,
|
|
235
|
+
{
|
|
236
|
+
headers: { "Content-Type": "application/json" },
|
|
237
|
+
body: JSON.stringify({ walletAddress: address, signature }),
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
throw await response.text();
|
|
201
243
|
}
|
|
202
|
-
|
|
203
|
-
|
|
244
|
+
|
|
245
|
+
return await response.json();
|
|
246
|
+
} catch (error) {
|
|
247
|
+
throw new CrossmintAuthenticationError(
|
|
248
|
+
`Failed to authenticate smart wallet: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
249
|
+
);
|
|
250
|
+
}
|
|
204
251
|
}
|
|
205
252
|
|
|
206
253
|
private async logoutFromCustomRoute(): Promise<Response> {
|
package/dist/chunk-7YATBCAU.js
DELETED
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
TIME_BEFORE_EXPIRING_JWT_IN_SECONDS
|
|
3
|
-
} from "./chunk-BMYZMMVR.js";
|
|
4
|
-
import {
|
|
5
|
-
deleteCookie,
|
|
6
|
-
getCookie,
|
|
7
|
-
setCookie
|
|
8
|
-
} from "./chunk-5JXPQKM4.js";
|
|
9
|
-
import {
|
|
10
|
-
getJWTExpiration
|
|
11
|
-
} from "./chunk-MLMLBCSI.js";
|
|
12
|
-
import {
|
|
13
|
-
__async,
|
|
14
|
-
__spreadProps,
|
|
15
|
-
__spreadValues
|
|
16
|
-
} from "./chunk-JPRRZPBL.js";
|
|
17
|
-
|
|
18
|
-
// src/CrossmintAuthClient.ts
|
|
19
|
-
import {
|
|
20
|
-
AUTH_SDK_ROOT_ENDPOINT,
|
|
21
|
-
CROSSMINT_API_VERSION,
|
|
22
|
-
CrossmintAuth,
|
|
23
|
-
REFRESH_TOKEN_PREFIX,
|
|
24
|
-
SESSION_PREFIX
|
|
25
|
-
} from "@crossmint/common-sdk-auth";
|
|
26
|
-
import { queueTask } from "@crossmint/client-sdk-base";
|
|
27
|
-
var CrossmintAuthClient = class _CrossmintAuthClient extends CrossmintAuth {
|
|
28
|
-
constructor(crossmint, apiClient, config = {}) {
|
|
29
|
-
var _a, _b;
|
|
30
|
-
super(crossmint, apiClient, config);
|
|
31
|
-
this.refreshTask = null;
|
|
32
|
-
this.isRefreshing = false;
|
|
33
|
-
this.callbacks = (_a = config.callbacks) != null ? _a : {};
|
|
34
|
-
this.logoutRoute = (_b = config.logoutRoute) != null ? _b : null;
|
|
35
|
-
}
|
|
36
|
-
static from(crossmint, config = {}) {
|
|
37
|
-
const authClient = new _CrossmintAuthClient(crossmint, CrossmintAuth.defaultApiClient(crossmint), config);
|
|
38
|
-
if (typeof window !== "undefined") {
|
|
39
|
-
authClient.handleRefreshAuthMaterial();
|
|
40
|
-
}
|
|
41
|
-
return authClient;
|
|
42
|
-
}
|
|
43
|
-
getUser() {
|
|
44
|
-
return __async(this, null, function* () {
|
|
45
|
-
const result = yield this.apiClient.get(`api/${CROSSMINT_API_VERSION}/sdk/auth/user`, {
|
|
46
|
-
headers: {
|
|
47
|
-
"Content-Type": "application/json"
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
const user = yield result.json();
|
|
51
|
-
return user;
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
storeAuthMaterial(authMaterial) {
|
|
55
|
-
setCookie(SESSION_PREFIX, authMaterial.jwt);
|
|
56
|
-
setCookie(REFRESH_TOKEN_PREFIX, authMaterial.refreshToken.secret, authMaterial.refreshToken.expiresAt);
|
|
57
|
-
}
|
|
58
|
-
logout() {
|
|
59
|
-
return __async(this, null, function* () {
|
|
60
|
-
var _a, _b;
|
|
61
|
-
try {
|
|
62
|
-
if (this.logoutRoute != null) {
|
|
63
|
-
yield this.logoutFromCustomRoute();
|
|
64
|
-
} else {
|
|
65
|
-
yield this.logoutFromDefaultRoute(getCookie(REFRESH_TOKEN_PREFIX));
|
|
66
|
-
}
|
|
67
|
-
} catch (error) {
|
|
68
|
-
console.error(error);
|
|
69
|
-
} finally {
|
|
70
|
-
deleteCookie(REFRESH_TOKEN_PREFIX);
|
|
71
|
-
deleteCookie(SESSION_PREFIX);
|
|
72
|
-
(_b = (_a = this.callbacks).onLogout) == null ? void 0 : _b.call(_a);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
handleRefreshAuthMaterial(refreshTokenSecret) {
|
|
77
|
-
return __async(this, null, function* () {
|
|
78
|
-
var _a, _b;
|
|
79
|
-
const refreshToken = refreshTokenSecret != null ? refreshTokenSecret : getCookie(REFRESH_TOKEN_PREFIX);
|
|
80
|
-
if (refreshToken == null && this.refreshRoute == null || this.isRefreshing) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
try {
|
|
84
|
-
this.isRefreshing = true;
|
|
85
|
-
const authMaterial = yield this.refreshAuthMaterial(refreshToken);
|
|
86
|
-
if (this.refreshRoute == null) {
|
|
87
|
-
this.storeAuthMaterial(authMaterial);
|
|
88
|
-
}
|
|
89
|
-
(_b = (_a = this.callbacks).onTokenRefresh) == null ? void 0 : _b.call(_a, authMaterial);
|
|
90
|
-
this.scheduleNextRefresh(authMaterial.jwt);
|
|
91
|
-
} catch (error) {
|
|
92
|
-
console.error(error);
|
|
93
|
-
this.logout();
|
|
94
|
-
} finally {
|
|
95
|
-
this.isRefreshing = false;
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
getOAuthUrl(provider) {
|
|
100
|
-
return __async(this, null, function* () {
|
|
101
|
-
const result = yield this.apiClient.get(`${AUTH_SDK_ROOT_ENDPOINT}/social/${provider}/start`, {
|
|
102
|
-
headers: {
|
|
103
|
-
"Content-Type": "application/json"
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
const data = yield result.json();
|
|
107
|
-
return data.oauthUrl;
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
sendEmailOtp(email) {
|
|
111
|
-
return __async(this, null, function* () {
|
|
112
|
-
const result = yield this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/otps/send`, {
|
|
113
|
-
headers: {
|
|
114
|
-
"Content-Type": "application/json"
|
|
115
|
-
},
|
|
116
|
-
body: JSON.stringify({ email })
|
|
117
|
-
});
|
|
118
|
-
return yield result.json();
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
confirmEmailOtp(email, emailId, token) {
|
|
122
|
-
return __async(this, null, function* () {
|
|
123
|
-
const queryParams = new URLSearchParams({
|
|
124
|
-
email,
|
|
125
|
-
signinAuthenticationMethod: "email",
|
|
126
|
-
token,
|
|
127
|
-
locale: "en",
|
|
128
|
-
state: emailId,
|
|
129
|
-
callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`
|
|
130
|
-
});
|
|
131
|
-
const result = yield this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {
|
|
132
|
-
headers: {
|
|
133
|
-
"Content-Type": "application/json"
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
const resData = yield result.json();
|
|
137
|
-
const callbackUrl = new URL(resData.callbackUrl);
|
|
138
|
-
return callbackUrl.searchParams.get("oneTimeSecret");
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
signInWithFarcaster(data) {
|
|
142
|
-
return __async(this, null, function* () {
|
|
143
|
-
const queryParams = new URLSearchParams({
|
|
144
|
-
signinAuthenticationMethod: "farcaster",
|
|
145
|
-
callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`
|
|
146
|
-
});
|
|
147
|
-
const result = yield this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {
|
|
148
|
-
headers: {
|
|
149
|
-
"Content-Type": "application/json"
|
|
150
|
-
},
|
|
151
|
-
body: JSON.stringify(__spreadProps(__spreadValues({}, data), {
|
|
152
|
-
domain: data.signatureParams.domain,
|
|
153
|
-
redirect: true,
|
|
154
|
-
callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`
|
|
155
|
-
}))
|
|
156
|
-
});
|
|
157
|
-
const resData = yield result.json();
|
|
158
|
-
const callbackUrl = new URL(resData.callbackUrl);
|
|
159
|
-
return callbackUrl.searchParams.get("oneTimeSecret");
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
signInWithSmartWallet(address) {
|
|
163
|
-
return __async(this, null, function* () {
|
|
164
|
-
const queryParams = new URLSearchParams({
|
|
165
|
-
signinAuthenticationMethod: "evm"
|
|
166
|
-
});
|
|
167
|
-
const result = yield this.apiClient.post(
|
|
168
|
-
`${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate/start?${queryParams}`,
|
|
169
|
-
{
|
|
170
|
-
headers: {
|
|
171
|
-
"Content-Type": "application/json"
|
|
172
|
-
},
|
|
173
|
-
body: JSON.stringify({ walletAddress: address })
|
|
174
|
-
}
|
|
175
|
-
);
|
|
176
|
-
return yield result.json();
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
authenticateSmartWallet(address, signature) {
|
|
180
|
-
return __async(this, null, function* () {
|
|
181
|
-
const queryParams = new URLSearchParams({
|
|
182
|
-
signinAuthenticationMethod: "evm",
|
|
183
|
-
callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`
|
|
184
|
-
});
|
|
185
|
-
const result = yield this.apiClient.post(
|
|
186
|
-
`${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate?${queryParams}`,
|
|
187
|
-
{
|
|
188
|
-
headers: {
|
|
189
|
-
"Content-Type": "application/json"
|
|
190
|
-
},
|
|
191
|
-
body: JSON.stringify({ walletAddress: address, signature })
|
|
192
|
-
}
|
|
193
|
-
);
|
|
194
|
-
return yield result.json();
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
logoutFromCustomRoute() {
|
|
198
|
-
return __async(this, null, function* () {
|
|
199
|
-
if (!this.logoutRoute) {
|
|
200
|
-
throw new Error("Custom logout route is not set");
|
|
201
|
-
}
|
|
202
|
-
return yield fetch(this.logoutRoute, { method: "POST" });
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
scheduleNextRefresh(jwt) {
|
|
206
|
-
const jwtExpiration = getJWTExpiration(jwt);
|
|
207
|
-
if (!jwtExpiration) {
|
|
208
|
-
throw new Error("Invalid JWT");
|
|
209
|
-
}
|
|
210
|
-
const currentTime = Date.now() / 1e3;
|
|
211
|
-
const timeToExpire = jwtExpiration - currentTime - TIME_BEFORE_EXPIRING_JWT_IN_SECONDS;
|
|
212
|
-
if (timeToExpire > 0) {
|
|
213
|
-
const endTime = Date.now() + timeToExpire * 1e3;
|
|
214
|
-
this.cancelScheduledRefresh();
|
|
215
|
-
this.refreshTask = queueTask(() => this.handleRefreshAuthMaterial(), endTime);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
cancelScheduledRefresh() {
|
|
219
|
-
if (this.refreshTask) {
|
|
220
|
-
this.refreshTask.cancel();
|
|
221
|
-
this.refreshTask = null;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
export {
|
|
227
|
-
CrossmintAuthClient
|
|
228
|
-
};
|
|
229
|
-
//# sourceMappingURL=chunk-7YATBCAU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CrossmintAuthClient.ts"],"sourcesContent":["import type { UseSignInData } from \"@farcaster/auth-kit\";\nimport {\n AUTH_SDK_ROOT_ENDPOINT,\n type AuthMaterialWithUser,\n CROSSMINT_API_VERSION,\n CrossmintAuth,\n type CrossmintAuthOptions,\n type OAuthProvider,\n REFRESH_TOKEN_PREFIX,\n SESSION_PREFIX,\n} from \"@crossmint/common-sdk-auth\";\nimport type { Crossmint, CrossmintApiClient } from \"@crossmint/common-sdk-base\";\nimport { type CancellableTask, queueTask } from \"@crossmint/client-sdk-base\";\nimport { deleteCookie, getCookie, getJWTExpiration, setCookie, TIME_BEFORE_EXPIRING_JWT_IN_SECONDS } from \"./utils\";\n\ntype CrossmintAuthClientConfig = CrossmintAuthOptions & {\n callbacks?: CrossmintAuthClientCallbacks;\n logoutRoute?: string;\n};\n\nexport class CrossmintAuthClient extends CrossmintAuth {\n private callbacks: CrossmintAuthClientCallbacks;\n private refreshTask: CancellableTask | null = null;\n private isRefreshing = false;\n private logoutRoute: string | null;\n\n private constructor(crossmint: Crossmint, apiClient: CrossmintApiClient, config: CrossmintAuthClientConfig = {}) {\n super(crossmint, apiClient, config);\n this.callbacks = config.callbacks ?? {};\n this.logoutRoute = config.logoutRoute ?? null;\n }\n\n public static from(crossmint: Crossmint, config: CrossmintAuthClientConfig = {}): CrossmintAuthClient {\n const authClient = new CrossmintAuthClient(crossmint, CrossmintAuth.defaultApiClient(crossmint), config);\n // In case an instance is created on the server, we can't refresh as this stores cookies\n if (typeof window !== \"undefined\") {\n authClient.handleRefreshAuthMaterial();\n }\n return authClient;\n }\n\n public async getUser() {\n const result = await this.apiClient.get(`api/${CROSSMINT_API_VERSION}/sdk/auth/user`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const user = await result.json();\n return user;\n }\n\n public storeAuthMaterial(authMaterial: AuthMaterialWithUser) {\n setCookie(SESSION_PREFIX, authMaterial.jwt);\n setCookie(REFRESH_TOKEN_PREFIX, authMaterial.refreshToken.secret, authMaterial.refreshToken.expiresAt);\n }\n\n public async logout() {\n // Even if there's a server error, we want to clear the cookies\n try {\n if (this.logoutRoute != null) {\n await this.logoutFromCustomRoute();\n } else {\n await this.logoutFromDefaultRoute(getCookie(REFRESH_TOKEN_PREFIX));\n }\n } catch (error) {\n console.error(error);\n } finally {\n deleteCookie(REFRESH_TOKEN_PREFIX);\n deleteCookie(SESSION_PREFIX);\n this.callbacks.onLogout?.();\n }\n }\n\n public async handleRefreshAuthMaterial(refreshTokenSecret?: string): Promise<void> {\n const refreshToken = refreshTokenSecret ?? getCookie(REFRESH_TOKEN_PREFIX);\n // If there is a custom refresh route, that endpoint will fetch the cookies itself\n if ((refreshToken == null && this.refreshRoute == null) || this.isRefreshing) {\n return;\n }\n\n try {\n this.isRefreshing = true;\n const authMaterial = await this.refreshAuthMaterial(refreshToken);\n\n // If a custom refresh route is set, storing in cookies is handled in the server\n if (this.refreshRoute == null) {\n this.storeAuthMaterial(authMaterial);\n }\n\n this.callbacks.onTokenRefresh?.(authMaterial);\n\n this.scheduleNextRefresh(authMaterial.jwt);\n } catch (error) {\n console.error(error);\n this.logout();\n } finally {\n this.isRefreshing = false;\n }\n }\n\n public async getOAuthUrl(provider: OAuthProvider) {\n const result = await this.apiClient.get(`${AUTH_SDK_ROOT_ENDPOINT}/social/${provider}/start`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const data = (await result.json()) as { oauthUrl: string };\n return data.oauthUrl;\n }\n\n public async sendEmailOtp(email: string) {\n const result = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/otps/send`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ email }),\n });\n\n return await result.json();\n }\n\n public async confirmEmailOtp(email: string, emailId: string, token: string) {\n const queryParams = new URLSearchParams({\n email,\n signinAuthenticationMethod: \"email\",\n token,\n locale: \"en\",\n state: emailId,\n callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`,\n });\n const result = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const resData = await result.json();\n const callbackUrl = new URL(resData.callbackUrl);\n\n // parse the oneTimeSecret from the callbackUrl response\n return callbackUrl.searchParams.get(\"oneTimeSecret\");\n }\n\n public async signInWithFarcaster(data: UseSignInData) {\n const queryParams = new URLSearchParams({\n signinAuthenticationMethod: \"farcaster\",\n callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`,\n });\n\n const result = await this.apiClient.post(`${AUTH_SDK_ROOT_ENDPOINT}/authenticate?${queryParams}`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n ...data,\n domain: data.signatureParams.domain,\n redirect: true,\n callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/callback?isPopup=false`,\n }),\n });\n\n const resData = await result.json();\n const callbackUrl = new URL(resData.callbackUrl);\n\n // parse the oneTimeSecret from the callbackUrl response\n return callbackUrl.searchParams.get(\"oneTimeSecret\");\n }\n\n public async signInWithSmartWallet(address: string) {\n const queryParams = new URLSearchParams({\n signinAuthenticationMethod: \"evm\",\n });\n\n const result = await this.apiClient.post(\n `${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate/start?${queryParams}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ walletAddress: address }),\n }\n );\n return await result.json();\n }\n\n public async authenticateSmartWallet(address: string, signature: string) {\n const queryParams = new URLSearchParams({\n signinAuthenticationMethod: \"evm\",\n callbackUrl: `${this.apiClient.baseUrl}/${AUTH_SDK_ROOT_ENDPOINT}/we-dont-actually-use-this-anymore`,\n });\n\n const result = await this.apiClient.post(\n `${AUTH_SDK_ROOT_ENDPOINT}/crypto_wallets/authenticate?${queryParams}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ walletAddress: address, signature }),\n }\n );\n return await result.json();\n }\n\n private async logoutFromCustomRoute(): Promise<Response> {\n if (!this.logoutRoute) {\n throw new Error(\"Custom logout route is not set\");\n }\n\n return await fetch(this.logoutRoute, { method: \"POST\" });\n }\n\n private scheduleNextRefresh(jwt: string): void {\n const jwtExpiration = getJWTExpiration(jwt);\n if (!jwtExpiration) {\n throw new Error(\"Invalid JWT\");\n }\n\n const currentTime = Date.now() / 1000;\n const timeToExpire = jwtExpiration - currentTime - TIME_BEFORE_EXPIRING_JWT_IN_SECONDS;\n\n if (timeToExpire > 0) {\n const endTime = Date.now() + timeToExpire * 1000;\n this.cancelScheduledRefresh();\n this.refreshTask = queueTask(() => this.handleRefreshAuthMaterial(), endTime);\n }\n }\n\n private cancelScheduledRefresh(): void {\n if (this.refreshTask) {\n this.refreshTask.cancel();\n this.refreshTask = null;\n }\n }\n}\n\ntype CrossmintAuthClientCallbacks = {\n onTokenRefresh?: (authMaterial: AuthMaterialWithUser) => void;\n onLogout?: () => void;\n};\n"],"mappings":"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","names":[]}
|