@abtnode/blocklet-services 1.16.37-beta-20250104-120451-e4049aeb → 1.16.37-beta-20250107-235521-f1778ec0
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/LICENSE +1 -1
- package/api/index.js +1 -0
- package/api/libs/auth/utils.js +33 -31
- package/api/libs/connect/session.js +3 -2
- package/api/routes/blocklet.js +1 -1
- package/api/routes/oauth.js +22 -112
- package/api/routes/user.js +11 -26
- package/api/services/auth/connect/receive-transfer-app-owner.js +1 -2
- package/api/services/auth/connect/setup.js +7 -2
- package/api/services/auth/connect/verify-destroy.js +3 -16
- package/api/services/auth/index.js +4 -0
- package/api/services/auth/passkey.js +31 -0
- package/api/services/auth/passport.js +2 -2
- package/api/services/notification/index.js +10 -9
- package/api/socket/channel/did.js +3 -0
- package/api/socket/util.js +3 -1
- package/api/util/attach-shared-utils.js +5 -4
- package/api/util/index.js +5 -25
- package/dist/assets/Add-XINWD-cR.js +1 -0
- package/dist/assets/ArrowDropDown-BPjEGMbu.js +1 -0
- package/dist/assets/CheckCircle-B4plT5R4.js +1 -0
- package/dist/assets/ChevronLeft-B9PQ366h.js +1 -0
- package/dist/assets/ChevronRight-D6hU6q5w.js +1 -0
- package/dist/assets/DeleteOutline-CW6vHyu2.js +1 -0
- package/dist/assets/Done-CbA_lc17.js +1 -0
- package/dist/assets/Download-D114STME.js +1 -0
- package/dist/assets/EditIcon-DDucSncy.js +1 -0
- package/dist/assets/Error-CspIR8wP.js +1 -0
- package/dist/assets/{Google-BAgnJN1d.js → Google-Bzqa7SGD.js} +3 -3
- package/dist/assets/InfoOutlined-CQX14YIV.js +1 -0
- package/dist/assets/Launch-C1MUjdbY.js +1 -0
- package/dist/assets/LaunchOutlined-CeuwA75K.js +1 -0
- package/dist/assets/LockIcon-BIlUQ2kd.js +1 -0
- package/dist/assets/Loop-CRiiMs26.js +1 -0
- package/dist/assets/MoreHoriz-CyRd8YYN.js +1 -0
- package/dist/assets/PlayArrow-CpIW2rO1.js +1 -0
- package/dist/assets/QuestionMarkCircle-2fDrHopp.js +1 -0
- package/dist/assets/ServerLogo-DsurTeGQ.js +1 -0
- package/dist/assets/ViewList-VFshTvAg.js +1 -0
- package/dist/assets/_createAggregator-sgAa2ai2.js +1 -0
- package/dist/assets/abtwallet-o1JAGJkW.png +0 -0
- package/dist/assets/access-control-CaDZstFX.js +13 -0
- package/dist/assets/actions-BQfRapcY.js +1 -0
- package/dist/assets/add-component-core-B6O0kJAO.js +716 -0
- package/dist/assets/add-resource-DVAwgArl.js +1 -0
- package/dist/assets/addon-B934EFnq.js +31 -0
- package/dist/assets/analytics-DxPeznyU.js +47 -0
- package/dist/assets/android-Xe96zWxX.png +0 -0
- package/dist/assets/api-C7qcY4XU.js +1 -0
- package/dist/assets/audit-logs-Cw_LCWlO.js +58 -0
- package/dist/assets/base32-CdGlYCm2.js +1 -0
- package/dist/assets/branding-CVf-84lW.js +40 -0
- package/dist/assets/bundle-avatar-CZnIDw9E.js +1 -0
- package/dist/assets/button-DSj-WxvW.js +1 -0
- package/dist/assets/click-to-copy-DPKm1p6d.js +1 -0
- package/dist/assets/complete-Bf8ALY2S.js +45 -0
- package/dist/assets/{component-ChbClWUp.js → component-ChxoGFx9.js} +89 -89
- package/dist/assets/config-BUjuVbbC.js +1 -0
- package/dist/assets/config-D3mUi5yh.js +32 -0
- package/dist/assets/{config-navigation-CWPZjlHO.js → config-navigation-Bjlh79gM.js} +6 -6
- package/dist/assets/config-space-B_9C2jTG.js +1 -0
- package/dist/assets/confirm-CVFWPron.js +7 -0
- package/dist/assets/connect-Bw02nhZ6.js +5 -0
- package/dist/assets/connect-to-DL42-aQK.js +1 -0
- package/dist/assets/connect-whKFDq3K.js +1 -0
- package/dist/assets/{content-layout-B3qFdI6N.js → content-layout-C8ThavEP.js} +1 -1
- package/dist/assets/dashboard-Dff3slpj.js +86 -0
- package/dist/assets/did-address-DqD0tKOY.js +1 -0
- package/dist/assets/domain-CI3XUHBW.js +9 -0
- package/dist/assets/domain-list-jO4zHESZ.js +15 -0
- package/dist/assets/email-DZG9lqBd.js +18 -0
- package/dist/assets/exchange-passport-BMjrpZst.js +1 -0
- package/dist/assets/form-text-input-ClGC4JKP.js +11 -0
- package/dist/assets/{format-error-CpEoP1rb.js → format-error-C0Ke3VXF.js} +2 -2
- package/dist/assets/fuel-2t6oVtfW.js +32 -0
- package/dist/assets/fullpage-BiUo6gQd.js +1 -0
- package/dist/assets/get-safe-url-BtfNFuK0.js +1 -0
- package/dist/assets/get-safe-url-CV9wUymi.js +1 -0
- package/dist/assets/home-BpXMOH1X.js +1 -0
- package/dist/assets/iframe-03f6PMsP.js +1 -0
- package/dist/assets/index-1yj7N3BD.js +243 -0
- package/dist/assets/{index-CqfW2FZt.js → index-7gknQYQQ.js} +2 -2
- package/dist/assets/index-BRPzwIuP.js +1 -0
- package/dist/assets/index-BgE0mEyw.js +221 -0
- package/dist/assets/index-BqtzbaK6.js +5 -0
- package/dist/assets/index-BvpWi6M_.js +1 -0
- package/dist/assets/index-C89HTHWf.js +144 -0
- package/dist/assets/{index-D8zCBBsy.js → index-CEyrfuix.js} +1 -1
- package/dist/assets/index-CTEk7-E8.js +4 -0
- package/dist/assets/index-CcsFwEG1.js +1 -0
- package/dist/assets/index-ChdU5l0G.js +104 -0
- package/dist/assets/index-Cp3ZCh7o.js +1 -0
- package/dist/assets/index-D3rhPCZn.js +291 -0
- package/dist/assets/index-DOWnRwIi.js +134 -0
- package/dist/assets/{index-Cbi6kl34.js → index-DPyw3Xwp.js} +2 -2
- package/dist/assets/index-DQR2LIPC.js +11 -0
- package/dist/assets/index-DVYdq7IA.js +1 -0
- package/dist/assets/{index-Gze7IkP6.js → index-DoZ2YM4T.js} +1 -1
- package/dist/assets/index-XlyOkzy1.js +1 -0
- package/dist/assets/{index-CH1qAD3K.js → index-kGLQpRJK.js} +22 -22
- package/dist/assets/index-qpaXqEVJ.js +5 -0
- package/dist/assets/invitation-C8ZNSJG7.js +176 -0
- package/dist/assets/invite-wHYq3NmE.js +5 -0
- package/dist/assets/ios-CBDmY-ic.png +0 -0
- package/dist/assets/isEmail-BWNRBSAy.js +1 -0
- package/dist/assets/issue-passport-CIaz_hk6.js +1 -0
- package/dist/assets/item-wwVikGMU.js +1 -0
- package/dist/assets/{launch-result-message-BelGEFPb.js → launch-result-message-BEuCq9h1.js} +2 -2
- package/dist/assets/layout-DBXEc_NJ.js +29 -0
- package/dist/assets/list-header-BA3DiTcf.js +57 -0
- package/dist/assets/localization-DHa_wuSk.js +1 -0
- package/dist/assets/{log-C-mcb3Rv.js → log-Dc1jxENK.js} +9 -9
- package/dist/assets/login-BSMkjZ2F.js +1 -0
- package/dist/assets/login-oauth-callback-nhEQq-XX.js +1 -0
- package/dist/assets/logo-uploader-yBugHtcG.js +133 -0
- package/dist/assets/lost-passport-DAsg20NY.js +168 -0
- package/dist/assets/{lottie-react.esm-BpyUyTL6.js → lottie-react.esm-CHpXrEmm.js} +1 -1
- package/dist/assets/open-window-CVrMznBr.js +1 -0
- package/dist/assets/overview-Dc2oVKWy.js +12 -0
- package/dist/assets/{page-header-cgpPCMon.js → page-header-Htib6ejn.js} +1 -1
- package/dist/assets/permission-Bz0PVI3J.js +1 -0
- package/dist/assets/preferences-BVtsOmzg.js +1 -0
- package/dist/assets/publish-resource-6mtBRA7-.js +1 -0
- package/dist/assets/raf-schd.esm-Cxhj8umC.js +1 -0
- package/dist/assets/{react-beautiful-dnd.esm-C5fDIc0r.js → react-beautiful-dnd.esm-BPPmOpgZ.js} +4 -4
- package/dist/assets/relative-time-D13g3uDZ.js +1 -0
- package/dist/assets/sdk-BU36VFtK.js +1 -0
- package/dist/assets/session-6sDuFWud.js +1 -0
- package/dist/assets/setup-B2Eq0dKO.js +19 -0
- package/dist/assets/shorten-label-CKNjZbhF.js +1 -0
- package/dist/assets/simple-select-BMYrmYam.js +1 -0
- package/dist/assets/slicedToArray-BPEJIbVV.js +2 -0
- package/dist/assets/start-DcyUXnHe.js +187 -0
- package/dist/assets/step-actions-BdC024Vn.js +31 -0
- package/dist/assets/studio-BSlFbK1F.js +6 -0
- package/dist/assets/switch-control-DOeNAipI.js +13 -0
- package/dist/assets/toUpper-CPtwa1LG.js +1 -0
- package/dist/assets/transfer-l-kgY192.js +16 -0
- package/dist/assets/unsubscribe-Bn1ZPibc.js +1 -0
- package/dist/assets/use-mobile-DOkke39c.js +1 -0
- package/dist/assets/useAsync-Barwm_ml.js +1 -0
- package/dist/assets/useAsyncRetry-Ct0h3JKq.js +7 -0
- package/dist/assets/useLocalStorage-Bkgi6BS3.js +1 -0
- package/dist/assets/useSetState-Crt4S51m.js +1 -0
- package/dist/assets/user-center-tko9eOwU.js +202 -0
- package/dist/assets/util-Cd3QOWLR.js +1 -0
- package/dist/assets/{index-B4oT57Ax.css → vendor-arcblock-DhgPdlEj.css} +1 -1
- package/dist/assets/vendor-arcblock-oreSqNjg.js +3503 -0
- package/dist/assets/vendor-hooks-DHHsWSqV.js +7 -0
- package/dist/assets/vendor-mui-core-COxJgW9_.js +267 -0
- package/dist/assets/vendor-mui-x-Be0GxtOJ.js +6 -0
- package/dist/assets/vendor-react-D-afvo_7.js +61 -0
- package/dist/assets/vendor-utils-CV7RLr7b.js +11 -0
- package/dist/assets/wrap-locale-Dajt8i2A.js +1 -0
- package/dist/index.html +7 -2
- package/dist/service-worker.js +1 -1
- package/package.json +39 -39
- package/dist/assets/Add-B3vUgBj_.js +0 -1
- package/dist/assets/Alert-BeI3TGsH.js +0 -1
- package/dist/assets/ArrowDropDown-BDen6kv8.js +0 -1
- package/dist/assets/Autocomplete-B9XdXNLV.js +0 -1
- package/dist/assets/Avatar-VP6VjO6F.js +0 -1
- package/dist/assets/ButtonGroup-BQ3t8F0M.js +0 -1
- package/dist/assets/CSSTransition-CAyI_Voi.js +0 -1
- package/dist/assets/CheckCircle-C2NNCmBl.js +0 -1
- package/dist/assets/ChevronLeft-CnYlL3td.js +0 -1
- package/dist/assets/ChevronRight-CW0I-au3.js +0 -1
- package/dist/assets/Clear-CJ32w-ta.js +0 -1
- package/dist/assets/CloseOutlined-sL5HP2JB.js +0 -1
- package/dist/assets/Delete-Cw0XHQbI.js +0 -1
- package/dist/assets/DeleteOutline-CNDiVs89.js +0 -1
- package/dist/assets/DialogContentText-CEsqdDWz.js +0 -1
- package/dist/assets/Done-B1Id3HZ7.js +0 -1
- package/dist/assets/Download-5eyWxKFR.js +0 -1
- package/dist/assets/EditIcon-CyjMgREV.js +0 -1
- package/dist/assets/Error-CUxzkNdG.js +0 -1
- package/dist/assets/ExpandMore-CLLcIz7v.js +0 -1
- package/dist/assets/FormControl-BXjjQ2Cl.js +0 -1
- package/dist/assets/FormControlLabel-CRQiOFgY.js +0 -1
- package/dist/assets/FormGroup-CPYnhZEp.js +0 -1
- package/dist/assets/Grid-vQ4in7aJ.js +0 -1
- package/dist/assets/HelpOutline-CMsKsWc3.js +0 -1
- package/dist/assets/Hidden-ideB0Yow.js +0 -1
- package/dist/assets/InfoOutlined-5WyW673W.js +0 -1
- package/dist/assets/InputAdornment-BYO2j_v5.js +0 -1
- package/dist/assets/LastPage-CzXhZxbb.js +0 -1
- package/dist/assets/Launch-DYv1e-sP.js +0 -1
- package/dist/assets/LaunchOutlined-BxjL--pT.js +0 -1
- package/dist/assets/Link-BePn_RNM.js +0 -1
- package/dist/assets/ListItemButton-DFfqWy-t.js +0 -1
- package/dist/assets/ListSubheader-XVI0gGYq.js +0 -1
- package/dist/assets/LoadingButton-iTGCDYUz.js +0 -1
- package/dist/assets/LockIcon-Cj6s3Czr.js +0 -1
- package/dist/assets/Loop-JyIa8s4d.js +0 -1
- package/dist/assets/Menu-C6kynm4m.js +0 -1
- package/dist/assets/MoreHoriz-Cj6hh2tu.js +0 -1
- package/dist/assets/MoreVert-m5BY_p4K.js +0 -1
- package/dist/assets/OpenInNew-CIsQ-VD4.js +0 -1
- package/dist/assets/OutlinedInput-B93_cuhJ.js +0 -2
- package/dist/assets/PlayArrow-CSCQWAOp.js +0 -1
- package/dist/assets/QuestionMarkCircle-Bgaj2WkC.js +0 -1
- package/dist/assets/RadioGroup-DPurewE-.js +0 -1
- package/dist/assets/Search-Cy_vXJXs.js +0 -1
- package/dist/assets/Select-BoIViWSN.js +0 -1
- package/dist/assets/ServerLogo-C2FfSxkG.js +0 -1
- package/dist/assets/Stepper-CDMW7dY4.js +0 -1
- package/dist/assets/TextField-apRN2NFH.js +0 -1
- package/dist/assets/Toolbar-B0MDD2MX.js +0 -1
- package/dist/assets/ViewColumn-DLbcQUHz.js +0 -1
- package/dist/assets/ViewList-CYnd76EG.js +0 -1
- package/dist/assets/_createAggregator-jZ136RIi.js +0 -1
- package/dist/assets/access-control-D_3Sf3DH.js +0 -13
- package/dist/assets/actions-BEfqQHvh.js +0 -1
- package/dist/assets/add-component-core-8-K3kI62.js +0 -804
- package/dist/assets/add-resource-BJc9d35J.js +0 -1
- package/dist/assets/addon-C2s3597J.js +0 -31
- package/dist/assets/analytics-__YzXiEy.js +0 -52
- package/dist/assets/api-Du2npubO.js +0 -1
- package/dist/assets/audit-logs-DCsbxX3x.js +0 -59
- package/dist/assets/base32-CSHbjBse.js +0 -1
- package/dist/assets/branding-D8ZABeVU.js +0 -40
- package/dist/assets/bundle-avatar-DjGcv6Sg.js +0 -1
- package/dist/assets/button-BpodnaUj.js +0 -1
- package/dist/assets/click-to-copy-Ct4_CI1M.js +0 -1
- package/dist/assets/complete-CKV6Ebun.js +0 -45
- package/dist/assets/config-BnBRy_w4.js +0 -1
- package/dist/assets/config-C7arZYXl.js +0 -32
- package/dist/assets/config-space-D4B-Fcx4.js +0 -1
- package/dist/assets/confirm-CyScKRsz.js +0 -7
- package/dist/assets/connect-D50yPXAE.js +0 -5
- package/dist/assets/connect-DZgc6pEB.js +0 -1
- package/dist/assets/connect-to-Byo-gZWq.js +0 -29
- package/dist/assets/dashboard-lB4ZPVoV.js +0 -122
- package/dist/assets/deprecate-cv6v3EXd.js +0 -1
- package/dist/assets/did-address-pHUGf5mt.js +0 -1
- package/dist/assets/domain-UlRrTp1n.js +0 -9
- package/dist/assets/domain-list-CKs3EKNU.js +0 -15
- package/dist/assets/email-PtOk65dC.js +0 -18
- package/dist/assets/emotion-cache.browser.esm-DuQlBwjm.js +0 -1
- package/dist/assets/exchange-passport-DdO1PoJN.js +0 -1
- package/dist/assets/fallback-BMr0sE-j.js +0 -1
- package/dist/assets/form-text-input-C5wKQFKL.js +0 -11
- package/dist/assets/fuel-DkDXKRe9.js +0 -32
- package/dist/assets/fullpage-cRbvfPCn.js +0 -1
- package/dist/assets/get-safe-url-6c6RI8XT.js +0 -1
- package/dist/assets/get-safe-url-CwEZKvfc.js +0 -1
- package/dist/assets/home-D29pIqLK.js +0 -1
- package/dist/assets/iframe-BFiRQ7tw.js +0 -1
- package/dist/assets/index-72Zql8CQ.js +0 -5
- package/dist/assets/index-B27mVEab.js +0 -102
- package/dist/assets/index-B3dU1BRu.js +0 -1
- package/dist/assets/index-B5C90-kX.js +0 -1
- package/dist/assets/index-B6PbP50h.js +0 -1
- package/dist/assets/index-BUN78vRQ.js +0 -1
- package/dist/assets/index-BXoHPu8T.js +0 -5
- package/dist/assets/index-BcaFN_aP.js +0 -1
- package/dist/assets/index-Bgv4pLgc.js +0 -243
- package/dist/assets/index-BhxTb2Rs.js +0 -1
- package/dist/assets/index-Bo3ifRfa.js +0 -1
- package/dist/assets/index-BqLf0w23.js +0 -221
- package/dist/assets/index-C0UJXtze.js +0 -4
- package/dist/assets/index-C3YL4xGi.js +0 -1
- package/dist/assets/index-CMbz2eu6.js +0 -11
- package/dist/assets/index-CUdjeFH3.js +0 -1413
- package/dist/assets/index-C_mXaY4E.js +0 -1
- package/dist/assets/index-Cg_T1V-P.js +0 -544
- package/dist/assets/index-ChhcKroJ.js +0 -12
- package/dist/assets/index-CqnrpD4d.js +0 -134
- package/dist/assets/index-CtQolg_s.js +0 -1
- package/dist/assets/index-DSX7jfl3.js +0 -1
- package/dist/assets/index-DgoHglX6.js +0 -1
- package/dist/assets/index-Dim9am4F.js +0 -291
- package/dist/assets/index-DvwEbnCV.js +0 -13
- package/dist/assets/index-I-TxeVFM.js +0 -340
- package/dist/assets/index-ZSNG3xSj.js +0 -11
- package/dist/assets/index-foZCwT8M.css +0 -1
- package/dist/assets/index-q27UQsWn.js +0 -16
- package/dist/assets/index-q2_9XHCb.js +0 -721
- package/dist/assets/index-xuTvwkle.js +0 -316
- package/dist/assets/invitation-CI9oI0ML.js +0 -176
- package/dist/assets/invite-BD1LrTA8.js +0 -5
- package/dist/assets/isEmail-BCMyh8vZ.js +0 -1
- package/dist/assets/issue-passport-Bd-T51oN.js +0 -1
- package/dist/assets/item-CvCwtq6F.js +0 -1
- package/dist/assets/jss-plugin-props-sort.esm-KqvaA55X.js +0 -14
- package/dist/assets/layout-CqjS3RFh.js +0 -29
- package/dist/assets/list-header-DVNuHNDo.js +0 -57
- package/dist/assets/localization-Dutgz4tx.js +0 -1
- package/dist/assets/login-8AhFtIOc.js +0 -1
- package/dist/assets/login-oauth-callback-CsFM0yAZ.js +0 -1
- package/dist/assets/logo-uploader-DabQD2dA.js +0 -133
- package/dist/assets/lost-passport-CxN1g858.js +0 -168
- package/dist/assets/open-window-Banfzs4p.js +0 -1
- package/dist/assets/overview-DcAEoK9V.js +0 -12
- package/dist/assets/permission-WZrPwf2m.js +0 -1
- package/dist/assets/preferences-Ca7-Ov6u.js +0 -1
- package/dist/assets/publish-resource-DZ4bcjeq.js +0 -1
- package/dist/assets/purify.es-DutPtr9A.js +0 -2
- package/dist/assets/raf-schd.esm-CAeD1GPF.js +0 -1
- package/dist/assets/refType-Cd6nIb--.js +0 -1
- package/dist/assets/relative-time-DDo7Crj5.js +0 -1
- package/dist/assets/resource-dialog-CrGsGXEE.js +0 -299
- package/dist/assets/sdk-BTNAvCf8.js +0 -1
- package/dist/assets/selector-Br9-dR9y.js +0 -48
- package/dist/assets/session-BB2DljXy.js +0 -1
- package/dist/assets/setup-Cv1zGHfT.js +0 -19
- package/dist/assets/shorten-label-DT9X1B8w.js +0 -1
- package/dist/assets/simple-select-BAxNgpxE.js +0 -1
- package/dist/assets/slicedToArray-DyRQzefY.js +0 -2
- package/dist/assets/start-C7dSefgZ.js +0 -187
- package/dist/assets/step-actions-oy5A5R40.js +0 -31
- package/dist/assets/studio-Boj6f6bS.js +0 -6
- package/dist/assets/switch-control-ChW_GuaN.js +0 -13
- package/dist/assets/toPropertyKey-PLuKRk1e.js +0 -1
- package/dist/assets/toUpper-DXbBjpP8.js +0 -1
- package/dist/assets/transfer-CwhoFyG0.js +0 -16
- package/dist/assets/trim-D79XRDvY.js +0 -1
- package/dist/assets/uniqBy-BBGY8CA1.js +0 -1
- package/dist/assets/unsubscribe-BlsNq4VD.js +0 -1
- package/dist/assets/url-join-DILCgsel.js +0 -1
- package/dist/assets/use-mobile-B3qubz56.js +0 -1
- package/dist/assets/use-mobile-D8jiOBBW.js +0 -1
- package/dist/assets/useAsync-CwWuQ31n.js +0 -1
- package/dist/assets/useAsyncRetry-o3huFKOY.js +0 -7
- package/dist/assets/useFormControl-Bm0BZQS7.js +0 -1
- package/dist/assets/useLocalStorage-DdNsoUmT.js +0 -1
- package/dist/assets/useSetState-DuK5mvRn.js +0 -1
- package/dist/assets/useSlot-RdBOCJrx.js +0 -1
- package/dist/assets/useThemeProps-Bmm6xEda.js +0 -1
- package/dist/assets/user-center-6IaKm8kc.js +0 -201
- package/dist/assets/util-CZ4Gnuni.js +0 -1
- package/dist/assets/utils-DoM3o7-Q.js +0 -1
- package/dist/assets/visuallyHidden-Dan1xhjv.js +0 -1
- package/dist/assets/wrap-locale-DKHVNdE9.js +0 -1
package/LICENSE
CHANGED
package/api/index.js
CHANGED
|
@@ -416,6 +416,7 @@ module.exports = function createServer(node, serverOptions = {}) {
|
|
|
416
416
|
createConnectRelayRoutes.init(server, node, options, wsRouter);
|
|
417
417
|
authRoutes.attachDidAuthHandlers(server);
|
|
418
418
|
authRoutes.createPassportRoutes.init(server, node);
|
|
419
|
+
authRoutes.createPasskeyRoutes.init(server, node);
|
|
419
420
|
authRoutes.createCommonRoutes.init(server, node);
|
|
420
421
|
|
|
421
422
|
// API: gql
|
package/api/libs/auth/utils.js
CHANGED
|
@@ -33,38 +33,40 @@ async function transferPassport(fromUser, toUser, { req, teamDid, node, nodeInfo
|
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
const attachments =
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const vc = createPassportVC(vcParams);
|
|
59
|
-
return {
|
|
60
|
-
type: 'vc',
|
|
61
|
-
data: {
|
|
62
|
-
credential: vc,
|
|
63
|
-
tag: x.name,
|
|
36
|
+
const attachments = await Promise.all(
|
|
37
|
+
waitPassportList.map(async (x) => {
|
|
38
|
+
const vcParams = {
|
|
39
|
+
issuerName,
|
|
40
|
+
issuerWallet,
|
|
41
|
+
ownerDid: toUser.did,
|
|
42
|
+
passport: { ...pick(x, ['name', 'title', 'specVersion']), endpoint: x.endpoint || blockletInfo.appUrl },
|
|
43
|
+
endpoint: getPassportStatusEndpoint({
|
|
44
|
+
baseUrl: x.endpoint || blockletInfo.appUrl,
|
|
45
|
+
userDid: toUser.did,
|
|
46
|
+
teamDid,
|
|
47
|
+
}),
|
|
48
|
+
ownerProfile: {
|
|
49
|
+
email: toUser.email,
|
|
50
|
+
fullName: toUser.fullName,
|
|
51
|
+
avatar: getUserAvatarUrl(x.endpoint || blockletInfo.appUrl, toUser.avatar),
|
|
52
|
+
},
|
|
53
|
+
preferredColor: passportColor,
|
|
54
|
+
types: teamDid === nodeInfo.did ? [VC_TYPE_NODE_PASSPORT] : x.types,
|
|
55
|
+
purpose: teamDid === nodeInfo.did || isEmpty(x.types) ? 'login' : 'verification',
|
|
64
56
|
display: x.display,
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const vc = await createPassportVC(vcParams);
|
|
60
|
+
return {
|
|
61
|
+
type: 'vc',
|
|
62
|
+
data: {
|
|
63
|
+
credential: vc,
|
|
64
|
+
tag: x.name,
|
|
65
|
+
display: x.display,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
})
|
|
69
|
+
);
|
|
68
70
|
const insertPassportList = attachments.map((item, index) => {
|
|
69
71
|
return {
|
|
70
72
|
...createUserPassport(item.data.credential, { role: item.data.tag, display: item.data.display }),
|
|
@@ -31,6 +31,7 @@ const {
|
|
|
31
31
|
getPassportClaimUrl,
|
|
32
32
|
} = require('@abtnode/auth/lib/passport');
|
|
33
33
|
const { getKeyPairClaim, getAuthPrincipalForMigrateAppToV2 } = require('@abtnode/auth/lib/server');
|
|
34
|
+
const { checkInvitedUserOnly } = require('@abtnode/auth/lib/oauth');
|
|
34
35
|
const { fromAppDid } = require('@arcblock/did-ext');
|
|
35
36
|
const { LOGIN_PROVIDER, BLOCKLET_APP_SPACE_REQUIREMENT, DID_SPACES } = require('@blocklet/constant');
|
|
36
37
|
const createTranslator = require('@abtnode/util/lib/translate');
|
|
@@ -46,7 +47,7 @@ const { getDidSpacesInfoByClaims, silentAuthorizationInConnect } = require('@abt
|
|
|
46
47
|
const getRequestIP = require('@abtnode/util/lib/get-request-ip');
|
|
47
48
|
|
|
48
49
|
const logger = require('../logger')('connect');
|
|
49
|
-
const {
|
|
50
|
+
const { createTokenFn, getDidConnectVersion } = require('../../util');
|
|
50
51
|
const { transferPassport, PASSPORT_VC_TYPES } = require('../auth/utils');
|
|
51
52
|
const { migrateAccount, declareAccount } = require('../../services/oauth');
|
|
52
53
|
const { getKycClaims, verifyKycClaims, getPassportVc, isProfileUrlSupported, getProfileItems } = require('../kyc');
|
|
@@ -393,7 +394,7 @@ module.exports = {
|
|
|
393
394
|
|
|
394
395
|
const profile = claims.find((x) => x.type === 'profile');
|
|
395
396
|
|
|
396
|
-
vc = createPassportVC({
|
|
397
|
+
vc = await createPassportVC({
|
|
397
398
|
issuerName: name,
|
|
398
399
|
issuerWallet: wallet,
|
|
399
400
|
issuerAvatarUrl: getAppAvatarUrl(baseUrl),
|
package/api/routes/blocklet.js
CHANGED
|
@@ -244,7 +244,7 @@ module.exports = {
|
|
|
244
244
|
const hasOwnerPassport = (user.passports || []).some((x) => x.name === role);
|
|
245
245
|
if (hasOwnerPassport === false) {
|
|
246
246
|
// create vc
|
|
247
|
-
const vc = createPassportVC({
|
|
247
|
+
const vc = await createPassportVC({
|
|
248
248
|
issuerName: name,
|
|
249
249
|
issuerWallet: wallet,
|
|
250
250
|
issuerAvatarUrl: getAppAvatarUrl(appUrl),
|
package/api/routes/oauth.js
CHANGED
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
const { handleInvitationReceive, getApplicationInfo } = require('@abtnode/auth/lib/auth');
|
|
2
|
-
const {
|
|
2
|
+
const { createPassportList, createPassportSwitcher, checkInvitedUserOnly } = require('@abtnode/auth/lib/oauth');
|
|
3
3
|
const {
|
|
4
4
|
WELLKNOWN_SERVICE_PATH_PREFIX,
|
|
5
5
|
PASSPORT_STATUS,
|
|
6
6
|
ROLES,
|
|
7
7
|
SECURITY_RULE_DEFAULT_ID,
|
|
8
8
|
} = require('@abtnode/constant');
|
|
9
|
-
const { extractUserAvatar, getUserAvatarUrl
|
|
9
|
+
const { extractUserAvatar, getUserAvatarUrl } = require('@abtnode/util/lib/user');
|
|
10
10
|
const { fromAppDid } = require('@arcblock/did-ext');
|
|
11
|
-
const { getBlockletAppIdList } = require('@blocklet/meta/lib/util');
|
|
12
|
-
const uniq = require('lodash/uniq');
|
|
13
11
|
const last = require('lodash/last');
|
|
14
12
|
const pick = require('lodash/pick');
|
|
15
13
|
const sortBy = require('lodash/sortBy');
|
|
16
14
|
const cloneDeep = require('lodash/cloneDeep');
|
|
17
15
|
const { joinURL } = require('ufo');
|
|
16
|
+
const { upsertToPassports } = require('@abtnode/auth/lib/passport');
|
|
18
17
|
const { getWalletDid, getConnectedAccounts, getSourceProvider } = require('@blocklet/meta/lib/did-utils');
|
|
19
18
|
const formatContext = require('@abtnode/util/lib/format-context');
|
|
20
19
|
const createTranslator = require('@abtnode/util/lib/translate');
|
|
21
20
|
const getRequestIP = require('@abtnode/util/lib/get-request-ip');
|
|
22
21
|
const CustomError = require('@abtnode/util/lib/custom-error');
|
|
23
22
|
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
24
|
-
const { getActivePassports } = require('@abtnode/util/lib/passport');
|
|
25
23
|
const { withHttps, withTrailingSlash } = require('ufo');
|
|
26
24
|
|
|
27
25
|
const logger = require('../libs/logger')('oauth');
|
|
@@ -34,7 +32,7 @@ const OAuthApple = require('../libs/auth/adapters/apple');
|
|
|
34
32
|
const { getAvatarByEmail, transferPassport, getAvatarByUrl } = require('../libs/auth/utils');
|
|
35
33
|
const initJwt = require('../libs/jwt');
|
|
36
34
|
const { sendToUser } = require('../libs/notification');
|
|
37
|
-
const {
|
|
35
|
+
const { createTokenFn, getDidConnectVersion, redirectWithoutCache } = require('../util');
|
|
38
36
|
const federatedUtil = require('../util/federated');
|
|
39
37
|
const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired, isSameEmail } = require('../libs/kyc');
|
|
40
38
|
const checkUser = require('../middlewares/check-user');
|
|
@@ -768,67 +766,25 @@ async function unbind(req, node) {
|
|
|
768
766
|
}
|
|
769
767
|
|
|
770
768
|
module.exports = {
|
|
771
|
-
|
|
772
|
-
|
|
769
|
+
checkUser,
|
|
770
|
+
|
|
771
|
+
init(router, node, options) {
|
|
772
|
+
const { createSessionToken } = initJwt(node, options);
|
|
773
|
+
|
|
774
|
+
router.get(`${prefixApi}/configs`, async (req, res) => {
|
|
773
775
|
const blocklet = await req.getBlocklet();
|
|
774
776
|
const oauthConfig = blocklet?.settings?.oauth || {};
|
|
775
777
|
res.send(oauthConfig);
|
|
776
778
|
});
|
|
777
779
|
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
const issuerDidList = uniq([blockletWallet.address, ...getBlockletAppIdList(blockletInfo)]);
|
|
785
|
-
// NOTICE: 这里获取的 did 是当前登录用户的永久 did,无需查询 connectedAccount
|
|
786
|
-
const user = await node.getUser({ teamDid, user: { did: userDid } });
|
|
787
|
-
let ownerAvatarUrl = getUserAvatarUrl(appUrl, user.avatar);
|
|
788
|
-
try {
|
|
789
|
-
// FIXME: @zhanghan 暂时将 imageFilter 等 queryString 参数移除
|
|
790
|
-
const ownerAvatarUrlInstance = new URL(ownerAvatarUrl);
|
|
791
|
-
ownerAvatarUrlInstance.search = '';
|
|
792
|
-
ownerAvatarUrl = ownerAvatarUrlInstance.href;
|
|
793
|
-
} catch {
|
|
794
|
-
/* empty */
|
|
795
|
-
}
|
|
796
|
-
let issuerAvatarUrl = getAppAvatarUrl(appUrl);
|
|
797
|
-
try {
|
|
798
|
-
// FIXME: @zhanghan 暂时将 imageFilter 等 queryString 参数移除
|
|
799
|
-
const issuerAvatarUrlInstance = new URL(issuerAvatarUrl);
|
|
800
|
-
issuerAvatarUrlInstance.search = '';
|
|
801
|
-
issuerAvatarUrl = issuerAvatarUrlInstance.href;
|
|
802
|
-
} catch {
|
|
803
|
-
/* empty */
|
|
804
|
-
}
|
|
780
|
+
router.get(`${prefixApi}/passports`, checkUser, createPassportList(node, 'service'));
|
|
781
|
+
router.post(
|
|
782
|
+
`${prefixApi}/switch`,
|
|
783
|
+
checkUser,
|
|
784
|
+
createPassportSwitcher(node, createTokenFn(createSessionToken), 'service')
|
|
785
|
+
);
|
|
805
786
|
|
|
806
|
-
|
|
807
|
-
const passportTypes = getActivePassports({ passports }, issuerDidList).map((x) => {
|
|
808
|
-
return {
|
|
809
|
-
...pick(x, ['id', 'name', 'title', 'role', 'scope', 'role']),
|
|
810
|
-
display:
|
|
811
|
-
x.scope === 'custom'
|
|
812
|
-
? x.display
|
|
813
|
-
: createPassportSvg({
|
|
814
|
-
scope: x.scope,
|
|
815
|
-
role: x.role,
|
|
816
|
-
title: x.scope === 'kyc' ? x.name : x.title,
|
|
817
|
-
issuer: x.issuer.name,
|
|
818
|
-
issuerDid: x.issuer.id,
|
|
819
|
-
issuerAvatarUrl,
|
|
820
|
-
ownerName: user?.fullName,
|
|
821
|
-
ownerDid: userDid,
|
|
822
|
-
ownerAvatarUrl,
|
|
823
|
-
isDataUrl: true,
|
|
824
|
-
preferredColor: passportColor || 'auto',
|
|
825
|
-
}),
|
|
826
|
-
};
|
|
827
|
-
});
|
|
828
|
-
res.send(passportTypes);
|
|
829
|
-
});
|
|
830
|
-
|
|
831
|
-
server.post(`${prefixApi}/bind`, checkUser, async (req, res) => {
|
|
787
|
+
router.post(`${prefixApi}/bind`, checkUser, async (req, res) => {
|
|
832
788
|
try {
|
|
833
789
|
await bind(req, node, options);
|
|
834
790
|
res.status(200).json({});
|
|
@@ -842,7 +798,7 @@ module.exports = {
|
|
|
842
798
|
}
|
|
843
799
|
});
|
|
844
800
|
|
|
845
|
-
|
|
801
|
+
router.post(`${prefixApi}/unbind`, checkUser, async (req, res) => {
|
|
846
802
|
try {
|
|
847
803
|
await unbind(req, node, options);
|
|
848
804
|
res.status(200).json({});
|
|
@@ -856,58 +812,12 @@ module.exports = {
|
|
|
856
812
|
}
|
|
857
813
|
});
|
|
858
814
|
|
|
859
|
-
server.post(`${prefixApi}/switch`, checkUser, async (req, res) => {
|
|
860
|
-
const { did: userDid, provider } = req.user;
|
|
861
|
-
const { passportId } = req.body;
|
|
862
|
-
const blocklet = await req.getBlocklet();
|
|
863
|
-
const { did: teamDid, secret } = await req.getBlockletInfo();
|
|
864
|
-
// NOTICE: 这里获取的 did 是当前登录用户的永久 did,无需查询 connectedAccount
|
|
865
|
-
const user = await node.getUser({ teamDid, user: { did: userDid } });
|
|
866
|
-
const { passports = [] } = user || {};
|
|
867
|
-
const passport = passportId
|
|
868
|
-
? passports.find((item) => item.id === passportId)
|
|
869
|
-
: { name: 'Guest', role: 'guest', scope: 'passport' };
|
|
870
|
-
await node.createAuditLog(
|
|
871
|
-
{
|
|
872
|
-
action: 'switchPassport',
|
|
873
|
-
args: { teamDid, userDid, passport, provider: user?.sourceProvider },
|
|
874
|
-
context: formatContext(Object.assign(req, { user })),
|
|
875
|
-
result: user,
|
|
876
|
-
},
|
|
877
|
-
node
|
|
878
|
-
);
|
|
879
|
-
const { createSessionToken } = initJwt(node, options);
|
|
880
|
-
const createToken = createTokenFn(createSessionToken);
|
|
881
|
-
const sessionConfig = blocklet.settings?.session || {};
|
|
882
|
-
const { sessionToken, refreshToken } = createToken(
|
|
883
|
-
userDid,
|
|
884
|
-
{
|
|
885
|
-
secret,
|
|
886
|
-
passport,
|
|
887
|
-
role: passport.scope === 'passport' ? passport.role : ROLES.GUEST,
|
|
888
|
-
fullName: user?.fullName,
|
|
889
|
-
provider,
|
|
890
|
-
walletOS: 'web',
|
|
891
|
-
emailVerified: !!user?.emailVerified,
|
|
892
|
-
phoneVerified: !!user?.phoneVerified,
|
|
893
|
-
},
|
|
894
|
-
{ ...sessionConfig, didConnectVersion: getDidConnectVersion(req) }
|
|
895
|
-
);
|
|
896
|
-
|
|
897
|
-
// for backward compatibility
|
|
898
|
-
if (!getDidConnectVersion(req)) {
|
|
899
|
-
res.status(200).send(sessionToken);
|
|
900
|
-
}
|
|
901
|
-
|
|
902
|
-
res.status(200).json({ sessionToken, refreshToken });
|
|
903
|
-
});
|
|
904
|
-
|
|
905
815
|
/**
|
|
906
816
|
* oauth 方式登录
|
|
907
817
|
* 1. 普通配置下,登录/注册是同样的流程,登录过程中会自动注册账号
|
|
908
818
|
* 2. 仅邀请可登录模式下,只允许登录,不允许注册
|
|
909
819
|
*/
|
|
910
|
-
|
|
820
|
+
router.post(`${prefixApi}/login`, async (req, res) => {
|
|
911
821
|
const { action = 'login' } = req.body;
|
|
912
822
|
const actionMap = {
|
|
913
823
|
login,
|
|
@@ -931,7 +841,7 @@ module.exports = {
|
|
|
931
841
|
}
|
|
932
842
|
});
|
|
933
843
|
|
|
934
|
-
|
|
844
|
+
router.post(`${prefixApi}/getUser`, async (req, res) => {
|
|
935
845
|
const { provider, token, idToken, code, appPid } = req.body;
|
|
936
846
|
const blocklet = await req.getBlocklet();
|
|
937
847
|
const oauthInfo = await getOAuthUserInfo({ blocklet, provider, token, idToken, code, appPid });
|
|
@@ -959,7 +869,7 @@ module.exports = {
|
|
|
959
869
|
};
|
|
960
870
|
};
|
|
961
871
|
|
|
962
|
-
|
|
872
|
+
router.get(`${prefix}/login/:provider`, checkReferrerMiddleware(), async (req, res) => {
|
|
963
873
|
const { provider } = req.params;
|
|
964
874
|
const blocklet = await req.getBlocklet();
|
|
965
875
|
const availableProviderList = Object.keys(blocklet.settings?.oauth).filter(
|
|
@@ -977,7 +887,7 @@ module.exports = {
|
|
|
977
887
|
|
|
978
888
|
// HACK: apple 需要特殊处理,callback 使用的是 post 请求返回的,通过特殊处理转为 get 请求,转由前端继续处理
|
|
979
889
|
// 此处改为所有 provider 都兼容的模式
|
|
980
|
-
|
|
890
|
+
router.post(`${prefix}/callback/:provider`, (req, res) => {
|
|
981
891
|
/**
|
|
982
892
|
* @type {{code?: string, user?: {name: {firstName: string, lastName: string}, email: string}}}
|
|
983
893
|
*/
|
package/api/routes/user.js
CHANGED
|
@@ -4,22 +4,23 @@ const { fromAppDid } = require('@arcblock/did-ext');
|
|
|
4
4
|
const { extractUserAvatar } = require('@abtnode/util/lib/user');
|
|
5
5
|
const formatContext = require('@abtnode/util/lib/format-context');
|
|
6
6
|
const createTranslator = require('@abtnode/util/lib/translate');
|
|
7
|
+
const { fromBase64 } = require('@ocap/util');
|
|
7
8
|
const { isFromPublicKey } = require('@arcblock/did');
|
|
8
9
|
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
9
|
-
const sortBy = require('lodash/sortBy');
|
|
10
|
-
const head = require('lodash/head');
|
|
11
10
|
const pick = require('lodash/pick');
|
|
12
11
|
const merge = require('lodash/merge');
|
|
13
12
|
const omitBy = require('lodash/omitBy');
|
|
13
|
+
const { getLastUsedPassport } = require('@abtnode/auth/lib/passport');
|
|
14
14
|
const { verify, decode } = require('@arcblock/jwt');
|
|
15
15
|
const { getWallet } = require('@blocklet/meta/lib/did-utils');
|
|
16
16
|
const { Joi } = require('@arcblock/validator');
|
|
17
17
|
const { parse } = require('@abtnode/core/lib/util/ua');
|
|
18
|
+
const { checkInvitedUserOnly } = require('@abtnode/auth/lib/oauth');
|
|
18
19
|
const getRequestIP = require('@abtnode/util/lib/get-request-ip');
|
|
19
20
|
const formatError = require('@abtnode/util/lib/format-error');
|
|
20
21
|
const CustomError = require('@abtnode/util/lib/custom-error');
|
|
21
22
|
|
|
22
|
-
const {
|
|
23
|
+
const { createTokenFn, getDidConnectVersion } = require('../util');
|
|
23
24
|
const initJwt = require('../libs/jwt');
|
|
24
25
|
const { getAvatarByUrl } = require('../libs/auth/utils');
|
|
25
26
|
const { loginWalletSchema, loginOAuthSchema, loginUserWalletSchema, checkUserSchema } = require('../validators/login');
|
|
@@ -33,7 +34,12 @@ const { Profile } = require('../state/profile');
|
|
|
33
34
|
|
|
34
35
|
const validateUser = (user) => {
|
|
35
36
|
try {
|
|
36
|
-
return
|
|
37
|
+
return (
|
|
38
|
+
user &&
|
|
39
|
+
user.did &&
|
|
40
|
+
user.pk &&
|
|
41
|
+
(isFromPublicKey(user.did, user.pk) || isFromPublicKey(user.did, fromBase64(user.pk)))
|
|
42
|
+
);
|
|
37
43
|
} catch (e) {
|
|
38
44
|
return false;
|
|
39
45
|
}
|
|
@@ -524,28 +530,7 @@ module.exports = {
|
|
|
524
530
|
const { createSessionToken } = initJwt(node, options);
|
|
525
531
|
const createToken = createTokenFn(createSessionToken);
|
|
526
532
|
const sessionConfig = blocklet.settings?.session || {};
|
|
527
|
-
const
|
|
528
|
-
|
|
529
|
-
let passport = null;
|
|
530
|
-
if (passportId) {
|
|
531
|
-
passport = passports.find((x) => x.status === 'valid' && x.passportId === passportId);
|
|
532
|
-
}
|
|
533
|
-
if (!passport) {
|
|
534
|
-
const now = new Date().getTime();
|
|
535
|
-
passport = head(
|
|
536
|
-
sortBy(passports, (x) => {
|
|
537
|
-
const lastLoginAt = new Date(x.lastLoginAt).getTime();
|
|
538
|
-
if (typeof lastLoginAt === 'number') {
|
|
539
|
-
return now - lastLoginAt;
|
|
540
|
-
}
|
|
541
|
-
return now;
|
|
542
|
-
})
|
|
543
|
-
);
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
if (!passport) {
|
|
547
|
-
passport = { name: 'Guest', role: 'guest' };
|
|
548
|
-
}
|
|
533
|
+
const passport = getLastUsedPassport(currentUser?.passports || [], passportId);
|
|
549
534
|
|
|
550
535
|
const lastLoginIp = getRequestIP(req);
|
|
551
536
|
const loggedInUser = await node.loginUser({
|
|
@@ -236,8 +236,7 @@ module.exports = function createRoutes(node, _, createSessionToken) {
|
|
|
236
236
|
preferredColor: passportColor,
|
|
237
237
|
};
|
|
238
238
|
|
|
239
|
-
const vc = createPassportVC(vcParams);
|
|
240
|
-
|
|
239
|
+
const vc = await createPassportVC(vcParams);
|
|
241
240
|
const role = getRoleFromLocalPassport(get(vc, 'credentialSubject.passport'));
|
|
242
241
|
const passport = createUserPassport(vc, { role });
|
|
243
242
|
|
|
@@ -30,7 +30,7 @@ const checkOwner = async ({ node, userDid, blocklet }) => {
|
|
|
30
30
|
return user;
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
module.exports = function createRoutes(node,
|
|
33
|
+
module.exports = function createRoutes(node, authenticator, createSessionToken) {
|
|
34
34
|
return {
|
|
35
35
|
action: 'setup',
|
|
36
36
|
onConnect: async ({ req, userDid, extraParams: { locale } }) => {
|
|
@@ -113,7 +113,12 @@ module.exports = function createRoutes(node, _authenticator, createSessionToken)
|
|
|
113
113
|
|
|
114
114
|
// Generate new session token that client can save to localStorage
|
|
115
115
|
// HACK: 此处没有 passportId,所以特意不设置 refreshToken,失效后下次登录就能选择合适的 passport
|
|
116
|
-
const sessionToken = await createSessionToken(userDid, {
|
|
116
|
+
const sessionToken = await createSessionToken(userDid, {
|
|
117
|
+
secret,
|
|
118
|
+
role: 'owner',
|
|
119
|
+
fullName: profile?.fullName,
|
|
120
|
+
elevated: true,
|
|
121
|
+
});
|
|
117
122
|
await updateSession({ sessionToken }, true);
|
|
118
123
|
logger.info('setup.connect.success', { userDid });
|
|
119
124
|
} catch (err) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const { messages } = require('@abtnode/auth/lib/auth');
|
|
2
|
-
const { authenticateByVc, getVerifyAccessClaims } = require('@abtnode/auth/lib/server');
|
|
3
|
-
const { ROLES
|
|
2
|
+
const { authenticateByVc, getVerifyAccessClaims, validateVerifyDestroyRequest } = require('@abtnode/auth/lib/server');
|
|
3
|
+
const { ROLES } = require('@abtnode/constant');
|
|
4
4
|
const { getSourceAppPid } = require('@blocklet/sdk/lib/util/login');
|
|
5
5
|
const { fromBase64 } = require('@ocap/util');
|
|
6
6
|
const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
@@ -26,20 +26,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
26
26
|
throw new Error(messages.notAuthorized[locale]);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
const parsed = JSON.parse(fromBase64(payload).toString());
|
|
31
|
-
if (!MFA_PROTECTED_METHODS.includes(parsed.action)) {
|
|
32
|
-
throw new Error(messages.notAllowed[locale]);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// ensure roles are valid
|
|
36
|
-
const expected = roles
|
|
37
|
-
.split(',')
|
|
38
|
-
.map((x) => x.trim())
|
|
39
|
-
.filter(Boolean);
|
|
40
|
-
if (expected.some((x) => !ALLOWED_ROLES.includes(x))) {
|
|
41
|
-
throw new Error(messages.notAllowed[locale]);
|
|
42
|
-
}
|
|
29
|
+
const expected = validateVerifyDestroyRequest({ payload, roles, locale, allowedRoles: ALLOWED_ROLES });
|
|
43
30
|
|
|
44
31
|
const sourceAppPid = getSourceAppPid(request);
|
|
45
32
|
return {
|
|
@@ -37,6 +37,7 @@ const createVerifyDestroyAuth = require('./connect/verify-destroy');
|
|
|
37
37
|
const createReceiveTransferAppOwnerRoutes = require('./connect/receive-transfer-app-owner');
|
|
38
38
|
const createSessionRoutes = require('./session');
|
|
39
39
|
const createPassportRoutes = require('./passport');
|
|
40
|
+
const createPasskeyRoutes = require('./passkey');
|
|
40
41
|
const { getRedirectUrl, shouldIgnoreUrl, redirectWithoutCache } = require('../../util');
|
|
41
42
|
const { createConnectToDidSpacesForUserRoute } = require('./connect/connect-to-did-spaces-for-user');
|
|
42
43
|
const { isEmailKycRequired, isPhoneKycRequired } = require('../../libs/kyc');
|
|
@@ -249,6 +250,9 @@ const init = ({ node, options }) => {
|
|
|
249
250
|
|
|
250
251
|
// public http api
|
|
251
252
|
routes.createPassportRoutes = createPassportRoutes;
|
|
253
|
+
routes.createPasskeyRoutes = {
|
|
254
|
+
init: (router) => createPasskeyRoutes.init(router, node, options, createSessionToken),
|
|
255
|
+
};
|
|
252
256
|
routes.createSessionRoutes = {
|
|
253
257
|
// eslint-disable-next-line no-shadow
|
|
254
258
|
init: (router, node) =>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const { createPasskeyHandlers } = require('@abtnode/auth/lib/passkey');
|
|
2
|
+
const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
|
|
3
|
+
const { createPassportList, createPassportSwitcher } = require('@abtnode/auth/lib/oauth');
|
|
4
|
+
const { createTokenFn } = require('../../util');
|
|
5
|
+
const { checkUser } = require('../../routes/oauth');
|
|
6
|
+
|
|
7
|
+
module.exports = {
|
|
8
|
+
init(router, node, options, createSessionToken) {
|
|
9
|
+
const createToken = createTokenFn(createSessionToken);
|
|
10
|
+
|
|
11
|
+
const {
|
|
12
|
+
ensurePasskeySession,
|
|
13
|
+
ensureUser,
|
|
14
|
+
handleRegisterRequest,
|
|
15
|
+
handleRegisterResponse,
|
|
16
|
+
handleAuthRequest,
|
|
17
|
+
handleAuthResponse,
|
|
18
|
+
} = createPasskeyHandlers(node, 'service', createToken);
|
|
19
|
+
|
|
20
|
+
const prefix = `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/passkey`;
|
|
21
|
+
|
|
22
|
+
router.get(`${prefix}/register`, handleRegisterRequest);
|
|
23
|
+
router.post(`${prefix}/register`, ensurePasskeySession, handleRegisterResponse);
|
|
24
|
+
router.get(`${prefix}/auth`, ensureUser, handleAuthRequest);
|
|
25
|
+
router.post(`${prefix}/auth`, ensurePasskeySession, handleAuthResponse);
|
|
26
|
+
|
|
27
|
+
// Following routes are same as oauth routes
|
|
28
|
+
router.get(`${prefix}/passports`, checkUser, createPassportList(node, 'service'));
|
|
29
|
+
router.post(`${prefix}/switch`, checkUser, createPassportSwitcher(node, createToken, 'service'));
|
|
30
|
+
},
|
|
31
|
+
};
|
|
@@ -2,8 +2,8 @@ const { getPassportStatus } = require('@abtnode/auth/lib/auth');
|
|
|
2
2
|
const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
|
|
3
3
|
|
|
4
4
|
module.exports = {
|
|
5
|
-
init(
|
|
6
|
-
|
|
5
|
+
init(router, node) {
|
|
6
|
+
router.get(`${WELLKNOWN_SERVICE_PATH_PREFIX}/api/passport/status`, async (req, res) => {
|
|
7
7
|
const { vcId, userDid, locale } = req.query;
|
|
8
8
|
const teamDid = req.headers['x-blocklet-did'];
|
|
9
9
|
|
|
@@ -23,14 +23,15 @@ const authenticateConnect = (req, cb) => {
|
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
JWT.verify(token, pk)
|
|
27
|
+
.then(() => {
|
|
28
|
+
const decoded = JWT.decode(token);
|
|
29
|
+
const info = getTokenInfo(decoded);
|
|
30
|
+
cb(null, info);
|
|
31
|
+
})
|
|
32
|
+
.catch((err) => {
|
|
33
|
+
cb(err, null);
|
|
34
|
+
});
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
const authenticateJoinChannel = async ({ topic: channel, payload, node }) => {
|
|
@@ -45,7 +46,7 @@ const authenticateJoinChannel = async ({ topic: channel, payload, node }) => {
|
|
|
45
46
|
// so we need to support token is valid for one day
|
|
46
47
|
const tolerance = 3600 * 24;
|
|
47
48
|
|
|
48
|
-
if (!JWT.verify(payload.token, payload.pk, { tolerance })) {
|
|
49
|
+
if (!(await JWT.verify(payload.token, payload.pk, { tolerance }))) {
|
|
49
50
|
throw new Error(`verify did failed: ${info.did}`);
|
|
50
51
|
}
|
|
51
52
|
|
|
@@ -20,6 +20,7 @@ const states = require('../../state');
|
|
|
20
20
|
const { validateEmail, sendEmail } = require('../../libs/email');
|
|
21
21
|
const { sendPush } = require('../../libs/push-kit');
|
|
22
22
|
const { getBlockletInfo } = require('../../cache');
|
|
23
|
+
const { nanoid } = require('../../util');
|
|
23
24
|
|
|
24
25
|
const CHANNEL_FIELD_MAP = {
|
|
25
26
|
wallet: ['walletSendStatus', 'walletSendAt'],
|
|
@@ -192,6 +193,8 @@ const sendToUserDid = async ({ sender, receiver: rawDid, notification, options,
|
|
|
192
193
|
});
|
|
193
194
|
}
|
|
194
195
|
|
|
196
|
+
// 为消息添加一个ID,wallet钱包接受消息会使用这个字段
|
|
197
|
+
data.id = data.id || doc?.id || nanoid();
|
|
195
198
|
// 发送钱包消息
|
|
196
199
|
if (channels.includes('app')) {
|
|
197
200
|
for (const receiverDid of receiverAppDidList) {
|
package/api/socket/util.js
CHANGED
|
@@ -23,6 +23,8 @@ const parseNotification = (notification, senderInfo) => {
|
|
|
23
23
|
x.createdAt = new Date();
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
x.type = x.type || 'notification';
|
|
27
|
+
|
|
26
28
|
x.sender = {
|
|
27
29
|
// did is permanent did of an application that is used to identify the application by DID Wallet
|
|
28
30
|
did: senderInfo.permanentWallet.address,
|
|
@@ -60,7 +62,7 @@ const ensureSenderApp = async ({ sender, node, nodeInfo }) => {
|
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
const { wallet } = appInfo;
|
|
63
|
-
if (!JWT.verify(sender.token, wallet.publicKey)) {
|
|
65
|
+
if (!(await JWT.verify(sender.token, wallet.publicKey))) {
|
|
64
66
|
throw new Error(`Invalid authentication token for sender blocklet: ${sender.appDid}`);
|
|
65
67
|
}
|
|
66
68
|
|
|
@@ -159,6 +159,7 @@ module.exports = ({ node, req, options }) => {
|
|
|
159
159
|
};
|
|
160
160
|
|
|
161
161
|
const user = await verifySessionToken(token, secret, opt);
|
|
162
|
+
|
|
162
163
|
if (user && visitorId) {
|
|
163
164
|
const [userSession] = await node.getUserSession({
|
|
164
165
|
teamDid,
|
|
@@ -166,14 +167,14 @@ module.exports = ({ node, req, options }) => {
|
|
|
166
167
|
userDid: user.did,
|
|
167
168
|
visitorId,
|
|
168
169
|
});
|
|
169
|
-
if (
|
|
170
|
-
|
|
171
|
-
|
|
170
|
+
if (userSession) {
|
|
171
|
+
req.userSession = userSession;
|
|
172
|
+
}
|
|
172
173
|
}
|
|
173
174
|
req.user = user;
|
|
174
175
|
}
|
|
175
176
|
} catch (error) {
|
|
176
|
-
|
|
177
|
+
console.error('Failed to ensureUser', error);
|
|
177
178
|
}
|
|
178
179
|
};
|
|
179
180
|
|