@abtnode/blocklet-services 1.16.23-beta-7b5b0175 → 1.16.23-beta-06c3a221
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/api/libs/connect/session.js +420 -275
- package/api/services/auth/connect/connect-to-did-spaces-for-user.js +118 -0
- package/api/services/auth/index.js +6 -0
- package/api/util/blocklet-utils.js +14 -1
- package/api/util/index.js +7 -4
- package/dist/assets/{Add-EqOtL8nG.js → Add-yJOSofhS.js} +1 -1
- package/dist/assets/{Alert-1ldGO3RW.js → Alert-8z3IBaBE.js} +1 -1
- package/dist/assets/{ArrowDropDown-zgEYYex3.js → ArrowDropDown-oq6bnC5a.js} +1 -1
- package/dist/assets/{Avatar-nuRuqAkZ.js → Avatar-_iJamCVD.js} +1 -1
- package/dist/assets/{ButtonGroup-l7aQ7Vwd.js → ButtonGroup-_ql_Aibf.js} +1 -1
- package/dist/assets/CardContent-Ys0Vqtd2.js +1 -0
- package/dist/assets/{CheckCircle-cGMij8cW.js → CheckCircle-liPbTkS6.js} +1 -1
- package/dist/assets/{Checkbox-m6n_CNKl.js → Checkbox-Bx2RKhbj.js} +1 -1
- package/dist/assets/{ChevronRight-wwRZ3KD1.js → ChevronRight-NMNUHQcd.js} +1 -1
- package/dist/assets/{DeleteOutline-LwmqNqm9.js → DeleteOutline-e-pVPJ10.js} +1 -1
- package/dist/assets/{Done-8H9KmF_L.js → Done-W__OCydG.js} +1 -1
- package/dist/assets/{Download-R0Cwd7fp.js → Download-CRKeZxZn.js} +1 -1
- package/dist/assets/{Edit-XRUc2Tsd.js → Edit-LODr45Fi.js} +1 -1
- package/dist/assets/{EditIcon-ZY8nX5qR.js → EditIcon-LBnnkl6f.js} +1 -1
- package/dist/assets/{ExpandMore-OTVPX9R7.js → ExpandMore-gplG_N-e.js} +1 -1
- package/dist/assets/{FilterList-RDHyUvt7.js → FilterList-2hNiCvPk.js} +4 -4
- package/dist/assets/{FormControl-vBKIKzWB.js → FormControl-UoCRB4Jz.js} +1 -1
- package/dist/assets/{FormControlLabel-iMujz3Fk.js → FormControlLabel-JXaJatAY.js} +1 -1
- package/dist/assets/FormGroup-LYg6ohnS.js +1 -0
- package/dist/assets/{Google-neBo_j5-.js → Google-pA-zGfV6.js} +1 -1
- package/dist/assets/{Grid-binDOS5g.js → Grid-Cq0tl8Rn.js} +1 -1
- package/dist/assets/{Hidden-PxHUxz4A.js → Hidden-dLDh01VC.js} +1 -1
- package/dist/assets/{Icon-_HyghTJX.js → Icon-z5BPr8Nx.js} +1 -1
- package/dist/assets/{InfoOutlined-TK1NK3Yw.js → InfoOutlined-LvZcP6jX.js} +1 -1
- package/dist/assets/{InputAdornment-fzZwv4Hd.js → InputAdornment-i3kKzNb4.js} +1 -1
- package/dist/assets/{InputLabel-NkJVK6ai.js → InputLabel-evB6-1NR.js} +1 -1
- package/dist/assets/{LastPage-hGBuWt4f.js → LastPage--eJf1sYv.js} +1 -1
- package/dist/assets/{Launch-cUTO0lWp.js → Launch-H3hBPB77.js} +1 -1
- package/dist/assets/{LaunchOutlined-ennc4BMI.js → LaunchOutlined-Fi5DkFlC.js} +1 -1
- package/dist/assets/{ListItem-Vp53sGIz.js → ListItem-OwJ_bemn.js} +1 -1
- package/dist/assets/{LockIcon-ujEweQFk.js → LockIcon-8FiITHPK.js} +1 -1
- package/dist/assets/{Loop-DzDCCuKh.js → Loop-RkvrEzoc.js} +1 -1
- package/dist/assets/{MoreHoriz-LhZMdESP.js → MoreHoriz-Krld2BKo.js} +1 -1
- package/dist/assets/{MoreVert-lDh1ZArp.js → MoreVert-261tWqrz.js} +2 -2
- package/dist/assets/{OpenInNew-1SOTWyhJ.js → OpenInNew-LQ-81H0R.js} +1 -1
- package/dist/assets/{Pagination-hC4DNW_T.js → Pagination-7IbC2E1j.js} +2 -2
- package/dist/assets/{PlayArrow-P-rOBMrG.js → PlayArrow-jm3a4suc.js} +1 -1
- package/dist/assets/{RadioGroup-bjGsl5Wv.js → RadioGroup-D24cymg5.js} +1 -1
- package/dist/assets/{RevokeIcon-sZq3AOJs.js → RevokeIcon-WQMnKK0f.js} +1 -1
- package/dist/assets/{Search-YBYCMmsX.js → Search-vTBXAsZL.js} +1 -1
- package/dist/assets/{Select--VNN-coS.js → Select-SmZrX7GA.js} +2 -2
- package/dist/assets/{ServerLogo-DZVr_NTu.js → ServerLogo-8Le5auvK.js} +1 -1
- package/dist/assets/{Skeleton-vqfTvlpe.js → Skeleton-nt2aNRPQ.js} +2 -2
- package/dist/assets/{Slider-TF_nRzCq.js → Slider-d4v1rrsa.js} +1 -1
- package/dist/assets/{Stepper-afgJQzIe.js → Stepper-EoIiueJu.js} +1 -1
- package/dist/assets/{TableRow-BDieACJJ.js → TableRow-Sa1WiM2f.js} +2 -2
- package/dist/assets/{TextField-x5sBRUlA.js → TextField-YOGEC6UG.js} +1 -1
- package/dist/assets/{Toolbar-vUGjowom.js → Toolbar-g_XgSwzH.js} +1 -1
- package/dist/assets/{access-control-t-Mn-dDZ.js → access-control-ha2CvR_B.js} +1 -1
- package/dist/assets/actions-jNqiX7Ld.js +1 -0
- package/dist/assets/{add-component-core-DPcokfit.js → add-component-core-yLCSY4wH.js} +55 -106
- package/dist/assets/add-resource-Zq7wvJs3.js +1 -0
- package/dist/assets/{addon-mY-x2YPg.js → addon-obHI0Hlu.js} +1 -1
- package/dist/assets/{analytics-Vq-BXWFF.js → analytics-H1E3QYT7.js} +6 -6
- package/dist/assets/api-bqNzLg9V.js +1 -0
- package/dist/assets/{audit-logs-N6EaawQM.js → audit-logs-ZmXjCk-d.js} +1 -1
- package/dist/assets/{button-azOROO7x.js → button-In_gPOZd.js} +1 -1
- package/dist/assets/{click-to-copy-BWJB7cpI.js → click-to-copy-XhsdyR0H.js} +1 -1
- package/dist/assets/{complete-djuCvLFq.js → complete-xTzV9fpO.js} +3 -3
- package/dist/assets/{component-0kZN_r37.js → component-xzW_-GxW.js} +1 -1
- package/dist/assets/{config-r2KrjYng.js → config-14SNzi7t.js} +2 -2
- package/dist/assets/{config-XLPHfAfG.js → config-UduKbzW1.js} +1 -1
- package/dist/assets/{config-navigation-gh2E49lo.js → config-navigation-RLlR4gZT.js} +1 -1
- package/dist/assets/{index-Jw68IBz4.js → config-space-5XfyD3uq.js} +21 -21
- package/dist/assets/{confirm-Mtktmq7k.js → confirm-uXpKSgxe.js} +1 -1
- package/dist/assets/{connect-KSJy6-rj.js → connect-EgJ1pw5R.js} +1 -1
- package/dist/assets/{connect-mMSBRaYk.js → connect-iOodfP1C.js} +1 -1
- package/dist/assets/connect-to--STm1j0r.js +54 -0
- package/dist/assets/{content-layout-1Xl_WLH6.js → content-layout-cxGNkYvv.js} +1 -1
- package/dist/assets/{dashboard-j3Qv0MUF.js → dashboard-VZ-60JmZ.js} +3 -3
- package/dist/assets/{did-address-MDCcwx6u.js → did-address-2g3VKxYq.js} +1 -1
- package/dist/assets/{domain-_GEmlcT6.js → domain-kIh8qZuR.js} +1 -1
- package/dist/assets/{domain-list-Pv4S_RaT.js → domain-list-KUxfUpxv.js} +2 -2
- package/dist/assets/{exchange-passport-7xhRZSEb.js → exchange-passport-bVmMiopY.js} +1 -1
- package/dist/assets/{fallback-DXBYQOHs.js → fallback-K92qnnbp.js} +1 -1
- package/dist/assets/{fuel-8-fCwCNL.js → fuel-w6r1qdh0.js} +1 -1
- package/dist/assets/{fullpage-s8lb71N1.js → fullpage-lM2QRYmz.js} +1 -1
- package/dist/assets/{home--QohZl4R.js → home-rnjg5Uln.js} +1 -1
- package/dist/assets/{iframe-juWQeztB.js → iframe-P4prqqj1.js} +1 -1
- package/dist/assets/{index-eoPzUFk-.js → index--eYfa2iB.js} +1 -1
- package/dist/assets/{index-fPJrECRm.js → index--wu_gabw.js} +1 -1
- package/dist/assets/{index-dEFilA8i.js → index-2l_gDibc.js} +1 -1
- package/dist/assets/{index-tnbxz1dY.js → index-7C-cxYrr.js} +1 -1
- package/dist/assets/index-9wi_FbU7.js +201 -0
- package/dist/assets/{index-goDgO4Ij.js → index-BK7alHfP.js} +2 -2
- package/dist/assets/{index-7FFHHe_N.js → index-Cf01k-zf.js} +1 -1
- package/dist/assets/{index-e6vPthnF.js → index-CjfmWq2Z.js} +9 -9
- package/dist/assets/{index-GE-zVsc2.js → index-Cvm-qMrO.js} +1 -1
- package/dist/assets/index-KBfdwv7I.js +54 -0
- package/dist/assets/{index-RSlksNdD.js → index-L1aZ_oAt.js} +1 -1
- package/dist/assets/{index-JWEnB5KI.js → index-LkzRmFOO.js} +1 -1
- package/dist/assets/{index-Z0BlVtQc.js → index-RTZQcUl-.js} +4 -4
- package/dist/assets/{index-lTYX07Ps.js → index-Vu5Hi9e4.js} +53 -53
- package/dist/assets/{index-emzhv1nT.js → index-Y0SzaOzo.js} +1 -1
- package/dist/assets/{index-X2ZHgV3i.js → index-adip-Ngx.js} +7 -7
- package/dist/assets/{index-w49mGgcI.js → index-c7FpgR5O.js} +1 -1
- package/dist/assets/{index-Bu7mhh79.js → index-hEDWKFf1.js} +3 -3
- package/dist/assets/index-kVRlFbO-.js +1 -0
- package/dist/assets/{index-DJP7GVVb.js → index-kbsGDZwe.js} +4 -4
- package/dist/assets/{index-FqcuyrsB.js → index-rNdWQJ8V.js} +5 -5
- package/dist/assets/{index-0EdYQLjc.js → index-tUGh9zeW.js} +1 -1
- package/dist/assets/index-uPi27M7M.js +4 -0
- package/dist/assets/{index-d3CWfGhn.js → index-woVElijO.js} +1 -1
- package/dist/assets/{index-RETW1XMh.js → index-xfPw64rO.js} +2 -2
- package/dist/assets/{index-_DLM75xc.js → index-yTk3rOr5.js} +1 -1
- package/dist/assets/{index-hEieRw0y.js → index-ys1ZtEAO.js} +3 -3
- package/dist/assets/{index-jKDffwdj.js → index-zbEPyFtV.js} +1 -1
- package/dist/assets/{index.es-Q9mLAsuq.js → index.es-XZ3Qx7aN.js} +3 -3
- package/dist/assets/{index.esm-OU89D-Pj.js → index.esm-zHTA4cHV.js} +1 -1
- package/dist/assets/{invite-6DMM0PPk.js → invite-HGTaOopJ.js} +4 -4
- package/dist/assets/{issue-passport-71h-y9X_.js → issue-passport-dNZHjXJy.js} +1 -1
- package/dist/assets/{jss-plugin-props-sort.esm-iYla7Ofn.js → jss-plugin-props-sort.esm-4cc6LQ6N.js} +6 -6
- package/dist/assets/{launch-result-message-bFKcrgWf.js → launch-result-message-J5dZdjK9.js} +1 -1
- package/dist/assets/{layout-fuPJ_TpF.js → layout-edWgKFS3.js} +1 -1
- package/dist/assets/{list-header--wQnxerP.js → list-header-cakMMeA9.js} +1 -1
- package/dist/assets/localization-LX2eCkms.js +1 -0
- package/dist/assets/{log-GNImic30.js → log-IJfNDeYa.js} +1 -1
- package/dist/assets/{login-ebjgPFE8.js → login-GFXOoAOs.js} +1 -1
- package/dist/assets/{logo-uploader-A2GBLnOH.js → logo-uploader-Z7R8hvrQ.js} +3 -3
- package/dist/assets/{lost-passport-AUNfJKa8.js → lost-passport-rJt-K7ao.js} +3 -3
- package/dist/assets/{lottie-sUoozQjS.js → lottie-THFzP1dC.js} +1 -1
- package/dist/assets/{notifications-RcjuD51E.js → notifications-zMxY5VrS.js} +1 -1
- package/dist/assets/overview-dbKDHJQN.js +12 -0
- package/dist/assets/{page-header-8goZ8-Rl.js → page-header-sm7Rcxwn.js} +1 -1
- package/dist/assets/{permission-hbdU87hD.js → permission-dR7440gE.js} +1 -1
- package/dist/assets/{preferences-DhHiLu-g.js → preferences-WASfgwxe.js} +1 -1
- package/dist/assets/publish-resource-IPB1hxMa.js +1 -0
- package/dist/assets/react-cZEwd1y6.js +84 -0
- package/dist/assets/selector-PHzkH1QT.js +46 -0
- package/dist/assets/session-i2sKQu5g.js +1 -0
- package/dist/assets/setup-2IHOhLHH.js +19 -0
- package/dist/assets/{slicedToArray-hmrl8M96.js → slicedToArray-rOQW0Qdz.js} +2 -2
- package/dist/assets/{spaces-p68a7cQo.js → spaces-oi0UGr9V.js} +1 -1
- package/dist/assets/{start-UhquDvLm.js → start-kQG_xGdG.js} +1 -1
- package/dist/assets/{step-actions-9XLlbuAd.js → step-actions-eDIWEra3.js} +1 -1
- package/dist/assets/{studio-FKPH-5Is.js → studio-V05Kluaj.js} +1 -1
- package/dist/assets/{switch-control-XJA8Q2M5.js → switch-control--qsuqvPZ.js} +1 -1
- package/dist/assets/{toUpper-pP5P_Uzx.js → toUpper-2JfnfjSv.js} +1 -1
- package/dist/assets/{transfer-BkZW48Wj.js → transfer-_k5LHiPs.js} +1 -1
- package/dist/assets/{uniqBy-hw-cVyvr.js → uniqBy-j0q8aAHN.js} +1 -1
- package/dist/assets/{unsubscribe-vhObWF0b.js → unsubscribe-SgffzzOj.js} +1 -1
- package/dist/assets/use-blocklet-info-for-connect-did-spaces-7lIoXyoo.js +1 -0
- package/dist/assets/{useAsync-Wc4wsAuQ.js → useAsync-Jl2-1Zhx.js} +1 -1
- package/dist/assets/{useFormControl-e5GO7t9a.js → useFormControl-ow2ZyMxu.js} +1 -1
- package/dist/assets/{useLocalStorage-BMu-4uRp.js → useLocalStorage-g0dvG-aI.js} +1 -1
- package/dist/assets/{useSetState-8mygcy6W.js → useSetState-k-0ecZPo.js} +1 -1
- package/dist/assets/user-center-Ri39cNVy.js +1 -0
- package/dist/assets/{util-Sl89gu8k.js → util-IkWr1k8x.js} +1 -1
- package/dist/assets/{wrap-locale-eIqShWHu.js → wrap-locale-vxpb_1WH.js} +1 -1
- package/dist/index.html +1 -1
- package/dist/service-worker.js +1 -1
- package/package.json +23 -22
- package/api/libs/spaces.js +0 -18
- package/dist/assets/CardContent-GCq3M-fC.js +0 -1
- package/dist/assets/FormGroup-XgZY0ZQm.js +0 -1
- package/dist/assets/actions-4OufOsQ7.js +0 -1
- package/dist/assets/add-resource-_pNvxOni.js +0 -1
- package/dist/assets/api-evFC6K0h.js +0 -1
- package/dist/assets/index-FPB__s6E.js +0 -54
- package/dist/assets/index-Umn1dtKo.js +0 -1
- package/dist/assets/index-dCPMA5UF.js +0 -57
- package/dist/assets/index-zrYCwknK.js +0 -203
- package/dist/assets/localization-XAGKyaas.js +0 -1
- package/dist/assets/overview-AmprRPTp.js +0 -12
- package/dist/assets/publish-resource-1DEoabgP.js +0 -1
- package/dist/assets/react-KwTdr_5V.js +0 -87
- package/dist/assets/selector-Yakve_Iw.js +0 -46
- package/dist/assets/session-C_EXHtgc.js +0 -1
- package/dist/assets/setup-qkf-O1-k.js +0 -19
- package/dist/assets/use-blocklet-info-for-connect-did-spaces-UNlaKQY9.js +0 -1
- package/dist/assets/user-center-JEZvqelx.js +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Holds shared logic for session-manager v1 and v2
|
|
2
|
+
const { joinURL } = require('ufo');
|
|
2
3
|
const get = require('lodash/get');
|
|
3
4
|
const joinUrl = require('url-join');
|
|
4
5
|
const formatContext = require('@abtnode/util/lib/format-context');
|
|
@@ -35,12 +36,19 @@ const {
|
|
|
35
36
|
const { getKeyPairClaim, getAuthPrincipalForMigrateAppToV2 } = require('@abtnode/auth/lib/server');
|
|
36
37
|
const merge = require('lodash/merge');
|
|
37
38
|
const { fromAppDid } = require('@arcblock/did-ext');
|
|
38
|
-
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
39
|
+
const { LOGIN_PROVIDER, BLOCKLET_APP_SPACE_REQUIREMENT, DID_SPACES } = require('@blocklet/constant');
|
|
39
40
|
const pick = require('lodash/pick');
|
|
40
41
|
const createTranslator = require('@abtnode/util/lib/translate');
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
const {
|
|
43
|
+
getRolesFromAuthConfig,
|
|
44
|
+
getBlockletAppIdList,
|
|
45
|
+
forEachBlockletSync,
|
|
46
|
+
getAppName,
|
|
47
|
+
getAppDescription,
|
|
48
|
+
getAppUrl,
|
|
49
|
+
} = require('@blocklet/meta/lib/util');
|
|
43
50
|
const { getSourceAppPid, getLoginProvider } = require('@blocklet/sdk/lib/util/login');
|
|
51
|
+
const { getDidSpacesInfoByClaims, silentAuthorizationInConnect } = require('@abtnode/auth/lib/util/spaces');
|
|
44
52
|
|
|
45
53
|
const logger = require('../logger')('connect');
|
|
46
54
|
const { isInvitedUserOnly, createTokenFn, getDidConnectVersion } = require('../../util');
|
|
@@ -142,9 +150,34 @@ const checkAppOwner = ({ role, blocklet, userDid, locale = 'en' }) => {
|
|
|
142
150
|
}
|
|
143
151
|
};
|
|
144
152
|
|
|
153
|
+
/**
|
|
154
|
+
* @description
|
|
155
|
+
* @param {import('@abtnode/client').BlockletState} blocklet
|
|
156
|
+
* @return {boolean}
|
|
157
|
+
*/
|
|
158
|
+
const isDidSpaceRequiredOnConnect = (blocklet) => {
|
|
159
|
+
let flag = false;
|
|
160
|
+
|
|
161
|
+
forEachBlockletSync(blocklet, (b) => {
|
|
162
|
+
flag = flag || b?.meta?.capabilities?.didSpace === BLOCKLET_APP_SPACE_REQUIREMENT.REQUIRED_ON_CONNECT;
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
return !!flag;
|
|
166
|
+
};
|
|
167
|
+
|
|
145
168
|
module.exports = {
|
|
146
169
|
login: {
|
|
147
|
-
|
|
170
|
+
/**
|
|
171
|
+
*
|
|
172
|
+
* @param {{
|
|
173
|
+
* node: import('@abtnode/core').TNode
|
|
174
|
+
* }} param0
|
|
175
|
+
* @returns
|
|
176
|
+
*/
|
|
177
|
+
onConnect: async ({ node, request, userDid, locale = 'en', passportId = '', componentId, action, baseUrl }) => {
|
|
178
|
+
/**
|
|
179
|
+
* @type {import('@abtnode/client').BlockletState}
|
|
180
|
+
*/
|
|
148
181
|
const blocklet = await request.getBlocklet();
|
|
149
182
|
const config = await request.getServiceConfig(NODE_SERVICES.AUTH, { componentId });
|
|
150
183
|
const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
|
|
@@ -174,6 +207,35 @@ module.exports = {
|
|
|
174
207
|
if (passportId) {
|
|
175
208
|
claims.verifiableCredential.target = passportId;
|
|
176
209
|
}
|
|
210
|
+
|
|
211
|
+
// attach assetOrVC claim when space is required for user
|
|
212
|
+
if (isDidSpaceRequiredOnConnect(blocklet)) {
|
|
213
|
+
const currentUser = await node.getUser({
|
|
214
|
+
teamDid,
|
|
215
|
+
user: {
|
|
216
|
+
did: userDid,
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
if (!currentUser?.didSpace?.endpoint) {
|
|
221
|
+
// 当这个用户没有 didSpace endpoint 时,我们需要用户主动授权
|
|
222
|
+
claims.assetOrVC = {
|
|
223
|
+
description: messages.requestDidSpace[locale],
|
|
224
|
+
optional: false,
|
|
225
|
+
filters: [
|
|
226
|
+
{
|
|
227
|
+
tag: DID_SPACES.NFT_TAG, // 用于筛选 NFT
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
type: DID_SPACES.VC_TYPES, // 用于筛选 VC
|
|
231
|
+
},
|
|
232
|
+
],
|
|
233
|
+
meta: {
|
|
234
|
+
purpose: 'DidSpace',
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
177
239
|
}
|
|
178
240
|
|
|
179
241
|
if (action === 'exchangePassport') {
|
|
@@ -203,297 +265,390 @@ module.exports = {
|
|
|
203
265
|
return claims;
|
|
204
266
|
},
|
|
205
267
|
|
|
206
|
-
onApprove:
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
268
|
+
onApprove:
|
|
269
|
+
/**
|
|
270
|
+
* @description
|
|
271
|
+
* @param {{
|
|
272
|
+
* node: import('@abtnode/core').TNode,
|
|
273
|
+
* claims: any[],
|
|
274
|
+
* }} {
|
|
275
|
+
* node,
|
|
276
|
+
* request,
|
|
277
|
+
* locale,
|
|
278
|
+
* challenge,
|
|
279
|
+
* userDid,
|
|
280
|
+
* userPk,
|
|
281
|
+
* claims,
|
|
282
|
+
* baseUrl,
|
|
283
|
+
* createSessionToken,
|
|
284
|
+
* componentId,
|
|
285
|
+
* action,
|
|
286
|
+
* visitorId,
|
|
287
|
+
* }
|
|
288
|
+
* @return {*}
|
|
289
|
+
*/
|
|
290
|
+
async ({
|
|
291
|
+
node,
|
|
292
|
+
request,
|
|
293
|
+
locale,
|
|
294
|
+
challenge,
|
|
295
|
+
userDid,
|
|
296
|
+
userPk,
|
|
297
|
+
claims,
|
|
298
|
+
baseUrl,
|
|
299
|
+
createSessionToken,
|
|
300
|
+
componentId,
|
|
301
|
+
action,
|
|
302
|
+
visitorId,
|
|
303
|
+
}) => {
|
|
304
|
+
/** @type {import('@abtnode/client').BlockletState} */
|
|
305
|
+
const blocklet = await request.getBlocklet();
|
|
306
|
+
const blockletInfo = await request.getBlockletInfo();
|
|
307
|
+
const { wallet, secret, name, passportColor, did: teamDid } = blockletInfo;
|
|
308
|
+
const sourceAppPid = getSourceAppPid(request);
|
|
309
|
+
|
|
310
|
+
// Check user approved
|
|
311
|
+
const currentUser = await getUserWithinFederated(
|
|
312
|
+
{ sourceAppPid, teamDid, userDid, userPk },
|
|
313
|
+
{ node, blocklet }
|
|
314
|
+
);
|
|
315
|
+
if (currentUser && !currentUser.approved) {
|
|
316
|
+
throw new Error(messages.notAllowed[locale]);
|
|
317
|
+
}
|
|
230
318
|
|
|
231
|
-
|
|
232
|
-
|
|
319
|
+
const realDid = currentUser?.did || userDid;
|
|
320
|
+
const realPk = currentUser?.pk || userPk;
|
|
321
|
+
|
|
322
|
+
// Get auth config
|
|
323
|
+
const authConfig = (await request.getServiceConfig(NODE_SERVICES.AUTH, { componentId })) || {};
|
|
324
|
+
|
|
325
|
+
let vc;
|
|
326
|
+
let nftState;
|
|
327
|
+
let invitedUserOnly = false;
|
|
328
|
+
let defaultRole = ROLES.GUEST;
|
|
329
|
+
let defaultTtl = 0;
|
|
330
|
+
let defaultTtlPolicy = 'never';
|
|
331
|
+
let issuePassport = false;
|
|
332
|
+
|
|
333
|
+
const provider = getLoginProvider(request);
|
|
334
|
+
const masterSite = getFederatedMaster(blocklet);
|
|
335
|
+
|
|
336
|
+
// Get passport vc
|
|
337
|
+
if (action === 'login') {
|
|
338
|
+
vc = await getPassportVc({
|
|
339
|
+
blocklet,
|
|
340
|
+
claims,
|
|
341
|
+
challenge,
|
|
342
|
+
locale,
|
|
343
|
+
sourceAppPid,
|
|
344
|
+
});
|
|
345
|
+
[invitedUserOnly, defaultRole, issuePassport] = await isInvitedUserOnly(authConfig, node, teamDid);
|
|
346
|
+
if (invitedUserOnly && !vc) {
|
|
347
|
+
throw new Error(messages.missingCredentialClaim[locale]);
|
|
348
|
+
}
|
|
349
|
+
const shouldConnectSpace = claims.some(
|
|
350
|
+
(x) => x?.meta?.purpose === 'DidSpace' && ['asset', 'verifiableCredential'].includes(x.type)
|
|
351
|
+
);
|
|
352
|
+
if (shouldConnectSpace) {
|
|
353
|
+
const didSpaceInfo = await getDidSpacesInfoByClaims({ claims });
|
|
354
|
+
|
|
355
|
+
const appUrl = getAppUrl(blocklet);
|
|
356
|
+
const { data } = await silentAuthorizationInConnect(didSpaceInfo, {
|
|
357
|
+
appInfo: {
|
|
358
|
+
appDid: blocklet.appDid,
|
|
359
|
+
appName: getAppName(blocklet),
|
|
360
|
+
appDescription: getAppDescription(blocklet),
|
|
361
|
+
appUrl,
|
|
362
|
+
scopes: 'list:object read:object write:object',
|
|
363
|
+
referrer: joinURL(appUrl, '/.well-known/service/connect'),
|
|
364
|
+
},
|
|
365
|
+
verifyNFTParams: {
|
|
366
|
+
claims,
|
|
367
|
+
challenge,
|
|
368
|
+
locale,
|
|
369
|
+
},
|
|
370
|
+
});
|
|
233
371
|
|
|
234
|
-
|
|
235
|
-
|
|
372
|
+
/**
|
|
373
|
+
* @type {Omit<import('@abtnode/client').SpaceGatewayInput, 'protected'>}
|
|
374
|
+
*/
|
|
375
|
+
const spaceGateway = {
|
|
376
|
+
did: data.did,
|
|
377
|
+
name: data.name,
|
|
378
|
+
endpoint: data.endpoint,
|
|
379
|
+
url: didSpaceInfo.didSpacesCoreUrl,
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
const user = await node.getUser({
|
|
383
|
+
teamDid,
|
|
384
|
+
user: {
|
|
385
|
+
did: userDid,
|
|
386
|
+
},
|
|
387
|
+
});
|
|
236
388
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
389
|
+
await node.updateUser({
|
|
390
|
+
teamDid,
|
|
391
|
+
user: {
|
|
392
|
+
did: userDid,
|
|
393
|
+
didSpace: {
|
|
394
|
+
...user.didSpace,
|
|
395
|
+
...spaceGateway,
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
} else if (action === 'exchangePassport') {
|
|
401
|
+
const claim = claims.find((x) => x.type === 'asset');
|
|
402
|
+
const isConnected = await node.isConnectedAccount({ teamDid, did: claim.asset });
|
|
403
|
+
if (isConnected) {
|
|
404
|
+
throw new Error(messages.nftAlreadyUsed[locale]);
|
|
405
|
+
}
|
|
244
406
|
|
|
245
|
-
|
|
246
|
-
|
|
407
|
+
nftState = await verifyNFT({ claims, challenge, locale, chainHost: MAIN_CHAIN_ENDPOINT });
|
|
408
|
+
const matchFactory = blocklet.trustedFactories.find((x) => x.factoryAddress === nftState.parent);
|
|
409
|
+
if (!matchFactory) {
|
|
410
|
+
throw new Error(messages.invalidNftParent[locale]);
|
|
411
|
+
}
|
|
247
412
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
if (invitedUserOnly && !vc) {
|
|
253
|
-
throw new Error(messages.missingCredentialClaim[locale]);
|
|
254
|
-
}
|
|
255
|
-
} else if (action === 'exchangePassport') {
|
|
256
|
-
const claim = claims.find((x) => x.type === 'asset');
|
|
257
|
-
const isConnected = await node.isConnectedAccount({ teamDid, did: claim.asset });
|
|
258
|
-
if (isConnected) {
|
|
259
|
-
throw new Error(messages.nftAlreadyUsed[locale]);
|
|
413
|
+
defaultRole = matchFactory.passport.role;
|
|
414
|
+
defaultTtl = matchFactory.passport.ttl;
|
|
415
|
+
defaultTtlPolicy = matchFactory.passport.ttlPolicy;
|
|
416
|
+
issuePassport = true;
|
|
260
417
|
}
|
|
261
418
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
419
|
+
if (issuePassport) {
|
|
420
|
+
let expirationDate;
|
|
421
|
+
if (nftState && defaultTtl) {
|
|
422
|
+
if (defaultTtlPolicy === 'mint') {
|
|
423
|
+
expirationDate = +new Date(nftState.context.genesisTime) + defaultTtl;
|
|
424
|
+
}
|
|
425
|
+
if (defaultTtlPolicy === 'exchange') {
|
|
426
|
+
expirationDate = +new Date() + defaultTtl;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
267
429
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
430
|
+
logger.info(`issue passport to user at the ${action} workflow`, {
|
|
431
|
+
role: defaultRole,
|
|
432
|
+
expire: expirationDate,
|
|
433
|
+
policy: defaultTtlPolicy,
|
|
434
|
+
ttl: defaultTtl,
|
|
435
|
+
});
|
|
273
436
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
437
|
+
const profile = claims.find((x) => x.type === 'profile');
|
|
438
|
+
vc = createPassportVC({
|
|
439
|
+
issuerName: name,
|
|
440
|
+
issuerWallet: wallet,
|
|
441
|
+
issuerAvatarUrl: getAppAvatarUrl(baseUrl),
|
|
442
|
+
ownerDid: realDid,
|
|
443
|
+
passport: await createPassport({
|
|
444
|
+
name: defaultRole,
|
|
445
|
+
node,
|
|
446
|
+
teamDid,
|
|
447
|
+
locale,
|
|
448
|
+
endpoint: baseUrl,
|
|
449
|
+
}),
|
|
450
|
+
endpoint: getPassportStatusEndpoint({
|
|
451
|
+
baseUrl: joinUrl(baseUrl, WELLKNOWN_SERVICE_PATH_PREFIX),
|
|
452
|
+
userDid: realDid,
|
|
453
|
+
teamDid,
|
|
454
|
+
}),
|
|
455
|
+
ownerProfile: profile,
|
|
456
|
+
preferredColor: passportColor,
|
|
457
|
+
expirationDate: expirationDate ? new Date(expirationDate).toISOString() : undefined,
|
|
458
|
+
});
|
|
283
459
|
}
|
|
284
460
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
});
|
|
461
|
+
// Get user passport from vc
|
|
462
|
+
let passport = vc ? createUserPassport(vc) : null;
|
|
463
|
+
if (currentUser && passport && isUserPassportRevoked(currentUser, passport)) {
|
|
464
|
+
throw new Error(messages.passportRevoked[locale](passport.title, name));
|
|
465
|
+
}
|
|
291
466
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
issuerWallet: wallet,
|
|
296
|
-
issuerAvatarUrl: getAppAvatarUrl(baseUrl),
|
|
297
|
-
ownerDid: realDid,
|
|
298
|
-
passport: await createPassport({
|
|
299
|
-
name: defaultRole,
|
|
300
|
-
node,
|
|
301
|
-
teamDid,
|
|
302
|
-
locale,
|
|
303
|
-
endpoint: baseUrl,
|
|
304
|
-
}),
|
|
305
|
-
endpoint: getPassportStatusEndpoint({
|
|
306
|
-
baseUrl: joinUrl(baseUrl, WELLKNOWN_SERVICE_PATH_PREFIX),
|
|
307
|
-
userDid: realDid,
|
|
308
|
-
teamDid,
|
|
309
|
-
}),
|
|
310
|
-
ownerProfile: profile,
|
|
311
|
-
preferredColor: passportColor,
|
|
312
|
-
expirationDate: expirationDate ? new Date(expirationDate).toISOString() : undefined,
|
|
313
|
-
});
|
|
314
|
-
}
|
|
467
|
+
// Get role
|
|
468
|
+
const role = await getRoleFromVC({ vc, node, locale, blocklet, teamDid, sourceAppPid });
|
|
469
|
+
await validateRole({ role, authConfig, locale, node, teamDid });
|
|
315
470
|
|
|
316
|
-
|
|
317
|
-
let passport = vc ? createUserPassport(vc) : null;
|
|
318
|
-
if (currentUser && passport && isUserPassportRevoked(currentUser, passport)) {
|
|
319
|
-
throw new Error(messages.passportRevoked[locale](passport.title, name));
|
|
320
|
-
}
|
|
471
|
+
checkAppOwner({ role, blocklet, userDid, locale });
|
|
321
472
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
await validateRole({ role, authConfig, locale, node, teamDid });
|
|
325
|
-
|
|
326
|
-
checkAppOwner({ role, blocklet, userDid, locale });
|
|
473
|
+
// Recreate passport with correct role
|
|
474
|
+
passport = vc ? createUserPassport(vc, { role }) : null;
|
|
327
475
|
|
|
328
|
-
|
|
329
|
-
|
|
476
|
+
const now = new Date().toISOString();
|
|
477
|
+
const connectedNft = nftState
|
|
478
|
+
? {
|
|
479
|
+
provider: LOGIN_PROVIDER.NFT,
|
|
480
|
+
did: nftState.address,
|
|
481
|
+
owner: nftState.owner,
|
|
482
|
+
firstLoginAt: now,
|
|
483
|
+
lastLoginAt: now,
|
|
484
|
+
}
|
|
485
|
+
: null;
|
|
330
486
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
provider: LOGIN_PROVIDER.NFT,
|
|
335
|
-
did: nftState.address,
|
|
336
|
-
owner: nftState.owner,
|
|
337
|
-
firstLoginAt: now,
|
|
338
|
-
lastLoginAt: now,
|
|
339
|
-
}
|
|
340
|
-
: null;
|
|
487
|
+
let fullName = currentUser?.fullName;
|
|
488
|
+
// Update profile
|
|
489
|
+
const passportForLog = passport || { name: 'Guest', role: 'guest' };
|
|
341
490
|
|
|
342
|
-
|
|
343
|
-
// Update profile
|
|
344
|
-
const passportForLog = passport || { name: 'Guest', role: 'guest' };
|
|
491
|
+
const connectAccount = { provider, did: userDid, pk: userPk };
|
|
345
492
|
|
|
346
|
-
|
|
493
|
+
let updatedUser;
|
|
494
|
+
if (currentUser) {
|
|
495
|
+
updatedUser = await node.loginUser({
|
|
496
|
+
teamDid,
|
|
497
|
+
user: {
|
|
498
|
+
did: currentUser.did,
|
|
499
|
+
pk: currentUser.pk,
|
|
500
|
+
locale,
|
|
501
|
+
passport,
|
|
502
|
+
sourceAppPid,
|
|
503
|
+
lastLoginIp: get(request, 'headers[x-real-ip]') || '',
|
|
504
|
+
connectedAccount: [connectAccount, connectedNft],
|
|
505
|
+
},
|
|
506
|
+
});
|
|
507
|
+
await node.createAuditLog(
|
|
508
|
+
{
|
|
509
|
+
action,
|
|
510
|
+
args: { teamDid, userDid: realDid, passport: passportForLog, provider, sourceAppPid },
|
|
511
|
+
context: formatContext(Object.assign(request, { user: updatedUser })),
|
|
512
|
+
result: updatedUser,
|
|
513
|
+
},
|
|
514
|
+
node
|
|
515
|
+
);
|
|
516
|
+
} else {
|
|
517
|
+
// Create user
|
|
518
|
+
const profile = claims.find((x) => x.type === 'profile');
|
|
519
|
+
fullName = profile.fullName;
|
|
520
|
+
|
|
521
|
+
updatedUser = await node.loginUser({
|
|
522
|
+
teamDid,
|
|
523
|
+
user: {
|
|
524
|
+
...profile,
|
|
525
|
+
avatar: await extractUserAvatar(get(profile, 'avatar'), {
|
|
526
|
+
dataDir: blocklet.env.dataDir,
|
|
527
|
+
}),
|
|
528
|
+
did: realDid,
|
|
529
|
+
pk: realPk,
|
|
530
|
+
locale,
|
|
531
|
+
passport,
|
|
532
|
+
sourceAppPid,
|
|
533
|
+
lastLoginIp: get(request, 'headers[x-real-ip]') || '',
|
|
534
|
+
connectedAccount: [connectAccount, connectedNft],
|
|
535
|
+
},
|
|
536
|
+
});
|
|
537
|
+
await node.createAuditLog(
|
|
538
|
+
{
|
|
539
|
+
action: 'addUser',
|
|
540
|
+
args: {
|
|
541
|
+
teamDid,
|
|
542
|
+
userDid: realDid,
|
|
543
|
+
sourceAppPid,
|
|
544
|
+
provider,
|
|
545
|
+
reason: `first login as ${passportForLog.role}`,
|
|
546
|
+
},
|
|
547
|
+
context: formatContext(Object.assign(request, { user: updatedUser })),
|
|
548
|
+
result: updatedUser,
|
|
549
|
+
},
|
|
550
|
+
node
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
const lastLoginIp = request.headers['x-real-ip'];
|
|
554
|
+
const ua = request.headers['user-agent'];
|
|
555
|
+
// request.context.store.connectedWallet
|
|
556
|
+
const walletOS = request.context.didwallet.os;
|
|
347
557
|
|
|
348
|
-
|
|
349
|
-
if (currentUser) {
|
|
350
|
-
updatedUser = await node.loginUser({
|
|
558
|
+
const userSessionDoc = await node.upsertUserSession({
|
|
351
559
|
teamDid,
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
560
|
+
visitorId,
|
|
561
|
+
userDid: realDid,
|
|
562
|
+
appPid: teamDid,
|
|
563
|
+
passportId: passport?.id,
|
|
564
|
+
status: 'online',
|
|
565
|
+
ua,
|
|
566
|
+
lastLoginIp,
|
|
567
|
+
extra: {
|
|
568
|
+
walletOS,
|
|
360
569
|
},
|
|
361
570
|
});
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
action,
|
|
365
|
-
args: { teamDid, userDid: realDid, passport: passportForLog, provider, sourceAppPid },
|
|
366
|
-
context: formatContext(Object.assign(request, { user: updatedUser })),
|
|
367
|
-
result: updatedUser,
|
|
368
|
-
},
|
|
571
|
+
|
|
572
|
+
if (shouldSyncFederated(sourceAppPid, blocklet)) {
|
|
369
573
|
node
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
574
|
+
.syncFederated({
|
|
575
|
+
did: teamDid,
|
|
576
|
+
data: {
|
|
577
|
+
users: [
|
|
578
|
+
{
|
|
579
|
+
did: updatedUser.did,
|
|
580
|
+
pk: updatedUser.pk,
|
|
581
|
+
fullName: updatedUser.fullName,
|
|
582
|
+
email: updatedUser.email || '',
|
|
583
|
+
avatar: getUserAvatarUrl(updatedUser.avatar, blocklet),
|
|
584
|
+
connectedAccount: [connectAccount, connectedNft],
|
|
585
|
+
action: 'connectAccount',
|
|
586
|
+
sourceAppPid: sourceAppPid || masterSite.appPid,
|
|
587
|
+
},
|
|
588
|
+
],
|
|
589
|
+
},
|
|
590
|
+
})
|
|
591
|
+
.then(() => {
|
|
592
|
+
node.syncUserSession({
|
|
593
|
+
teamDid,
|
|
594
|
+
userDid: realDid,
|
|
595
|
+
visitorId: userSessionDoc.visitorId,
|
|
596
|
+
passportId: passport?.id,
|
|
597
|
+
targetAppPid: sourceAppPid,
|
|
598
|
+
ua,
|
|
599
|
+
lastLoginIp,
|
|
600
|
+
extra: {
|
|
601
|
+
walletOS,
|
|
602
|
+
},
|
|
603
|
+
});
|
|
604
|
+
});
|
|
605
|
+
}
|
|
375
606
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
}),
|
|
383
|
-
did: realDid,
|
|
384
|
-
pk: realPk,
|
|
385
|
-
locale,
|
|
386
|
-
passport,
|
|
387
|
-
sourceAppPid,
|
|
388
|
-
lastLoginIp: get(request, 'headers[x-real-ip]') || '',
|
|
389
|
-
connectedAccount: [connectAccount, connectedNft],
|
|
390
|
-
},
|
|
391
|
-
});
|
|
392
|
-
await node.createAuditLog(
|
|
607
|
+
// Generate new session token that client can save to localStorage
|
|
608
|
+
const createToken = createTokenFn(createSessionToken);
|
|
609
|
+
const sessionConfig = blocklet.settings?.session || {};
|
|
610
|
+
|
|
611
|
+
const { sessionToken, refreshToken } = createToken(
|
|
612
|
+
realDid,
|
|
393
613
|
{
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
},
|
|
402
|
-
context: formatContext(Object.assign(request, { user: updatedUser })),
|
|
403
|
-
result: updatedUser,
|
|
614
|
+
secret,
|
|
615
|
+
passport,
|
|
616
|
+
role,
|
|
617
|
+
fullName,
|
|
618
|
+
// NOTE: token 中存储当前的 login provider
|
|
619
|
+
provider,
|
|
620
|
+
walletOS,
|
|
404
621
|
},
|
|
405
|
-
|
|
622
|
+
{ ...sessionConfig, didConnectVersion: getDidConnectVersion(request) }
|
|
406
623
|
);
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
passportId: passport?.id,
|
|
419
|
-
status: 'online',
|
|
420
|
-
ua,
|
|
421
|
-
lastLoginIp,
|
|
422
|
-
extra: {
|
|
423
|
-
walletOS,
|
|
424
|
-
},
|
|
425
|
-
});
|
|
624
|
+
logger.info(`${action}.success`, { userDid: realDid, role });
|
|
625
|
+
|
|
626
|
+
if (
|
|
627
|
+
// if user provides owner passport AND app does not have owner, set this user to owner
|
|
628
|
+
(vc && role === ROLES.OWNER && !blocklet.settings?.owner) ||
|
|
629
|
+
// if the user will receive a owner passport AND app does not have owner, set this user to owner
|
|
630
|
+
(issuePassport && defaultRole === ROLES.OWNER && !blocklet.settings?.owner)
|
|
631
|
+
) {
|
|
632
|
+
logger.info('Bind owner for blocklet', { teamDid, userDid: realDid });
|
|
633
|
+
await node.setBlockletInitialized({ did: teamDid, owner: { did: realDid, pk: realPk } });
|
|
634
|
+
}
|
|
426
635
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
email: updatedUser.email || '',
|
|
438
|
-
avatar: getUserAvatarUrl(updatedUser.avatar, blocklet),
|
|
439
|
-
connectedAccount: [connectAccount, connectedNft],
|
|
440
|
-
action: 'connectAccount',
|
|
441
|
-
sourceAppPid: sourceAppPid || masterSite.appPid,
|
|
442
|
-
},
|
|
443
|
-
],
|
|
444
|
-
},
|
|
445
|
-
})
|
|
446
|
-
.then(() => {
|
|
447
|
-
node.syncUserSession({
|
|
448
|
-
teamDid,
|
|
636
|
+
// issue passport for the first login user in a invite-only team
|
|
637
|
+
if (issuePassport) {
|
|
638
|
+
return {
|
|
639
|
+
disposition: 'attachment',
|
|
640
|
+
type: 'VerifiableCredential',
|
|
641
|
+
data: vc,
|
|
642
|
+
sessionToken,
|
|
643
|
+
refreshToken,
|
|
644
|
+
visitorId: userSessionDoc.visitorId,
|
|
645
|
+
nextWorkflowData: {
|
|
449
646
|
userDid: realDid,
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
ua,
|
|
454
|
-
lastLoginIp,
|
|
455
|
-
extra: {
|
|
456
|
-
walletOS,
|
|
457
|
-
},
|
|
458
|
-
});
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// Generate new session token that client can save to localStorage
|
|
463
|
-
const createToken = createTokenFn(createSessionToken);
|
|
464
|
-
const sessionConfig = blocklet.settings?.session || {};
|
|
465
|
-
|
|
466
|
-
const { sessionToken, refreshToken } = createToken(
|
|
467
|
-
realDid,
|
|
468
|
-
{
|
|
469
|
-
secret,
|
|
470
|
-
passport,
|
|
471
|
-
role,
|
|
472
|
-
fullName,
|
|
473
|
-
// NOTE: token 中存储当前的 login provider
|
|
474
|
-
provider,
|
|
475
|
-
walletOS,
|
|
476
|
-
},
|
|
477
|
-
{ ...sessionConfig, didConnectVersion: getDidConnectVersion(request) }
|
|
478
|
-
);
|
|
479
|
-
logger.info(`${action}.success`, { userDid: realDid, role });
|
|
480
|
-
|
|
481
|
-
if (
|
|
482
|
-
// if user provides owner passport AND app does not have owner, set this user to owner
|
|
483
|
-
(vc && role === ROLES.OWNER && !blocklet.settings?.owner) ||
|
|
484
|
-
// if the user will receive a owner passport AND app does not have owner, set this user to owner
|
|
485
|
-
(issuePassport && defaultRole === ROLES.OWNER && !blocklet.settings?.owner)
|
|
486
|
-
) {
|
|
487
|
-
logger.info('Bind owner for blocklet', { teamDid, userDid: realDid });
|
|
488
|
-
await node.setBlockletInitialized({ did: teamDid, owner: { did: realDid, pk: realPk } });
|
|
489
|
-
}
|
|
647
|
+
},
|
|
648
|
+
};
|
|
649
|
+
}
|
|
490
650
|
|
|
491
|
-
// issue passport for the first login user in a invite-only team
|
|
492
|
-
if (issuePassport) {
|
|
493
651
|
return {
|
|
494
|
-
disposition: 'attachment',
|
|
495
|
-
type: 'VerifiableCredential',
|
|
496
|
-
data: vc,
|
|
497
652
|
sessionToken,
|
|
498
653
|
refreshToken,
|
|
499
654
|
visitorId: userSessionDoc.visitorId,
|
|
@@ -501,17 +656,7 @@ module.exports = {
|
|
|
501
656
|
userDid: realDid,
|
|
502
657
|
},
|
|
503
658
|
};
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
return {
|
|
507
|
-
sessionToken,
|
|
508
|
-
refreshToken,
|
|
509
|
-
visitorId: userSessionDoc.visitorId,
|
|
510
|
-
nextWorkflowData: {
|
|
511
|
-
userDid: realDid,
|
|
512
|
-
},
|
|
513
|
-
};
|
|
514
|
-
},
|
|
659
|
+
},
|
|
515
660
|
},
|
|
516
661
|
|
|
517
662
|
switchProfile: {
|