@abtnode/auth 1.16.24 → 1.16.25-beta-fe54d1bc

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.
@@ -9,8 +9,15 @@ const getNodeWallet = require('@abtnode/util/lib/get-app-wallet');
9
9
  const { getDisplayName, getBlockletAppIdList } = require('@blocklet/meta/lib/util');
10
10
  const { VC_TYPE_NODE_PASSPORT, PASSPORT_STATUS, NODE_DATA_DIR_NAME } = require('@abtnode/constant');
11
11
  const get = require('lodash/get');
12
+ const isFunction = require('lodash/isFunction');
12
13
  const { getUserAvatarUrl, getAppAvatarUrl, getServerAvatarUrl, extractUserAvatar } = require('@abtnode/util/lib/user');
13
14
  const { getWalletDid } = require('@blocklet/meta/lib/did-utils');
15
+ const { getSourceAppPid, getLoginProvider } = require('@blocklet/sdk/lib/util/login');
16
+ const {
17
+ getFederatedMaster,
18
+ shouldSyncFederated,
19
+ getUserAvatarUrl: getUserAvatarUrlForFederated,
20
+ } = require('./util/federated');
14
21
 
15
22
  const logger = require('./logger');
16
23
  const { messages, getUser, checkWalletVersion, getPassportStatusEndpoint } = require('./auth');
@@ -24,6 +31,7 @@ const {
24
31
  const verifySignature = require('./util/verify-signature');
25
32
 
26
33
  const createPassportSvg = require('./util/create-passport-svg');
34
+ const { getDidConnectVersion } = require('../../blocklet-services/api/util');
27
35
 
28
36
  const TEAM_TYPES = {
29
37
  BLOCKLET: 'blocklet',
@@ -150,7 +158,7 @@ const createLostPassportListRoute = ({ node, type }) => ({
150
158
  * Did Auth api for issue lost passport
151
159
  * @param {Enum} type node | blocklet
152
160
  */
153
- const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
161
+ const createLostPassportIssueRoute = ({ node, type, authServicePrefix, createToken }) => ({
154
162
  action: 'lost-passport-issue',
155
163
  authPrincipal: false,
156
164
  claims: [
@@ -210,7 +218,7 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
210
218
  },
211
219
  ],
212
220
 
213
- onAuth: async ({ claims, userDid, userPk, extraParams, updateSession, baseUrl, req }) => {
221
+ onAuth: async ({ claims, userDid, userPk, extraParams, updateSession, baseUrl, req, request }) => {
214
222
  const { locale = 'en', receiverDid, passportName } = extraParams;
215
223
 
216
224
  const { teamDid, issuerDidList, issuerName, issuerLogo, issuerWallet, passportColor, info, dataDir } =
@@ -316,6 +324,113 @@ const createLostPassportIssueRoute = ({ node, type, authServicePrefix }) => ({
316
324
  node
317
325
  );
318
326
 
327
+ if (isFunction(createToken)) {
328
+ if (type === TEAM_TYPES.BLOCKLET) {
329
+ const lastLoginIp = request.headers['x-real-ip'];
330
+ const ua = request.headers['user-agent'];
331
+ const walletOS = request.context.didwallet.os;
332
+ const sourceAppPid = getSourceAppPid(request);
333
+ const provider = getLoginProvider(request);
334
+
335
+ const currentUser = await node.getUser({
336
+ teamDid,
337
+ user: {
338
+ did: userDid,
339
+ },
340
+ options: {
341
+ enableConnectedAccount: true,
342
+ },
343
+ });
344
+ const connectAccount = { provider, did: userDid, pk: userPk };
345
+
346
+ const updatedUser = await node.loginUser({
347
+ teamDid,
348
+ user: {
349
+ did: currentUser.did,
350
+ pk: currentUser.pk,
351
+ locale,
352
+ passport,
353
+ sourceAppPid,
354
+ lastLoginIp,
355
+ connectedAccount: [connectAccount],
356
+ },
357
+ });
358
+
359
+ const blocklet = await request.getBlocklet();
360
+ const sessionConfig = blocklet.settings?.session || {};
361
+ const { secret } = await request.getBlockletInfo();
362
+ const userSessionDoc = await node.upsertUserSession({
363
+ teamDid,
364
+ visitorId: extraParams?.visitorId,
365
+ userDid,
366
+ appPid: teamDid,
367
+ passportId: passport?.id,
368
+ status: 'online',
369
+ ua,
370
+ lastLoginIp,
371
+ extra: {
372
+ walletOS,
373
+ },
374
+ });
375
+
376
+ if (shouldSyncFederated(sourceAppPid, blocklet)) {
377
+ const masterSite = getFederatedMaster(blocklet);
378
+ node
379
+ .syncFederated({
380
+ did: teamDid,
381
+ data: {
382
+ users: [
383
+ {
384
+ did: updatedUser.did,
385
+ pk: updatedUser.pk,
386
+ fullName: updatedUser.fullName,
387
+ email: updatedUser.email || '',
388
+ avatar: getUserAvatarUrlForFederated(updatedUser.avatar, blocklet),
389
+ connectedAccount: [connectAccount],
390
+ action: 'connectAccount',
391
+ sourceAppPid: sourceAppPid || masterSite.appPid,
392
+ },
393
+ ],
394
+ },
395
+ })
396
+ .then(() => {
397
+ node.syncUserSession({
398
+ teamDid,
399
+ userDid,
400
+ visitorId: userSessionDoc.visitorId,
401
+ passportId: passport?.id,
402
+ targetAppPid: sourceAppPid,
403
+ ua,
404
+ lastLoginIp,
405
+ extra: {
406
+ walletOS,
407
+ },
408
+ });
409
+ });
410
+ }
411
+ const { sessionToken, refreshToken } = createToken(
412
+ userDid,
413
+ {
414
+ secret,
415
+ passport,
416
+ role,
417
+ fullName: user.fullName,
418
+ provider,
419
+ // request.context.store.connectedWallet
420
+ walletOS,
421
+ },
422
+ { ...sessionConfig, didConnectVersion: getDidConnectVersion(req) }
423
+ );
424
+ await updateSession({ sessionToken, refreshToken }, true);
425
+ } else if (type === TEAM_TYPES.NODE) {
426
+ const sessionToken = createToken(userDid, {
427
+ passport,
428
+ role,
429
+ });
430
+ await updateSession({ sessionToken }, true);
431
+ }
432
+ }
433
+
319
434
  await updateSession({ passportId: vc.id });
320
435
 
321
436
  return {
@@ -0,0 +1,65 @@
1
+ const { WELLKNOWN_SERVICE_PATH_PREFIX, USER_AVATAR_URL_PREFIX, USER_AVATAR_PATH_PREFIX } = require('@abtnode/constant');
2
+ const pRetry = require('p-retry');
3
+ const { signV2 } = require('@arcblock/jwt');
4
+ const joinUrl = require('url-join');
5
+
6
+ const request = require('./request');
7
+
8
+ function isMaster(site) {
9
+ return site?.isMaster !== false;
10
+ }
11
+
12
+ function getUserAvatarUrl(avatar, blocklet) {
13
+ let avatarUrl = avatar;
14
+ if (avatar && avatar.startsWith(USER_AVATAR_URL_PREFIX)) {
15
+ avatarUrl = joinUrl(WELLKNOWN_SERVICE_PATH_PREFIX, USER_AVATAR_PATH_PREFIX, avatarUrl.split('/').slice(-1)[0]);
16
+
17
+ const appUrl = blocklet.environmentObj.BLOCKLET_APP_URL;
18
+ avatarUrl = joinUrl(appUrl, avatarUrl);
19
+ }
20
+ return avatarUrl;
21
+ }
22
+
23
+ function getFederatedMaster(blocklet) {
24
+ const { sites } = blocklet?.settings?.federated || {};
25
+ const masterSite = (sites || []).find((item) => isMaster(item));
26
+ return masterSite || null;
27
+ }
28
+
29
+ function shouldSyncFederated(sourceAppPid, blocklet) {
30
+ if (sourceAppPid) {
31
+ return true;
32
+ }
33
+
34
+ const masterSite = getFederatedMaster(blocklet);
35
+ return !!(masterSite && blocklet && masterSite.appPid === blocklet.appPid);
36
+ }
37
+
38
+ function findFederatedSite(blocklet, targetAppPid) {
39
+ const { sites } = blocklet?.settings?.federated || {};
40
+ const targetSite = (sites || []).find((item) => item.appPid === targetAppPid);
41
+ return targetSite || null;
42
+ }
43
+
44
+ async function callFederated({ site, permanentWallet, data, action }) {
45
+ const url = new URL(site.appUrl);
46
+ url.pathname = joinUrl(WELLKNOWN_SERVICE_PATH_PREFIX, `/api/federated/${action}`);
47
+ const result = await pRetry(
48
+ () =>
49
+ request.post(url.href, {
50
+ signer: permanentWallet.address,
51
+ data: signV2(permanentWallet.address, permanentWallet.secretKey, data),
52
+ }),
53
+ { retries: 3 }
54
+ );
55
+ return result.data;
56
+ }
57
+
58
+ module.exports = {
59
+ callFederated,
60
+ getUserAvatarUrl,
61
+ shouldSyncFederated,
62
+ getFederatedMaster,
63
+ findFederatedSite,
64
+ isMaster,
65
+ };
@@ -0,0 +1,10 @@
1
+ const axios = require('@abtnode/util/lib/axios');
2
+ const { version } = require('../../package.json');
3
+
4
+ module.exports =
5
+ process.env.NODE_ENV === 'test'
6
+ ? axios
7
+ : axios.create({
8
+ timeout: 10 * 1000,
9
+ headers: { 'User-Agent': `ABTNode/${version}`, 'x-blocklet-server-version': version },
10
+ });
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.24",
6
+ "version": "1.16.25-beta-fe54d1bc",
7
7
  "description": "Simple lib to manage auth in ABT Node",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -20,19 +20,21 @@
20
20
  "author": "linchen <linchen1987@foxmail.com> (http://github.com/linchen1987)",
21
21
  "license": "Apache-2.0",
22
22
  "dependencies": {
23
- "@abtnode/constant": "1.16.24",
24
- "@abtnode/logger": "1.16.24",
25
- "@abtnode/util": "1.16.24",
26
- "@arcblock/did": "1.18.110",
27
- "@arcblock/nft-display": "2.9.41",
28
- "@arcblock/validator": "^1.18.110",
29
- "@arcblock/vc": "1.18.110",
30
- "@blocklet/constant": "1.16.24",
31
- "@blocklet/meta": "1.16.24",
32
- "@ocap/client": "^1.18.110",
33
- "@ocap/mcrypto": "1.18.110",
34
- "@ocap/util": "1.18.110",
35
- "@ocap/wallet": "1.18.110",
23
+ "@abtnode/constant": "1.16.25-beta-fe54d1bc",
24
+ "@abtnode/logger": "1.16.25-beta-fe54d1bc",
25
+ "@abtnode/util": "1.16.25-beta-fe54d1bc",
26
+ "@arcblock/did": "1.18.113",
27
+ "@arcblock/jwt": "^1.18.113",
28
+ "@arcblock/nft-display": "2.9.42",
29
+ "@arcblock/validator": "^1.18.113",
30
+ "@arcblock/vc": "1.18.113",
31
+ "@blocklet/constant": "1.16.25-beta-fe54d1bc",
32
+ "@blocklet/meta": "1.16.25-beta-fe54d1bc",
33
+ "@blocklet/sdk": "1.16.25-beta-fe54d1bc",
34
+ "@ocap/client": "^1.18.113",
35
+ "@ocap/mcrypto": "1.18.113",
36
+ "@ocap/util": "1.18.113",
37
+ "@ocap/wallet": "1.18.113",
36
38
  "axios": "^0.27.2",
37
39
  "flat": "^5.0.2",
38
40
  "fs-extra": "^11.2.0",
@@ -49,5 +51,5 @@
49
51
  "devDependencies": {
50
52
  "jest": "^29.7.0"
51
53
  },
52
- "gitHead": "6cd6669cb3569f96433e18b1dac346432741a1a7"
54
+ "gitHead": "e9411b6ee3c482554c76fe91796560abeb0e56ad"
53
55
  }