@springmicro/auth 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/.eslintrc.cjs +18 -18
  2. package/README.md +60 -60
  3. package/dist/Index-64ac63ff-ChMmeIY7.js +0 -0
  4. package/dist/Index-6c094240-hn_S7Xeg.js +0 -0
  5. package/dist/Web3Auth-CGD96zai.js +0 -0
  6. package/dist/alphawallet-B7eovdf-.js +0 -0
  7. package/dist/apexwallet-ysP20G9D.js +0 -0
  8. package/dist/atoken-BBnNTzcz.js +0 -0
  9. package/dist/bifrostwallet-CNNBO92h.js +0 -0
  10. package/dist/binance-DvPgAzCw.js +0 -0
  11. package/dist/bitget-DZOUrwgy.js +0 -0
  12. package/dist/bitpie-C_uxmEzw.js +0 -0
  13. package/dist/bitski-DpzkHNkv.js +0 -0
  14. package/dist/blockwallet-BL69cqkA.js +0 -0
  15. package/dist/brave-DnRzMQYW.js +0 -0
  16. package/dist/ccip-c78d2f16-DLcRlwod.js +0 -0
  17. package/dist/coin98wallet-CkFdOvXt.js +0 -0
  18. package/dist/coinbase-CaGNx5if.js +0 -0
  19. package/dist/core-9rK8tWud.js +0 -0
  20. package/dist/defiwallet-0AsgJBSy.js +0 -0
  21. package/dist/detected-CX_JZaUk.js +0 -0
  22. package/dist/echooo-CmaetT_Z.js +0 -0
  23. package/dist/enkrypt-BibtwvK7.js +0 -0
  24. package/dist/exodus-BxzkDWWP.js +0 -0
  25. package/dist/fordefi-CvKyVwhI.js +0 -0
  26. package/dist/foxwallet-D7c_LDTf.js +0 -0
  27. package/dist/frame-CDfNmjUy.js +0 -0
  28. package/dist/frontier-DqKNSj2z.js +0 -0
  29. package/dist/hashMessage-Bdgmx0rg.js +0 -0
  30. package/dist/huobiwallet-CxSwqa5L.js +0 -0
  31. package/dist/hyperpay-nmHE3WqM.js +0 -0
  32. package/dist/icon-2Zqy7pqQ.js +0 -0
  33. package/dist/icon-CGWI1Ies.js +0 -0
  34. package/dist/icon-C_O4nprO.js +0 -0
  35. package/dist/icon-DbgmZCnU.js +0 -0
  36. package/dist/icon-Dbjb6jc5.js +0 -0
  37. package/dist/icon-cAd7RhSC.js +0 -0
  38. package/dist/imtoken-yENtOTS3.js +0 -0
  39. package/dist/index-021f6a62-Zz543EDB.js +0 -0
  40. package/dist/index-40a497ea-Bn2mC0r7.js +0 -0
  41. package/dist/index-62liFLUM.js +0 -0
  42. package/dist/index-BBx_mvyX.js +0 -0
  43. package/dist/index-C6leUA25.js +0 -0
  44. package/dist/index-CAVvArYp.js +0 -0
  45. package/dist/index-Ct7cFdFm.js +0 -0
  46. package/dist/index-DA32_Pfh.js +0 -0
  47. package/dist/index-Dna0rycp.js +0 -0
  48. package/dist/index.d.ts +0 -0
  49. package/dist/index.js +0 -0
  50. package/dist/index.umd.cjs +0 -0
  51. package/dist/infinitywallet-C8J4FUYw.js +0 -0
  52. package/dist/kayros-AIrUK1za.js +0 -0
  53. package/dist/keplr-CyLTca9B.js +0 -0
  54. package/dist/lif3wallet-C5D6r8pg.js +0 -0
  55. package/dist/liquality-nbCtErVq.js +0 -0
  56. package/dist/mathwallet-CWkivCXo.js +0 -0
  57. package/dist/meetone-kKmvI8md.js +0 -0
  58. package/dist/metamask-BN7yiDV1.js +0 -0
  59. package/dist/mykey-CQZ6UcLH.js +0 -0
  60. package/dist/native-FDN9oNjc.js +0 -0
  61. package/dist/number-C-98SESp.js +0 -0
  62. package/dist/okxwallet-CJLVogh2.js +0 -0
  63. package/dist/oneInch-CciyZ4Pz.js +0 -0
  64. package/dist/onekey-Dal8kYjU.js +0 -0
  65. package/dist/opera-DnKg-TJU.js +0 -0
  66. package/dist/ownbit-BshJUVuW.js +0 -0
  67. package/dist/phantom-CJ8dIcov.js +0 -0
  68. package/dist/rabby-D4thTcd6.js +0 -0
  69. package/dist/rainbow-mXld6yWV.js +0 -0
  70. package/dist/roninwallet-ZyYrd-D1.js +0 -0
  71. package/dist/safeheron-Eg1Jb29V.js +0 -0
  72. package/dist/safepal-DVIKy94N.js +0 -0
  73. package/dist/sequence-BS2IbtDg.js +0 -0
  74. package/dist/stablewallet-jyB079Wb.js +0 -0
  75. package/dist/status-FrAvQjfn.js +0 -0
  76. package/dist/subwallet-DMvFqKyY.js +0 -0
  77. package/dist/talisman-Bp8zUXqB.js +0 -0
  78. package/dist/tallywallet-B4OS9nIr.js +0 -0
  79. package/dist/tokenary-C7jjcbQa.js +0 -0
  80. package/dist/tokenpocket-9ZRPmAFA.js +0 -0
  81. package/dist/tp-V2em5bdl.js +0 -0
  82. package/dist/transactionRequest-be6a8ea9-CUKWo5mx.js +0 -0
  83. package/dist/trust-SgHubMq7.js +0 -0
  84. package/dist/xdefi-COVIyGz4.js +0 -0
  85. package/dist/zeal-DxHbDqm0.js +0 -0
  86. package/dist/zerion-BfW0UElc.js +0 -0
  87. package/dist/zodiacpilot-CrId6F4w.js +0 -0
  88. package/index.html +13 -13
  89. package/package.json +2 -2
  90. package/springmicro-auth-0.6.1.tgz +0 -0
  91. package/src/auth/config.ts +0 -0
  92. package/src/components/SignUp.tsx +0 -0
  93. package/src/components/forms/AgreementModal.tsx +88 -88
  94. package/src/components/forms/CaptchaController.tsx +94 -94
  95. package/src/components/forms/CaptchaModal.jsx +171 -171
  96. package/src/components/forms/CaptchaWidget.jsx +146 -146
  97. package/src/components/forms/PasswordChecker.ts +88 -88
  98. package/src/components/forms/SendCodeInput.tsx +0 -0
  99. package/src/components/forms/SignUpFormItem.tsx +0 -0
  100. package/src/components/forms/util/application-api.ts +0 -0
  101. package/src/components/forms/util/auth-api.ts +198 -198
  102. package/src/components/forms/util/auth-util.tsx +346 -346
  103. package/src/components/forms/util/core.ts +493 -493
  104. package/src/components/forms/util/invitation-api.ts +132 -132
  105. package/src/components/forms/util/provider.tsx +603 -603
  106. package/src/components/forms/util/user-api.ts +0 -0
  107. package/src/components/provider/AdfsLoginButton.jsx +38 -38
  108. package/src/components/provider/AlipayLoginButton.jsx +38 -38
  109. package/src/components/provider/AppleLoginButton.jsx +38 -38
  110. package/src/components/provider/AzureADB2CLoginButton.jsx +38 -38
  111. package/src/components/provider/AzureADLoginButton.jsx +38 -38
  112. package/src/components/provider/BaiduLoginButton.jsx +38 -38
  113. package/src/components/provider/BilibiliLoginButton.jsx +37 -37
  114. package/src/components/provider/CasdoorLoginButton.jsx +38 -38
  115. package/src/components/provider/DingTalkLoginButton.jsx +37 -37
  116. package/src/components/provider/DouyinLoginButton.jsx +38 -38
  117. package/src/components/provider/FacebookLoginButton.jsx +37 -37
  118. package/src/components/provider/GitHubLoginButton.jsx +37 -37
  119. package/src/components/provider/GitLabLoginButton.jsx +38 -38
  120. package/src/components/provider/GiteeLoginButton.jsx +34 -34
  121. package/src/components/provider/GoogleLoginButton.jsx +68 -68
  122. package/src/components/provider/InfoflowLoginButton.jsx +38 -38
  123. package/src/components/provider/LarkLoginButton.jsx +38 -38
  124. package/src/components/provider/LinkedInLoginButton.jsx +37 -37
  125. package/src/components/provider/LoginButton.jsx +33 -33
  126. package/src/components/provider/OktaLoginButton.jsx +38 -38
  127. package/src/components/provider/Provider.jsx +3 -3
  128. package/src/components/provider/ProviderButton.jsx +327 -327
  129. package/src/components/provider/QqLoginButton.jsx +31 -31
  130. package/src/components/provider/SelfLoginButton.jsx +47 -47
  131. package/src/components/provider/SlackLoginButton.jsx +38 -38
  132. package/src/components/provider/SteamLoginButton.jsx +38 -38
  133. package/src/components/provider/WeComLoginButton.jsx +34 -34
  134. package/src/components/provider/Web3Auth.jsx +365 -365
  135. package/src/components/provider/WechatLoginButton.jsx +37 -37
  136. package/src/components/provider/WeiboLoginButton.jsx +34 -34
  137. package/src/components/util.tsx +0 -0
  138. package/src/i18n/en/signup.json +48 -48
  139. package/src/i18n/index.ts +17 -17
  140. package/src/index.tsx +0 -0
  141. package/src/vite-env.d.ts +1 -1
  142. package/tsconfig.json +23 -23
  143. package/tsconfig.node.json +10 -10
  144. package/vite.config.ts +33 -33
@@ -1,365 +1,365 @@
1
- // // Copyright 2023 The Casdoor Authors. All Rights Reserved.
2
- // //
3
- // // Licensed under the Apache License, Version 2.0 (the "License");
4
- // // you may not use this file except in compliance with the License.
5
- // // You may obtain a copy of the License at
6
- // //
7
- // // http://www.apache.org/licenses/LICENSE-2.0
8
- // //
9
- // // Unless required by applicable law or agreed to in writing, software
10
- // // distributed under the License is distributed on an "AS IS" BASIS,
11
- // // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- // // See the License for the specific language governing permissions and
13
- // // limitations under the License.
14
-
15
- import * as Setting from "../forms/util/core";
16
-
17
- import i18next from "i18next";
18
- import { v4 as uuidv4 } from "uuid";
19
- import {
20
- SignTypedDataVersion,
21
- recoverTypedSignature,
22
- } from "@metamask/eth-sig-util";
23
- import { getAuthUrl } from "../forms/util/provider";
24
- import { Buffer } from "buffer";
25
- import Onboard from "@web3-onboard/core";
26
- import injectedModule from "@web3-onboard/injected-wallets";
27
- import infinityWalletModule from "@web3-onboard/infinity-wallet";
28
- // import sequenceModule from "@web3-onboard/sequence";
29
- import trustModule from "@web3-onboard/trust";
30
- import frontierModule from "@web3-onboard/frontier";
31
- import tahoModule from "@web3-onboard/taho";
32
- import coinbaseModule from "@web3-onboard/coinbase";
33
- import gnosisModule from "@web3-onboard/gnosis";
34
- // import keystoneModule from "@web3-onboard/keystone";
35
- // import keepkeyModule from "@web3-onboard/keepkey";
36
- // import dcentModule from "@web3-onboard/dcent";
37
- // import ledgerModule from "@web3-onboard/ledger";
38
- // import trezorModule from "@web3-onboard/trezor";
39
- // import walletConnectModule from "@web3-onboard/walletconnect";
40
- // import fortmaticModule from "@web3-onboard/fortmatic";
41
- // import portisModule from "@web3-onboard/portis";
42
- // import magicModule from "@web3-onboard/magic";
43
-
44
- global.Buffer = Buffer;
45
-
46
- export function generateNonce() {
47
- const nonce = uuidv4();
48
- return nonce;
49
- }
50
-
51
- export function getWeb3AuthTokenKey(address) {
52
- return `Web3AuthToken_${address}`;
53
- }
54
-
55
- export function setWeb3AuthToken(token) {
56
- const key = getWeb3AuthTokenKey(token.address);
57
- localStorage.setItem(key, JSON.stringify(token));
58
- }
59
-
60
- export function getWeb3AuthToken(address) {
61
- const key = getWeb3AuthTokenKey(address);
62
- return JSON.parse(localStorage.getItem(key));
63
- }
64
-
65
- export function delWeb3AuthToken(address) {
66
- const key = getWeb3AuthTokenKey(address);
67
- localStorage.removeItem(key);
68
- }
69
-
70
- export function clearWeb3AuthToken() {
71
- const keys = Object.keys(localStorage);
72
- keys.forEach((key) => {
73
- if (key.startsWith("Web3AuthToken_")) {
74
- localStorage.removeItem(key);
75
- }
76
- });
77
- }
78
-
79
- export function detectMetaMaskPlugin() {
80
- // check if ethereum extension MetaMask is installed
81
- return window.ethereum && window.ethereum.isMetaMask;
82
- }
83
-
84
- export function requestEthereumAccount() {
85
- const method = "eth_requestAccounts";
86
- const selectedAccount = window.ethereum
87
- .request({ method })
88
- .then((accounts) => {
89
- return accounts[0];
90
- });
91
- return selectedAccount;
92
- }
93
-
94
- export function signEthereumTypedData(from, nonce) {
95
- // https://docs.metamask.io/wallet/how-to/sign-data/
96
- const date = new Date();
97
- const typedData = JSON.stringify({
98
- domain: {
99
- chainId: window.ethereum.chainId,
100
- name: "Casdoor",
101
- version: "1",
102
- },
103
- message: {
104
- prompt:
105
- "In order to authenticate to this website, sign this request and your public address will be sent to the server in a verifiable way.",
106
- nonce: nonce,
107
- createAt: `${date.toLocaleString()}`,
108
- },
109
- primaryType: "AuthRequest",
110
- types: {
111
- EIP712Domain: [
112
- { name: "name", type: "string" },
113
- { name: "version", type: "string" },
114
- { name: "chainId", type: "uint256" },
115
- ],
116
- AuthRequest: [
117
- { name: "prompt", type: "string" },
118
- { name: "nonce", type: "string" },
119
- { name: "createAt", type: "string" },
120
- ],
121
- },
122
- });
123
-
124
- const method = "eth_signTypedData_v4";
125
- const params = [from, typedData];
126
-
127
- return window.ethereum.request({ method, params }).then((sign) => {
128
- return {
129
- address: from,
130
- createAt: Math.floor(date.getTime() / 1000),
131
- typedData: typedData,
132
- signature: sign,
133
- };
134
- });
135
- }
136
-
137
- export function checkEthereumSignedTypedData(token) {
138
- if (token === undefined || token === null) {
139
- return false;
140
- }
141
- if (token.address && token.typedData && token.signature) {
142
- const recoveredAddr = recoverTypedSignature({
143
- data: JSON.parse(token.typedData),
144
- signature: token.signature,
145
- version: SignTypedDataVersion.V4,
146
- });
147
- // const recoveredAddr = token.address;
148
- return recoveredAddr === token.address;
149
- // return toChecksumAddress(recoveredAddr) === toChecksumAddress(token.address);
150
- }
151
- return false;
152
- }
153
-
154
- export async function authViaMetaMask(application, provider, method) {
155
- if (!detectMetaMaskPlugin()) {
156
- Setting.showMessage(
157
- "error",
158
- `${i18next.t("login:MetaMask plugin not detected")}`
159
- );
160
- return;
161
- }
162
- try {
163
- const account = await requestEthereumAccount();
164
- let token = getWeb3AuthToken(account);
165
- if (!checkEthereumSignedTypedData(token)) {
166
- const nonce = generateNonce();
167
- token = await signEthereumTypedData(account, nonce);
168
- setWeb3AuthToken(token);
169
- }
170
- const redirectUri = `${getAuthUrl(
171
- application,
172
- provider,
173
- method
174
- )}&web3AuthTokenKey=${getWeb3AuthTokenKey(account)}`;
175
- Setting.goToLink(redirectUri);
176
- } catch (err) {
177
- Setting.showMessage(
178
- "error",
179
- `${i18next.t("login:Failed to obtain MetaMask authorization")}: ${
180
- err.message
181
- }`
182
- );
183
- }
184
- }
185
-
186
- const web3Wallets = {
187
- // injected wallets
188
- injected: {
189
- label: "Injected",
190
- wallet: injectedModule(),
191
- },
192
- // sdk wallets
193
- coinbase: {
194
- label: "Coinbase",
195
- wallet: coinbaseModule(),
196
- },
197
- trust: {
198
- label: "Trust",
199
- wallet: trustModule(),
200
- },
201
- gnosis: {
202
- label: "Gnosis",
203
- wallet: gnosisModule(),
204
- },
205
- // Broken
206
- // sequence: {
207
- // label: "Sequence",
208
- // wallet: sequenceModule(),
209
- // },
210
- taho: {
211
- label: "Taho",
212
- wallet: tahoModule(),
213
- },
214
- frontier: {
215
- label: "Frontier",
216
- wallet: frontierModule(),
217
- },
218
- infinityWallet: {
219
- label: "Infinity Wallet",
220
- wallet: infinityWalletModule(),
221
- },
222
- // hardware wallets
223
- // keystone: {
224
- // label: "Keystone",
225
- // wallet: keystoneModule(),
226
- // },
227
- // keepkey: {
228
- // label: "KeepKey",
229
- // wallet: keepkeyModule(),
230
- // },
231
- // dcent: {
232
- // label: "D'CENT",
233
- // wallet: dcentModule(),
234
- // },
235
-
236
- // some wallet need custome `apiKey` or `projectId` configure item
237
- // const magic = magicModule({
238
- // apiKey: "magicApiKey",
239
- // });
240
- // const fortmatic = fortmaticModule({
241
- // apiKey: "fortmaticApiKey",
242
- // });
243
- // const portis = portisModule({
244
- // apiKey: "portisApiKey",
245
- // });
246
- // const ledger = ledgerModule({
247
- // projectId: "ledgerProjectId"
248
- // });
249
- // const walletConnect = walletConnectModule({
250
- // projectId: "walletConnectProjectId",
251
- // });
252
- };
253
-
254
- export function getWeb3OnboardWalletsOptions() {
255
- return Object.entries(web3Wallets).map(([key, value]) => ({
256
- label: value.label,
257
- value: key,
258
- }));
259
- }
260
-
261
- function getWeb3OnboardWallets(options) {
262
- if (options === null || options === undefined || !Array.isArray(options)) {
263
- return [];
264
- }
265
- return options.map((walletType) => {
266
- if (walletType && web3Wallets[walletType]?.wallet) {
267
- return web3Wallets[walletType]?.wallet;
268
- }
269
- });
270
- }
271
-
272
- export function initWeb3Onboard(application, provider) {
273
- // init wallet
274
- // options = ["injected","coinbase",...]
275
- const options = JSON.parse(provider.metadata);
276
- const wallets = getWeb3OnboardWallets(options);
277
-
278
- // init chain
279
- // const InfuraKey = "2fa45cbe531e4e65be4fcbf408e651a8";
280
- const chains = [
281
- // {
282
- // id: "0x1",
283
- // token: "ETH",
284
- // label: "Ethereum Mainnet",
285
- // rpcUrl: `https://mainnet.infura.io/v3/${InfuraKey}`,
286
- // },
287
- // {
288
- // id: "0x5",
289
- // token: "ETH",
290
- // label: "Goerli",
291
- // rpcUrl: `https://goerli.infura.io/v3/${InfuraKey}`,
292
- // },
293
- {
294
- id: "0x13881",
295
- token: "MATIC",
296
- label: "Polygon - Mumbai",
297
- rpcUrl: "https://matic-mumbai.chainstacklabs.com",
298
- },
299
- {
300
- id: "0x38",
301
- token: "BNB",
302
- label: "Binance",
303
- rpcUrl: "https://bsc-dataseed.binance.org/",
304
- },
305
- {
306
- id: "0xA",
307
- token: "OETH",
308
- label: "Optimism",
309
- rpcUrl: "https://mainnet.optimism.io",
310
- },
311
- {
312
- id: "0xA4B1",
313
- token: "ARB-ETH",
314
- label: "Arbitrum",
315
- rpcUrl: "https://rpc.ankr.com/arbitrum",
316
- },
317
- ];
318
-
319
- const appMetadata = {
320
- name: "Casdoor",
321
- description: "Connect a wallet using Casdoor",
322
- recommendedInjectedWallets: [
323
- { name: "MetaMask", url: "https://metamask.io" },
324
- { name: "Coinbase", url: "https://www.coinbase.com/wallet" },
325
- ],
326
- };
327
-
328
- const web3Onboard = Onboard({
329
- wallets,
330
- chains,
331
- appMetadata,
332
- });
333
- return web3Onboard;
334
- }
335
-
336
- export async function authViaWeb3Onboard(application, provider, method) {
337
- try {
338
- const onboard = initWeb3Onboard(application, provider);
339
- const connectedWallets = await onboard.connectWallet();
340
- if (connectedWallets.length > 0) {
341
- const wallet = connectedWallets[0];
342
- const account = wallet.accounts[0];
343
- const address = account.address;
344
- const token = {
345
- address: address, // e.g."0xbd5444d31fe4139ee36bea29e43d4ac67ae276de"
346
- walletType: wallet.label, // e.g."MetaMask"
347
- createAt: Math.floor(new Date().getTime() / 1000),
348
- };
349
- setWeb3AuthToken(token);
350
- const redirectUri = `${getAuthUrl(
351
- application,
352
- provider,
353
- method
354
- )}&web3AuthTokenKey=${getWeb3AuthTokenKey(address)}`;
355
- Setting.goToLink(redirectUri);
356
- }
357
- } catch (err) {
358
- Setting.showMessage(
359
- "error",
360
- `${i18next.t(
361
- "login:Failed to obtain Web3-Onboard authorization"
362
- )}: ${err}`
363
- );
364
- }
365
- }
1
+ // // Copyright 2023 The Casdoor Authors. All Rights Reserved.
2
+ // //
3
+ // // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // // you may not use this file except in compliance with the License.
5
+ // // You may obtain a copy of the License at
6
+ // //
7
+ // // http://www.apache.org/licenses/LICENSE-2.0
8
+ // //
9
+ // // Unless required by applicable law or agreed to in writing, software
10
+ // // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // // See the License for the specific language governing permissions and
13
+ // // limitations under the License.
14
+
15
+ import * as Setting from "../forms/util/core";
16
+
17
+ import i18next from "i18next";
18
+ import { v4 as uuidv4 } from "uuid";
19
+ import {
20
+ SignTypedDataVersion,
21
+ recoverTypedSignature,
22
+ } from "@metamask/eth-sig-util";
23
+ import { getAuthUrl } from "../forms/util/provider";
24
+ import { Buffer } from "buffer";
25
+ import Onboard from "@web3-onboard/core";
26
+ import injectedModule from "@web3-onboard/injected-wallets";
27
+ import infinityWalletModule from "@web3-onboard/infinity-wallet";
28
+ // import sequenceModule from "@web3-onboard/sequence";
29
+ import trustModule from "@web3-onboard/trust";
30
+ import frontierModule from "@web3-onboard/frontier";
31
+ import tahoModule from "@web3-onboard/taho";
32
+ import coinbaseModule from "@web3-onboard/coinbase";
33
+ import gnosisModule from "@web3-onboard/gnosis";
34
+ // import keystoneModule from "@web3-onboard/keystone";
35
+ // import keepkeyModule from "@web3-onboard/keepkey";
36
+ // import dcentModule from "@web3-onboard/dcent";
37
+ // import ledgerModule from "@web3-onboard/ledger";
38
+ // import trezorModule from "@web3-onboard/trezor";
39
+ // import walletConnectModule from "@web3-onboard/walletconnect";
40
+ // import fortmaticModule from "@web3-onboard/fortmatic";
41
+ // import portisModule from "@web3-onboard/portis";
42
+ // import magicModule from "@web3-onboard/magic";
43
+
44
+ global.Buffer = Buffer;
45
+
46
+ export function generateNonce() {
47
+ const nonce = uuidv4();
48
+ return nonce;
49
+ }
50
+
51
+ export function getWeb3AuthTokenKey(address) {
52
+ return `Web3AuthToken_${address}`;
53
+ }
54
+
55
+ export function setWeb3AuthToken(token) {
56
+ const key = getWeb3AuthTokenKey(token.address);
57
+ localStorage.setItem(key, JSON.stringify(token));
58
+ }
59
+
60
+ export function getWeb3AuthToken(address) {
61
+ const key = getWeb3AuthTokenKey(address);
62
+ return JSON.parse(localStorage.getItem(key));
63
+ }
64
+
65
+ export function delWeb3AuthToken(address) {
66
+ const key = getWeb3AuthTokenKey(address);
67
+ localStorage.removeItem(key);
68
+ }
69
+
70
+ export function clearWeb3AuthToken() {
71
+ const keys = Object.keys(localStorage);
72
+ keys.forEach((key) => {
73
+ if (key.startsWith("Web3AuthToken_")) {
74
+ localStorage.removeItem(key);
75
+ }
76
+ });
77
+ }
78
+
79
+ export function detectMetaMaskPlugin() {
80
+ // check if ethereum extension MetaMask is installed
81
+ return window.ethereum && window.ethereum.isMetaMask;
82
+ }
83
+
84
+ export function requestEthereumAccount() {
85
+ const method = "eth_requestAccounts";
86
+ const selectedAccount = window.ethereum
87
+ .request({ method })
88
+ .then((accounts) => {
89
+ return accounts[0];
90
+ });
91
+ return selectedAccount;
92
+ }
93
+
94
+ export function signEthereumTypedData(from, nonce) {
95
+ // https://docs.metamask.io/wallet/how-to/sign-data/
96
+ const date = new Date();
97
+ const typedData = JSON.stringify({
98
+ domain: {
99
+ chainId: window.ethereum.chainId,
100
+ name: "Casdoor",
101
+ version: "1",
102
+ },
103
+ message: {
104
+ prompt:
105
+ "In order to authenticate to this website, sign this request and your public address will be sent to the server in a verifiable way.",
106
+ nonce: nonce,
107
+ createAt: `${date.toLocaleString()}`,
108
+ },
109
+ primaryType: "AuthRequest",
110
+ types: {
111
+ EIP712Domain: [
112
+ { name: "name", type: "string" },
113
+ { name: "version", type: "string" },
114
+ { name: "chainId", type: "uint256" },
115
+ ],
116
+ AuthRequest: [
117
+ { name: "prompt", type: "string" },
118
+ { name: "nonce", type: "string" },
119
+ { name: "createAt", type: "string" },
120
+ ],
121
+ },
122
+ });
123
+
124
+ const method = "eth_signTypedData_v4";
125
+ const params = [from, typedData];
126
+
127
+ return window.ethereum.request({ method, params }).then((sign) => {
128
+ return {
129
+ address: from,
130
+ createAt: Math.floor(date.getTime() / 1000),
131
+ typedData: typedData,
132
+ signature: sign,
133
+ };
134
+ });
135
+ }
136
+
137
+ export function checkEthereumSignedTypedData(token) {
138
+ if (token === undefined || token === null) {
139
+ return false;
140
+ }
141
+ if (token.address && token.typedData && token.signature) {
142
+ const recoveredAddr = recoverTypedSignature({
143
+ data: JSON.parse(token.typedData),
144
+ signature: token.signature,
145
+ version: SignTypedDataVersion.V4,
146
+ });
147
+ // const recoveredAddr = token.address;
148
+ return recoveredAddr === token.address;
149
+ // return toChecksumAddress(recoveredAddr) === toChecksumAddress(token.address);
150
+ }
151
+ return false;
152
+ }
153
+
154
+ export async function authViaMetaMask(application, provider, method) {
155
+ if (!detectMetaMaskPlugin()) {
156
+ Setting.showMessage(
157
+ "error",
158
+ `${i18next.t("login:MetaMask plugin not detected")}`
159
+ );
160
+ return;
161
+ }
162
+ try {
163
+ const account = await requestEthereumAccount();
164
+ let token = getWeb3AuthToken(account);
165
+ if (!checkEthereumSignedTypedData(token)) {
166
+ const nonce = generateNonce();
167
+ token = await signEthereumTypedData(account, nonce);
168
+ setWeb3AuthToken(token);
169
+ }
170
+ const redirectUri = `${getAuthUrl(
171
+ application,
172
+ provider,
173
+ method
174
+ )}&web3AuthTokenKey=${getWeb3AuthTokenKey(account)}`;
175
+ Setting.goToLink(redirectUri);
176
+ } catch (err) {
177
+ Setting.showMessage(
178
+ "error",
179
+ `${i18next.t("login:Failed to obtain MetaMask authorization")}: ${
180
+ err.message
181
+ }`
182
+ );
183
+ }
184
+ }
185
+
186
+ const web3Wallets = {
187
+ // injected wallets
188
+ injected: {
189
+ label: "Injected",
190
+ wallet: injectedModule(),
191
+ },
192
+ // sdk wallets
193
+ coinbase: {
194
+ label: "Coinbase",
195
+ wallet: coinbaseModule(),
196
+ },
197
+ trust: {
198
+ label: "Trust",
199
+ wallet: trustModule(),
200
+ },
201
+ gnosis: {
202
+ label: "Gnosis",
203
+ wallet: gnosisModule(),
204
+ },
205
+ // Broken
206
+ // sequence: {
207
+ // label: "Sequence",
208
+ // wallet: sequenceModule(),
209
+ // },
210
+ taho: {
211
+ label: "Taho",
212
+ wallet: tahoModule(),
213
+ },
214
+ frontier: {
215
+ label: "Frontier",
216
+ wallet: frontierModule(),
217
+ },
218
+ infinityWallet: {
219
+ label: "Infinity Wallet",
220
+ wallet: infinityWalletModule(),
221
+ },
222
+ // hardware wallets
223
+ // keystone: {
224
+ // label: "Keystone",
225
+ // wallet: keystoneModule(),
226
+ // },
227
+ // keepkey: {
228
+ // label: "KeepKey",
229
+ // wallet: keepkeyModule(),
230
+ // },
231
+ // dcent: {
232
+ // label: "D'CENT",
233
+ // wallet: dcentModule(),
234
+ // },
235
+
236
+ // some wallet need custome `apiKey` or `projectId` configure item
237
+ // const magic = magicModule({
238
+ // apiKey: "magicApiKey",
239
+ // });
240
+ // const fortmatic = fortmaticModule({
241
+ // apiKey: "fortmaticApiKey",
242
+ // });
243
+ // const portis = portisModule({
244
+ // apiKey: "portisApiKey",
245
+ // });
246
+ // const ledger = ledgerModule({
247
+ // projectId: "ledgerProjectId"
248
+ // });
249
+ // const walletConnect = walletConnectModule({
250
+ // projectId: "walletConnectProjectId",
251
+ // });
252
+ };
253
+
254
+ export function getWeb3OnboardWalletsOptions() {
255
+ return Object.entries(web3Wallets).map(([key, value]) => ({
256
+ label: value.label,
257
+ value: key,
258
+ }));
259
+ }
260
+
261
+ function getWeb3OnboardWallets(options) {
262
+ if (options === null || options === undefined || !Array.isArray(options)) {
263
+ return [];
264
+ }
265
+ return options.map((walletType) => {
266
+ if (walletType && web3Wallets[walletType]?.wallet) {
267
+ return web3Wallets[walletType]?.wallet;
268
+ }
269
+ });
270
+ }
271
+
272
+ export function initWeb3Onboard(application, provider) {
273
+ // init wallet
274
+ // options = ["injected","coinbase",...]
275
+ const options = JSON.parse(provider.metadata);
276
+ const wallets = getWeb3OnboardWallets(options);
277
+
278
+ // init chain
279
+ // const InfuraKey = "2fa45cbe531e4e65be4fcbf408e651a8";
280
+ const chains = [
281
+ // {
282
+ // id: "0x1",
283
+ // token: "ETH",
284
+ // label: "Ethereum Mainnet",
285
+ // rpcUrl: `https://mainnet.infura.io/v3/${InfuraKey}`,
286
+ // },
287
+ // {
288
+ // id: "0x5",
289
+ // token: "ETH",
290
+ // label: "Goerli",
291
+ // rpcUrl: `https://goerli.infura.io/v3/${InfuraKey}`,
292
+ // },
293
+ {
294
+ id: "0x13881",
295
+ token: "MATIC",
296
+ label: "Polygon - Mumbai",
297
+ rpcUrl: "https://matic-mumbai.chainstacklabs.com",
298
+ },
299
+ {
300
+ id: "0x38",
301
+ token: "BNB",
302
+ label: "Binance",
303
+ rpcUrl: "https://bsc-dataseed.binance.org/",
304
+ },
305
+ {
306
+ id: "0xA",
307
+ token: "OETH",
308
+ label: "Optimism",
309
+ rpcUrl: "https://mainnet.optimism.io",
310
+ },
311
+ {
312
+ id: "0xA4B1",
313
+ token: "ARB-ETH",
314
+ label: "Arbitrum",
315
+ rpcUrl: "https://rpc.ankr.com/arbitrum",
316
+ },
317
+ ];
318
+
319
+ const appMetadata = {
320
+ name: "Casdoor",
321
+ description: "Connect a wallet using Casdoor",
322
+ recommendedInjectedWallets: [
323
+ { name: "MetaMask", url: "https://metamask.io" },
324
+ { name: "Coinbase", url: "https://www.coinbase.com/wallet" },
325
+ ],
326
+ };
327
+
328
+ const web3Onboard = Onboard({
329
+ wallets,
330
+ chains,
331
+ appMetadata,
332
+ });
333
+ return web3Onboard;
334
+ }
335
+
336
+ export async function authViaWeb3Onboard(application, provider, method) {
337
+ try {
338
+ const onboard = initWeb3Onboard(application, provider);
339
+ const connectedWallets = await onboard.connectWallet();
340
+ if (connectedWallets.length > 0) {
341
+ const wallet = connectedWallets[0];
342
+ const account = wallet.accounts[0];
343
+ const address = account.address;
344
+ const token = {
345
+ address: address, // e.g."0xbd5444d31fe4139ee36bea29e43d4ac67ae276de"
346
+ walletType: wallet.label, // e.g."MetaMask"
347
+ createAt: Math.floor(new Date().getTime() / 1000),
348
+ };
349
+ setWeb3AuthToken(token);
350
+ const redirectUri = `${getAuthUrl(
351
+ application,
352
+ provider,
353
+ method
354
+ )}&web3AuthTokenKey=${getWeb3AuthTokenKey(address)}`;
355
+ Setting.goToLink(redirectUri);
356
+ }
357
+ } catch (err) {
358
+ Setting.showMessage(
359
+ "error",
360
+ `${i18next.t(
361
+ "login:Failed to obtain Web3-Onboard authorization"
362
+ )}: ${err}`
363
+ );
364
+ }
365
+ }