@abtnode/blocklet-services 1.16.26-beta-5251ab18 → 1.16.26-beta-351de484
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/auth/adapters/apple.js +78 -0
- package/api/libs/auth/adapters/auth0.js +56 -0
- package/api/libs/auth/adapters/facebook.js +34 -0
- package/api/libs/auth/adapters/github.js +75 -0
- package/api/libs/auth/adapters/google.js +66 -0
- package/api/libs/auth/adapters/twitter.js +22 -0
- package/api/libs/auth/index.js +170 -0
- package/api/routes/federated.js +23 -1
- package/api/routes/oauth.js +257 -102
- package/api/services/auth/connect/receive-transfer-app-owner.js +7 -1
- package/api/services/oauth/index.js +70 -0
- package/api/util/federated.js +2 -2
- package/dist/assets/{Add-Bk5PVfmO.js → Add-C69qn2wR.js} +1 -1
- package/dist/assets/{AddBox-D5JAgq6v.js → AddBox-B6Fwg2Rf.js} +1 -1
- package/dist/assets/{Alert-BW0BXLCA.js → Alert-ssp0y7Ib.js} +1 -1
- package/dist/assets/{ArrowDropDown-duzp9dpl.js → ArrowDropDown-BP0ud9Hj.js} +1 -1
- package/dist/assets/{Avatar-HGbeW7TM.js → Avatar-D2tnGRpU.js} +1 -1
- package/dist/assets/{ButtonGroup-DPyBbsws.js → ButtonGroup-BLLuxmvy.js} +1 -1
- package/dist/assets/{CheckCircle-BM1wWcPP.js → CheckCircle-BfaSnFeT.js} +1 -1
- package/dist/assets/{ChevronRight-yW5aFcR7.js → ChevronRight-Cy-7I5by.js} +1 -1
- package/dist/assets/{CloseOutlined-f8LbKdKG.js → CloseOutlined-sn7xb1bx.js} +1 -1
- package/dist/assets/{Delete-BFnYNmMq.js → Delete-B2AHSgLp.js} +1 -1
- package/dist/assets/{DeleteOutline-BlvyMWjx.js → DeleteOutline-CoZFf1fL.js} +1 -1
- package/dist/assets/{Done-GZB4BBQK.js → Done-DIK-gyz7.js} +1 -1
- package/dist/assets/{Download-BaAfTxup.js → Download-DTMBVNgK.js} +1 -1
- package/dist/assets/{Edit-SHYieh_N.js → Edit-6i4-SV5e.js} +1 -1
- package/dist/assets/{EditIcon-nbG3lw43.js → EditIcon-DR2M6B2a.js} +1 -1
- package/dist/assets/Error-D5jNQIhZ.js +1 -0
- package/dist/assets/{ExpandMore-BcgzaLXP.js → ExpandMore-BlRkbxIp.js} +1 -1
- package/dist/assets/{FilterList-CemilOeU.js → FilterList-5-9UBP9o.js} +4 -4
- package/dist/assets/{FormControl-B_aaPeMx.js → FormControl-DqRtQrj4.js} +1 -1
- package/dist/assets/{FormControlLabel-B8AYq1Fg.js → FormControlLabel-CgWEo7K_.js} +1 -1
- package/dist/assets/{FormGroup-DjKYSpqL.js → FormGroup-BmQQZp_5.js} +1 -1
- package/dist/assets/{Google-CaRM9q9Z.js → Google-Dqg-7vso.js} +4 -4
- package/dist/assets/{Grid-D86Ruwaf.js → Grid-BIu6B9VD.js} +1 -1
- package/dist/assets/{Hidden-6es5MMPN.js → Hidden-CyJIFPqO.js} +1 -1
- package/dist/assets/{InfoOutlined-4hnoKWhJ.js → InfoOutlined-BrDpDVIb.js} +1 -1
- package/dist/assets/{InputAdornment-CI7c7_VR.js → InputAdornment-4xRIAUiI.js} +1 -1
- package/dist/assets/{InputLabel-Cfq4kSY6.js → InputLabel-Ci8Zez4U.js} +1 -1
- package/dist/assets/{LastPage-B7f-FFHR.js → LastPage-u0X1CCrf.js} +1 -1
- package/dist/assets/{Launch-Bspy6S12.js → Launch-CPOdFkdd.js} +1 -1
- package/dist/assets/{LaunchOutlined-CmaY0eVc.js → LaunchOutlined-BFmhp0eE.js} +1 -1
- package/dist/assets/{Link-CmWERGfF.js → Link-3QVwMQPk.js} +1 -1
- package/dist/assets/{ListItemText-BkMl1tkH.js → ListItemText-BbCA9KKV.js} +1 -1
- package/dist/assets/{LockIcon-g4En0fjm.js → LockIcon-BH8DxlZk.js} +1 -1
- package/dist/assets/{Loop-BSp9gEZ9.js → Loop-DH87MBn_.js} +1 -1
- package/dist/assets/{MoreHoriz-DnI1QPyb.js → MoreHoriz-BgseW-ge.js} +1 -1
- package/dist/assets/{MoreVert-1OIhp21J.js → MoreVert-K_1niM7c.js} +1 -1
- package/dist/assets/{OpenInNew-DAAhUmMK.js → OpenInNew-CjFvxH6M.js} +1 -1
- package/dist/assets/{Pagination-Dg6BaPHN.js → Pagination-DKihrHVe.js} +2 -2
- package/dist/assets/{PlayArrow-D_MZJM3t.js → PlayArrow-DOP79lp-.js} +1 -1
- package/dist/assets/{RadioGroup-CXLz4lFh.js → RadioGroup-YSjZvhX-.js} +1 -1
- package/dist/assets/{Search-DAh0uWGv.js → Search-BR5ea3vd.js} +1 -1
- package/dist/assets/{Select-Cgn3Vg5m.js → Select-CKfMC7P9.js} +2 -2
- package/dist/assets/{ServerLogo-CSZtPVVb.js → ServerLogo-C8axw3cY.js} +1 -1
- package/dist/assets/{Skeleton-D-4kr8ZC.js → Skeleton-DlvCFRkz.js} +3 -3
- package/dist/assets/{Slider-DF1W4LCK.js → Slider-BR3lL8ok.js} +1 -1
- package/dist/assets/{Stepper-C8vmf5Xt.js → Stepper-CQAZ_wrh.js} +1 -1
- package/dist/assets/{TableRow-D4ZVEGDR.js → TableRow-G_vHt3-a.js} +2 -2
- package/dist/assets/{TextField-DhdT-agz.js → TextField-DvirKXAG.js} +1 -1
- package/dist/assets/{Toolbar-CEiHPS82.js → Toolbar-BwsW1-XD.js} +1 -1
- package/dist/assets/{ViewList-PgnY-32h.js → ViewList-DRQAW-9s.js} +1 -1
- package/dist/assets/access-control-CjZfkzkf.js +13 -0
- package/dist/assets/{actions-DQHOwUAb.js → actions-BJosy9X2.js} +1 -1
- package/dist/assets/{add-component-core-NVq1_6cn.js → add-component-core-Bd75KmSE.js} +28 -28
- package/dist/assets/add-resource-Blgo6VIb.js +1 -0
- package/dist/assets/{addon-Dtevz_vd.js → addon-BdxxNkJH.js} +1 -1
- package/dist/assets/{analytics-CvYG8nhu.js → analytics-2367oE4k.js} +8 -8
- package/dist/assets/api-DcYvzDkD.js +1 -0
- package/dist/assets/ar-B34f4HdK.js +1 -0
- package/dist/assets/ar-D80LEtfP.js +1 -0
- package/dist/assets/{audit-logs-D--qJqXp.js → audit-logs-C9bazLVN.js} +4 -4
- package/dist/assets/{button-DbiqtNU7.js → button-DbDB2qx6.js} +1 -1
- package/dist/assets/{click-to-copy-xb_2luih.js → click-to-copy-CZvSRIGN.js} +1 -1
- package/dist/assets/{complete-DiC3uh0z.js → complete-C8SMtDzc.js} +4 -4
- package/dist/assets/{component-BjEDMxHG.js → component-DAWLQ6nL.js} +4 -4
- package/dist/assets/{config-Co7kvflu.js → config-DY1CerHN.js} +1 -1
- package/dist/assets/{config-BvXbpv5O.js → config-DpteWrvn.js} +2 -2
- package/dist/assets/{config-navigation-CG7yJKS1.js → config-navigation-DUYmMrZ9.js} +3 -3
- package/dist/assets/{config-space-6tKGUs7Q.js → config-space-B7Cgf5Se.js} +1 -1
- package/dist/assets/confirm-pPzim8uI.js +7 -0
- package/dist/assets/{connect-WHn9zWaL.js → connect-4dSo0Eiu.js} +1 -1
- package/dist/assets/{connect-CriqyaGA.js → connect-M2gGxpP6.js} +1 -1
- package/dist/assets/connect-to-B8kCNKHN.js +54 -0
- package/dist/assets/{content-layout-zI3u8r3r.js → content-layout-6_5eggY7.js} +1 -1
- package/dist/assets/{dashboard-YqbHS82F.js → dashboard-nWvY-y5T.js} +10 -10
- package/dist/assets/de-CbWSpQPN.js +1 -0
- package/dist/assets/de-R8SpyfWD.js +1 -0
- package/dist/assets/{did-address-YDP590gT.js → did-address-CL3Ygw6p.js} +1 -1
- package/dist/assets/domain-list-D3SCkX5b.js +12 -0
- package/dist/assets/domain-ngITiwlU.js +9 -0
- package/dist/assets/es-D2WPMiOg.js +1 -0
- package/dist/assets/es-DQJXbL8c.js +1 -0
- package/dist/assets/exchange-passport-D3hdhtRp.js +1 -0
- package/dist/assets/{fallback-DVviDIIg.js → fallback-C7-7MBkn.js} +1 -1
- package/dist/assets/fr-BU_67rSB.js +1 -0
- package/dist/assets/fr-ojA_joLk.js +1 -0
- package/dist/assets/{fuel-DOgsE52q.js → fuel-Cc2B50AI.js} +1 -1
- package/dist/assets/{fullpage-DRlR-ssw.js → fullpage-Dw6TVBrW.js} +1 -1
- package/dist/assets/hi-BQAxHgmg.js +1 -0
- package/dist/assets/hi-D5wWKqkp.js +1 -0
- package/dist/assets/home-xAHytUWc.js +1 -0
- package/dist/assets/id-BerMjI8d.js +1 -0
- package/dist/assets/id-Do44PG5N.js +1 -0
- package/dist/assets/iframe-CjfFUNKJ.js +1 -0
- package/dist/assets/{index-DX8z7c_g.js → index-56o2iokr.js} +1 -1
- package/dist/assets/{index-CZEn3dvX.js → index-5x037-9C.js} +2 -2
- package/dist/assets/{index-CTExvK7D.js → index-8MsvtmQl.js} +1 -1
- package/dist/assets/{index-CfMCsWIO.js → index-BWj9cvWK.js} +1 -1
- package/dist/assets/index-BXDXNTsu.js +262 -0
- package/dist/assets/{index-F90nw9gz.js → index-BlQH_bza.js} +15 -17
- package/dist/assets/{index-DXZwKN-h.js → index-BmYpFvRB.js} +1 -1
- package/dist/assets/index-BpozpbRW.js +11 -0
- package/dist/assets/{index-zE5caQ1q.js → index-Bqkn_aa3.js} +1 -1
- package/dist/assets/{index-9-wdqB69.js → index-C2bRXXcw.js} +7 -7
- package/dist/assets/index-C5wALap9.js +54 -0
- package/dist/assets/index-C7FkvChp.js +221 -0
- package/dist/assets/{index-C88pPxz9.js → index-CJpqNyVi.js} +7 -7
- package/dist/assets/index-CS4hdKgN.js +13 -0
- package/dist/assets/{index-DjAUj5p0.js → index-CYChkNo6.js} +1 -1
- package/dist/assets/{index-D7kuWzxY.js → index-CYMsHjcv.js} +7 -7
- package/dist/assets/{index-ByCfsCp_.js → index-Coe2L95f.js} +1 -1
- package/dist/assets/{index-CzyEcNDb.js → index-D9bkjrIm.js} +1 -1
- package/dist/assets/{index-Bmrpwj-b.js → index-DNO8iFFj.js} +9 -9
- package/dist/assets/{index-ErTwOyBF.js → index-DSr4gSZ6.js} +1 -1
- package/dist/assets/index-DlPsSbdP.js +12 -0
- package/dist/assets/{index-BQm6oDuT.js → index-DoFezns_.js} +1 -1
- package/dist/assets/{index-DjeecS-A.js → index-Dwkydwe_.js} +8 -8
- package/dist/assets/index-MHeXbht_.js +1290 -0
- package/dist/assets/{index-Bh3b-DCR.js → index-i3hx5_MJ.js} +1 -1
- package/dist/assets/{index-Tcuzrh9u.js → index-iaLkEwzP.js} +1 -1
- package/dist/assets/index-lps3yS0-.js +234 -0
- package/dist/assets/{index-CjL-ow9p.js → index-pr0coJZh.js} +4 -4
- package/dist/assets/{index-Qz33eZNl.js → index-q83gH7uv.js} +1 -1
- package/dist/assets/{index-D6_XZVwd.js → index-uI5ivd9H.js} +2 -2
- package/dist/assets/{index.es-BWhxKjPs.js → index.es-BbZKY7XB.js} +3 -3
- package/dist/assets/{index.esm-Cq4xs6YC.js → index.esm-Bx08zGob.js} +1 -1
- package/dist/assets/info-outline-rounded-Bfjx6SIO.js +57 -0
- package/dist/assets/{invitation-T-YCJW97.js → invitation-MLAwJ9Ra.js} +5 -5
- package/dist/assets/{invite-BXJMvn6v.js → invite-DkO9FeY_.js} +1 -1
- package/dist/assets/{issue-passport-u6thjalY.js → issue-passport-C7JZcRZR.js} +1 -1
- package/dist/assets/item-MF9V1-6K.js +1 -0
- package/dist/assets/ja-BO4aqMDb.js +1 -0
- package/dist/assets/ja-D8qblxbX.js +1 -0
- package/dist/assets/{jss-plugin-props-sort.esm-me2eGiW-.js → jss-plugin-props-sort.esm-rVwFJx4d.js} +4 -4
- package/dist/assets/ko-C8eR3MIF.js +1 -0
- package/dist/assets/ko-Cv-NiLYG.js +1 -0
- package/dist/assets/{launch-result-message-BuBZvaF1.js → launch-result-message-DEcCutu3.js} +1 -1
- package/dist/assets/{layout-B01MivhG.js → layout-DOFQutAQ.js} +2 -2
- package/dist/assets/{list-header-hMww0HHw.js → list-header-F6N0Lbga.js} +1 -1
- package/dist/assets/localization-BSGMGQL8.js +1 -0
- package/dist/assets/{log-Dq-G4alr.js → log-_MCoFO-Q.js} +1 -1
- package/dist/assets/{login-CbbOOndG.js → login-g24bmOOt.js} +1 -1
- package/dist/assets/login-oauth-callback-IIluZQpi.js +1 -0
- package/dist/assets/logo-uploader-j0OGjkoc.js +127 -0
- package/dist/assets/{lost-passport-CPE-Xjib.js → lost-passport-CFNDhKO4.js} +3 -3
- package/dist/assets/{lottie-cr_W9_8N.js → lottie-sLx_MIFH.js} +1 -1
- package/dist/assets/{notifications-D8Ok7C-7.js → notifications-BdAvASdZ.js} +2 -2
- package/dist/assets/overview-Buny86cT.js +12 -0
- package/dist/assets/{page-header-Bo5AtgJT.js → page-header-iStgNt-t.js} +1 -1
- package/dist/assets/{permission-Bfyc02YO.js → permission-DFHjiPOO.js} +1 -1
- package/dist/assets/{preferences-2QclW1UT.js → preferences-CBDwdPlD.js} +1 -1
- package/dist/assets/pt-DfarVqto.js +1 -0
- package/dist/assets/pt-Dly5Myel.js +1 -0
- package/dist/assets/publish-resource-B8njhGLx.js +1 -0
- package/dist/assets/{react-C2AQFto6.js → react-4Vr75H9n.js} +16 -16
- package/dist/assets/{redux-CPqXhx4a.js → redux-BwEqkH3a.js} +1 -1
- package/dist/assets/ru-C9Wh9IKf.js +1 -0
- package/dist/assets/ru-DeqfYyhe.js +1 -0
- package/dist/assets/{selector-DaQX9SF-.js → selector-haOpsVEc.js} +3 -3
- package/dist/assets/session-BxfJegkk.js +1 -0
- package/dist/assets/setup-DMBqOQvQ.js +19 -0
- package/dist/assets/{slicedToArray-BdhwfRNf.js → slicedToArray-x22-0sXq.js} +2 -2
- package/dist/assets/spaces-fv1YlSu4.js +1 -0
- package/dist/assets/start-CmsOWeku.js +186 -0
- package/dist/assets/{step-actions-BE48ZQjV.js → step-actions-AXZRiRyD.js} +1 -1
- package/dist/assets/{studio-D7cJXy4K.js → studio-DmUAxFbb.js} +1 -1
- package/dist/assets/{switch-control-Dac9eRfN.js → switch-control-Lx0DlzPA.js} +1 -1
- package/dist/assets/th-B6Z2fc62.js +1 -0
- package/dist/assets/th-BEfUwHXu.js +1 -0
- package/dist/assets/{toUpper-ZGCVjhv5.js → toUpper-BgobQRvN.js} +1 -1
- package/dist/assets/transfer-WMTLv9DH.js +16 -0
- package/dist/assets/uniqBy-BnjBhJxf.js +1 -0
- package/dist/assets/{unsubscribe-DMeZmH6F.js → unsubscribe-BFzCxIJM.js} +1 -1
- package/dist/assets/{use-blocklet-info-for-connect-did-spaces-Bl2nAtwR.js → use-blocklet-info-for-connect-did-spaces-CIjBkljS.js} +1 -1
- package/dist/assets/useAsync-ByTahkQO.js +1 -0
- package/dist/assets/{useFormControl-Y5cOFSZ7.js → useFormControl-CeAUerJZ.js} +1 -1
- package/dist/assets/{useLocalStorage-DxHCj-Ad.js → useLocalStorage-B_i310mR.js} +1 -1
- package/dist/assets/{useSetState-FRWYENJP.js → useSetState-BB4kdpGs.js} +1 -1
- package/dist/assets/useSlot-CsiuTStm.js +1 -0
- package/dist/assets/user-center-sGvXEgY6.js +1 -0
- package/dist/assets/user-sessions-BBUW9BFw.js +1 -0
- package/dist/assets/{util-BDlHlDbr.js → util-DeMILzW3.js} +1 -1
- package/dist/assets/vi-CVN1WwF4.js +1 -0
- package/dist/assets/vi-Di0ynKe6.js +1 -0
- package/dist/assets/wrap-locale-CeRDb2BZ.js +1 -0
- package/dist/assets/{zh-Rua3gJ94.js → zh-Bgfgr3pp.js} +2 -2
- package/dist/assets/zh-e04FR-Ps.js +1 -0
- package/dist/assets/zh-tw-DlepKNg6.js +1 -0
- package/dist/assets/zh-tw-kaMajsUI.js +1 -0
- package/dist/index.html +1 -1
- package/dist/service-worker.js +1 -1
- package/package.json +28 -27
- package/dist/assets/access-control-D7CTw-oE.js +0 -13
- package/dist/assets/add-resource-DuBvfDxK.js +0 -1
- package/dist/assets/api-BJaiCPrC.js +0 -1
- package/dist/assets/ar-CKMLzq5i.js +0 -1
- package/dist/assets/ar-CxvIl-Ji.js +0 -1
- package/dist/assets/confirm-Cuhp36k6.js +0 -7
- package/dist/assets/connect-to-D-dHQV5X.js +0 -54
- package/dist/assets/de-3qOdEa6P.js +0 -1
- package/dist/assets/de-C85TnClh.js +0 -1
- package/dist/assets/domain-BlD_Ha2y.js +0 -9
- package/dist/assets/domain-list-CMTnqXnl.js +0 -12
- package/dist/assets/es-7PLonVLT.js +0 -1
- package/dist/assets/es-BGR4yQT7.js +0 -1
- package/dist/assets/exchange-passport-RIs0yNdi.js +0 -1
- package/dist/assets/fr-1I2E8gH_.js +0 -1
- package/dist/assets/fr-SMLe8Exw.js +0 -1
- package/dist/assets/hi-O7fF0c9u.js +0 -1
- package/dist/assets/hi-RGxY7zJb.js +0 -1
- package/dist/assets/home-2DQtKMdu.js +0 -1
- package/dist/assets/id-BF9h-bev.js +0 -1
- package/dist/assets/id-Bpj9IFvi.js +0 -1
- package/dist/assets/iframe-R-ZcwaSh.js +0 -1
- package/dist/assets/index-A_crIcnY.js +0 -233
- package/dist/assets/index-CbXUSBRE.js +0 -1304
- package/dist/assets/index-D4Du2cj9.js +0 -262
- package/dist/assets/index-DmAOiutt.js +0 -13
- package/dist/assets/index-DmYwryUt.js +0 -54
- package/dist/assets/index-ly70OLaY.js +0 -11
- package/dist/assets/index-ohbTXyfa.js +0 -221
- package/dist/assets/item-rDWzC6g4.js +0 -1
- package/dist/assets/ja-BRl6JgyC.js +0 -1
- package/dist/assets/ja-CIvaU9cC.js +0 -1
- package/dist/assets/ko-BjJKFx_R.js +0 -1
- package/dist/assets/ko-DhkKLagb.js +0 -1
- package/dist/assets/localization-BQGzJXXC.js +0 -1
- package/dist/assets/logo-uploader-CXGWSagm.js +0 -127
- package/dist/assets/overview-PLuYcrpP.js +0 -12
- package/dist/assets/pt-CB-myo8d.js +0 -1
- package/dist/assets/pt-CkaW7MUR.js +0 -1
- package/dist/assets/publish-resource-DpBoFC3K.js +0 -1
- package/dist/assets/ru-1GZMliq9.js +0 -1
- package/dist/assets/ru-DdKOZe9i.js +0 -1
- package/dist/assets/session-Db6PVWmc.js +0 -1
- package/dist/assets/setup-CJZptj18.js +0 -19
- package/dist/assets/spaces-CfWsldoC.js +0 -1
- package/dist/assets/start-C5R4_q2v.js +0 -186
- package/dist/assets/th-Bc32gh20.js +0 -1
- package/dist/assets/th-DxaWeBuD.js +0 -1
- package/dist/assets/transfer-D9E2B7BQ.js +0 -16
- package/dist/assets/ua-parser-CSvfq8TR.js +0 -57
- package/dist/assets/uniqBy-C7HhWnED.js +0 -1
- package/dist/assets/useAsync-DS4AUfQv.js +0 -1
- package/dist/assets/useSlot-DcgmzF_L.js +0 -1
- package/dist/assets/user-center-BOJiTDs-.js +0 -1
- package/dist/assets/user-sessions-VuE82hKq.js +0 -1
- package/dist/assets/vi-CRasBMRh.js +0 -1
- package/dist/assets/vi-TDQcZYLL.js +0 -1
- package/dist/assets/wrap-locale-DAv8Zghn.js +0 -1
- package/dist/assets/zh-B75pu7gp.js +0 -1
- package/dist/assets/zh-tw-BYDo5dcg.js +0 -1
- package/dist/assets/zh-tw-CrqrnCP0.js +0 -1
- /package/api/libs/auth/adapters/{auth0 → auth0-legacy}/authentication-client.js +0 -0
- /package/api/libs/auth/adapters/{auth0 → auth0-legacy}/index.js +0 -0
- /package/api/libs/auth/adapters/{auth0 → auth0-legacy}/management-client.js +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const jwt = require('jsonwebtoken');
|
|
2
|
+
// https://appleid.apple.com/.well-known/openid-configuration
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {Object} AppleUserProfile
|
|
6
|
+
* @property {string} iss - issuer of oauth provider
|
|
7
|
+
* @property {string} aud
|
|
8
|
+
* @property {string} at_hash
|
|
9
|
+
* @property {string} iat
|
|
10
|
+
* @property {string} exp
|
|
11
|
+
* @property {string} sub - user's usb
|
|
12
|
+
* @property {string} email - user's email
|
|
13
|
+
* @property {boolean} email_verified - user's email is verified
|
|
14
|
+
* @property {boolean} is_private_email - user's email is verified
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
function Apple(options) {
|
|
18
|
+
return {
|
|
19
|
+
id: 'apple',
|
|
20
|
+
name: 'Apple',
|
|
21
|
+
type: 'oidc',
|
|
22
|
+
issuer: 'https://appleid.apple.com',
|
|
23
|
+
jwks_uri: 'https://appleid.apple.com/auth/keys',
|
|
24
|
+
token: 'https://appleid.apple.com/auth/token',
|
|
25
|
+
authorization: {
|
|
26
|
+
url: 'https://appleid.apple.com/auth/authorize',
|
|
27
|
+
params: {
|
|
28
|
+
scope: 'name email',
|
|
29
|
+
response_mode: 'form_post',
|
|
30
|
+
prompt: 'login',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
/**
|
|
34
|
+
* @param {AppleUserProfile} profile
|
|
35
|
+
* @returns {Object}
|
|
36
|
+
*/
|
|
37
|
+
profile(profile) {
|
|
38
|
+
return {
|
|
39
|
+
sub: `appleid|${profile.sub}`,
|
|
40
|
+
// HACK: apple 可能无法正确获得用户名,使用 email 做为兜底方案
|
|
41
|
+
name: profile.name || profile.email,
|
|
42
|
+
email: profile.email,
|
|
43
|
+
picture: null,
|
|
44
|
+
emailVerified: profile.email_verified,
|
|
45
|
+
extraData: {
|
|
46
|
+
isPrivateEmail: profile.is_private_email,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
getClientId() {
|
|
51
|
+
return options.serviceId;
|
|
52
|
+
},
|
|
53
|
+
getClientSecret() {
|
|
54
|
+
const headers = {
|
|
55
|
+
alg: 'ES256',
|
|
56
|
+
kid: options.keyId,
|
|
57
|
+
};
|
|
58
|
+
const timeNow = Math.floor(Date.now() / 1000);
|
|
59
|
+
const claims = {
|
|
60
|
+
iss: options.teamId,
|
|
61
|
+
aud: 'https://appleid.apple.com',
|
|
62
|
+
sub: options.serviceId,
|
|
63
|
+
iat: timeNow,
|
|
64
|
+
exp: timeNow + 86400,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const token = jwt.sign(claims, options.authKey, {
|
|
68
|
+
algorithm: 'ES256',
|
|
69
|
+
header: headers,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return token;
|
|
73
|
+
},
|
|
74
|
+
options,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
module.exports = Apple;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// https://auth0.openai.com/.well-known/openid-configuration
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {Object} Auth0UserProfile
|
|
5
|
+
* @property {string} sub - The subject of the user profile.
|
|
6
|
+
* @property {string} name - The name of the user.
|
|
7
|
+
* @property {string} picture - The picture URL of the user.
|
|
8
|
+
* @property {string} email - The email of the user.
|
|
9
|
+
* @property {boolean} email_verified - Indicates if the user's email is verified.
|
|
10
|
+
* @property {string} locale - The locale of the user.
|
|
11
|
+
* @property {string} nickname - The nickname of the user.
|
|
12
|
+
* @property {string} updated_at - The last time the user profile was updated.
|
|
13
|
+
* @property {string} iss - The issuer of the token.
|
|
14
|
+
* @property {string} aud - The audience of the token.
|
|
15
|
+
* @property {number} iat - The issued at time of the token.
|
|
16
|
+
* @property {number} exp - The expiration time of the token.
|
|
17
|
+
* @property {string} sid
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const { joinURL } = require('ufo');
|
|
21
|
+
|
|
22
|
+
function Auth0(options) {
|
|
23
|
+
const { issuer } = options;
|
|
24
|
+
return {
|
|
25
|
+
id: 'auth0',
|
|
26
|
+
name: 'Auth0',
|
|
27
|
+
type: 'oidc',
|
|
28
|
+
issuer,
|
|
29
|
+
jwks_uri: joinURL(issuer, '/.well-known/jwks.json'),
|
|
30
|
+
authorization: {
|
|
31
|
+
url: joinURL(issuer, '/authorize'),
|
|
32
|
+
params: {
|
|
33
|
+
prompt: 'login',
|
|
34
|
+
scope: 'openid profile email',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
token: joinURL(issuer, '/oauth/token'),
|
|
38
|
+
userinfo: {
|
|
39
|
+
url: joinURL(issuer, '/userinfo'),
|
|
40
|
+
},
|
|
41
|
+
/**
|
|
42
|
+
* @param {Auth0UserProfile} profile - The profile object to be modified.
|
|
43
|
+
* @return {Object} The modified profile object.
|
|
44
|
+
*/
|
|
45
|
+
profile(profile) {
|
|
46
|
+
return {
|
|
47
|
+
...profile,
|
|
48
|
+
name: profile.nickname || profile.name,
|
|
49
|
+
emailVerified: profile.email_verified,
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
options,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
module.exports = Auth0;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
function Facebook(options) {
|
|
2
|
+
return {
|
|
3
|
+
id: 'facebook',
|
|
4
|
+
name: 'Facebook',
|
|
5
|
+
type: 'oauth',
|
|
6
|
+
authorization: {
|
|
7
|
+
url: 'https://www.facebook.com/v15.0/dialog/oauth',
|
|
8
|
+
params: {
|
|
9
|
+
scope: 'email',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
token: 'https://graph.facebook.com/oauth/access_token',
|
|
13
|
+
userinfo: {
|
|
14
|
+
// https://developers.facebook.com/docs/graph-api/reference/user/#fields
|
|
15
|
+
url: 'https://graph.facebook.com/me?fields=id,name,email,picture',
|
|
16
|
+
request({ tokens, provider }) {
|
|
17
|
+
return fetch(provider.userinfo?.url, {
|
|
18
|
+
headers: { Authorization: `Bearer ${tokens.access_token}` },
|
|
19
|
+
}).then((res) => res.json());
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
profile(profile) {
|
|
23
|
+
return {
|
|
24
|
+
id: profile.id,
|
|
25
|
+
name: profile.name,
|
|
26
|
+
email: profile.email,
|
|
27
|
+
image: profile.picture.data.url,
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
options,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = Facebook;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const { default: axios } = require('axios');
|
|
2
|
+
const logger = require('../../logger')('blocklet-services:oauth');
|
|
3
|
+
|
|
4
|
+
function GitHub(options) {
|
|
5
|
+
const baseUrl = 'https://github.com';
|
|
6
|
+
const apiBaseUrl = 'https://api.github.com';
|
|
7
|
+
|
|
8
|
+
return {
|
|
9
|
+
id: 'github',
|
|
10
|
+
name: 'GitHub',
|
|
11
|
+
type: 'oauth',
|
|
12
|
+
authorization: {
|
|
13
|
+
url: `${baseUrl}/login/oauth/authorize`,
|
|
14
|
+
params: {
|
|
15
|
+
scope: 'read:user user:email',
|
|
16
|
+
// HACK: prompt: login 对 github 没效果,如果当前只登录了一个 github 账号,则会跳过登录页面直接成功,只能设置为 consent,让页面不直接登录
|
|
17
|
+
prompt: 'consent',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
token: `${baseUrl}/login/oauth/access_token`,
|
|
21
|
+
userinfo: {
|
|
22
|
+
async request({ tokens }) {
|
|
23
|
+
const url = `${apiBaseUrl}/user`;
|
|
24
|
+
const { data } = await axios.get(url, {
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: `token ${tokens.access_token}`,
|
|
27
|
+
'User-Agent': '@blocklet/auth',
|
|
28
|
+
Accept: 'application/json',
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
if (!data.email) {
|
|
33
|
+
// If the user does not have a public email, get another via the GitHub API
|
|
34
|
+
// See https://docs.github.com/en/rest/users/emails#list-public-email-addresses-for-the-authenticated-user
|
|
35
|
+
try {
|
|
36
|
+
const { data: emails } = await axios.get(`${apiBaseUrl}/user/emails`, {
|
|
37
|
+
headers: {
|
|
38
|
+
Authorization: `Bearer ${tokens.access_token}`,
|
|
39
|
+
'User-Agent': '@blocklet/auth',
|
|
40
|
+
Accept: 'application/json',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
data.email = (emails.find((e) => e.primary) ?? emails[0]).email;
|
|
44
|
+
} catch (err) {
|
|
45
|
+
logger.error('Failed to get github user email');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return data;
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
profile(profile) {
|
|
53
|
+
return {
|
|
54
|
+
sub: `github|${profile.id}`,
|
|
55
|
+
name: profile.name ?? profile.login,
|
|
56
|
+
email: profile.email,
|
|
57
|
+
picture: profile.avatar_url,
|
|
58
|
+
extraData: {
|
|
59
|
+
login: profile.login,
|
|
60
|
+
nodeId: profile.node_id,
|
|
61
|
+
company: profile.company,
|
|
62
|
+
blog: profile.blog,
|
|
63
|
+
location: profile.location,
|
|
64
|
+
hireable: profile.hireable,
|
|
65
|
+
bio: profile.bio,
|
|
66
|
+
twitterUsername: profile.twitter_username,
|
|
67
|
+
twoFactorAuthentication: profile.two_factor_authentication,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
options,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
module.exports = GitHub;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// https://accounts.google.com/.well-known/openid-configuration
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {Object} GoogleUserProfile
|
|
5
|
+
* @property {string} iss - issuer of oauth provider
|
|
6
|
+
* @property {string} azp
|
|
7
|
+
* @property {string} aud
|
|
8
|
+
* @property {string} at_hash
|
|
9
|
+
* @property {string} iat
|
|
10
|
+
* @property {string} exp
|
|
11
|
+
* @property {string} sub - user's usb
|
|
12
|
+
* @property {string} email - user's email
|
|
13
|
+
* @property {string} name - user's name
|
|
14
|
+
* @property {string} picture - user's avatar url
|
|
15
|
+
* @property {string} email_verified - user's email is verifyed
|
|
16
|
+
* @property {string} given_name
|
|
17
|
+
* @property {string} family_name
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @typedef {Object} UserProfile
|
|
22
|
+
* @property {string} sub - The subject of the user profile.
|
|
23
|
+
* @property {string} name - The name of the user.
|
|
24
|
+
* @property {string} picture - The picture URL of the user.
|
|
25
|
+
* @property {string} email - The email of the user.
|
|
26
|
+
* @property {boolean} [email_verified] - Indicates if the user's email is verified.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
function Google(options) {
|
|
30
|
+
return {
|
|
31
|
+
id: 'google',
|
|
32
|
+
name: 'Google',
|
|
33
|
+
type: 'oidc',
|
|
34
|
+
issuer: 'https://accounts.google.com',
|
|
35
|
+
jwks_uri: 'https://www.googleapis.com/oauth2/v3/certs',
|
|
36
|
+
authorization: {
|
|
37
|
+
url: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
38
|
+
params: {
|
|
39
|
+
scope: 'openid profile email',
|
|
40
|
+
prompt: 'login',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
token: 'https://oauth2.googleapis.com/token',
|
|
44
|
+
userinfo: 'https://openidconnect.googleapis.com/v1/userinfo',
|
|
45
|
+
options,
|
|
46
|
+
/**
|
|
47
|
+
* @param {GoogleUserProfile} profile
|
|
48
|
+
* @returns {UserProfile}
|
|
49
|
+
*/
|
|
50
|
+
profile(profile) {
|
|
51
|
+
return {
|
|
52
|
+
sub: `google-oauth2|${profile.sub}`,
|
|
53
|
+
name: profile.name,
|
|
54
|
+
picture: profile.picture,
|
|
55
|
+
email: profile.email,
|
|
56
|
+
emailVerified: profile.email_verified,
|
|
57
|
+
extraData: {
|
|
58
|
+
givenName: profile.given_name,
|
|
59
|
+
familyName: profile.family_name,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
module.exports = Google;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
function Twitter(options) {
|
|
2
|
+
return {
|
|
3
|
+
id: 'twitter',
|
|
4
|
+
name: 'Twitter',
|
|
5
|
+
type: 'oauth',
|
|
6
|
+
checks: ['pkce', 'state'],
|
|
7
|
+
authorization: 'https://twitter.com/i/oauth2/authorize?scope=users.read tweet.read offline.access',
|
|
8
|
+
token: 'https://api.twitter.com/2/oauth2/token',
|
|
9
|
+
userinfo: 'https://api.twitter.com/2/users/me?user.fields=profile_image_url',
|
|
10
|
+
profile({ data }) {
|
|
11
|
+
return {
|
|
12
|
+
id: data.id,
|
|
13
|
+
name: data.name,
|
|
14
|
+
email: data.email ?? null,
|
|
15
|
+
image: data.profile_image_url,
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
options,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = Twitter;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
const { default: axios } = require('axios');
|
|
2
|
+
const logger = require('../logger')('blocklet-services:oauth');
|
|
3
|
+
const { verifyIdToken } = require('../../services/oauth');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {Object} Provider
|
|
7
|
+
* @property {string} id - provider id
|
|
8
|
+
* @property {string} name - provider 名称
|
|
9
|
+
* @property {string} authorizeUrl - 授权的 url
|
|
10
|
+
* @property {string} [scope] - 获取的授权范围,以空格分隔
|
|
11
|
+
* @property {string} clientId - client id
|
|
12
|
+
* @property {string} clientSecret - client secret
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {Object} AuthorizationToken
|
|
17
|
+
* @property {string} access_token
|
|
18
|
+
* @property {string} [id_token] - 包含了用户信息,通过 jwt 解码可获取
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @typedef {Object} UserProfile
|
|
23
|
+
* @property {string} sub - The subject of the user profile.
|
|
24
|
+
* @property {string} name - The name of the user.
|
|
25
|
+
* @property {string} picture - The picture URL of the user.
|
|
26
|
+
* @property {string} email - The email of the user.
|
|
27
|
+
* @property {boolean} [email_verified] - Indicates if the user's email is verified.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 根据 url 和 params 参数生成最终的 url
|
|
32
|
+
* @param {string | {url: string, params: object}} urlLike - The URL string or an object containing the URL and parameters.
|
|
33
|
+
* @param {object} params - The parameters to append to the URL.
|
|
34
|
+
* @return {string} The complete URL string with parameters appended.
|
|
35
|
+
*/
|
|
36
|
+
function getUrl(urlLike, params) {
|
|
37
|
+
const uri = typeof urlLike === 'string' ? urlLike : urlLike.url;
|
|
38
|
+
const appendParams =
|
|
39
|
+
typeof urlLike === 'string'
|
|
40
|
+
? { ...params }
|
|
41
|
+
: {
|
|
42
|
+
...urlLike.params,
|
|
43
|
+
...params,
|
|
44
|
+
};
|
|
45
|
+
const url = new URL(uri);
|
|
46
|
+
for (const k of Object.keys(appendParams)) {
|
|
47
|
+
const v = appendParams[k];
|
|
48
|
+
if (v !== undefined) {
|
|
49
|
+
url.searchParams.set(k, v);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return url.toString();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
class OAuthClient {
|
|
56
|
+
/**
|
|
57
|
+
* Constructor for initializing providers.
|
|
58
|
+
* @param {Object} options
|
|
59
|
+
* @param {Provider} options.provider
|
|
60
|
+
*/
|
|
61
|
+
constructor({ provider }) {
|
|
62
|
+
this.provider = provider;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 获取 oauth 授权 code 用的地址
|
|
67
|
+
*
|
|
68
|
+
* @return {string}
|
|
69
|
+
*/
|
|
70
|
+
getAuthorizationUrl() {
|
|
71
|
+
if (this.provider.authorization?.request) {
|
|
72
|
+
return this.provider.authorization.request();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return getUrl(this.provider.authorization, {
|
|
76
|
+
response_type: 'code',
|
|
77
|
+
client_id: this.provider?.getClientId?.() || this.provider.options.clientId,
|
|
78
|
+
redirect_uri: this.provider.options.callbackUrl,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* 通过授权码换取 token
|
|
84
|
+
*
|
|
85
|
+
* @param {Object} code - oauth 步骤的授权码
|
|
86
|
+
* @return {Promise<AuthorizationToken>}
|
|
87
|
+
*/
|
|
88
|
+
async getToken({ code }) {
|
|
89
|
+
try {
|
|
90
|
+
if (this.provider.token?.request) {
|
|
91
|
+
return this.provider.token.request();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const params = {
|
|
95
|
+
grant_type: 'authorization_code',
|
|
96
|
+
client_id: this.provider?.getClientId?.() || this.provider.options.clientId,
|
|
97
|
+
client_secret: this.provider?.getClientSecret?.() || this.provider.options.clientSecret,
|
|
98
|
+
code,
|
|
99
|
+
redirect_uri: this.provider.options.callbackUrl,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// 标准的 oauth code-flow 协议要求是使用 application/x-www-form-urlencoded 来携带数据,所以此处使用 URLSearchParams 来传递数据
|
|
103
|
+
const { data } = await axios.post(this.provider.token, new URLSearchParams(params), {
|
|
104
|
+
headers: { Accept: 'application/json' },
|
|
105
|
+
});
|
|
106
|
+
return data;
|
|
107
|
+
} catch (err) {
|
|
108
|
+
logger.error('Failed get token', { error: err });
|
|
109
|
+
throw new Error(`Failed get token: ${err.message}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 通过授权 token 获取用户信息
|
|
115
|
+
* @param {AuthorizationToken} tokens
|
|
116
|
+
* @returns {Object} user info, 具体信息根据不同平台有不同的结构
|
|
117
|
+
*/
|
|
118
|
+
async getUserInfo(tokens) {
|
|
119
|
+
try {
|
|
120
|
+
if (tokens.id_token) {
|
|
121
|
+
const cliams = await verifyIdToken({
|
|
122
|
+
clientId: this.provider?.getClientId?.() || this.provider.options.clientId,
|
|
123
|
+
idToken: tokens.id_token,
|
|
124
|
+
iss: this.provider.issuer,
|
|
125
|
+
jwksUri: this.provider.jwks_uri,
|
|
126
|
+
nonce: tokens.nonce,
|
|
127
|
+
});
|
|
128
|
+
return cliams;
|
|
129
|
+
}
|
|
130
|
+
if (this.provider.userinfo?.request) {
|
|
131
|
+
return this.provider.userinfo.request({ tokens });
|
|
132
|
+
}
|
|
133
|
+
const url = new URL(this.provider.userinfo?.url || this.provider.userinfo);
|
|
134
|
+
|
|
135
|
+
const { data } = await axios.get(url.toString(), {
|
|
136
|
+
headers: {
|
|
137
|
+
Authorization: `Bearer ${tokens.access_token}`,
|
|
138
|
+
'User-Agent': '@blocklet/auth',
|
|
139
|
+
Accept: 'application/json',
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
return data;
|
|
143
|
+
} catch (err) {
|
|
144
|
+
logger.error('Failed get user info', { error: err });
|
|
145
|
+
throw new Error(`Failed get user info: ${err.message}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 通过授权 token 获取标准格式化后的用户信息
|
|
151
|
+
* @param {AuthorizationToken} tokens
|
|
152
|
+
* @returns {UserProfile} 返回标准格式化后的用户信息
|
|
153
|
+
*/
|
|
154
|
+
async getProfile(tokens) {
|
|
155
|
+
try {
|
|
156
|
+
const userInfo = await this.getUserInfo(tokens);
|
|
157
|
+
if (this.provider.profile) {
|
|
158
|
+
return this.provider.profile(userInfo);
|
|
159
|
+
}
|
|
160
|
+
return userInfo;
|
|
161
|
+
} catch (err) {
|
|
162
|
+
logger.error('Failed get user profile', { error: err });
|
|
163
|
+
throw new Error(`Failed get user profile: ${err.message}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
module.exports = {
|
|
169
|
+
OAuthClient,
|
|
170
|
+
};
|
package/api/routes/federated.js
CHANGED
|
@@ -95,6 +95,27 @@ async function syncConnectAccount(user, { node, teamDid, dataDir, blocklet }) {
|
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
async function syncDisconnectAccount(user, { node, teamDid, blocklet }) {
|
|
99
|
+
const { disconnectedAccount, sourceAppPid, did, pk } = user;
|
|
100
|
+
const masterSite = getFederatedMaster(blocklet);
|
|
101
|
+
if (masterSite.appPid !== teamDid) {
|
|
102
|
+
await getUserWithinFederated(
|
|
103
|
+
{
|
|
104
|
+
sourceAppPid,
|
|
105
|
+
teamDid,
|
|
106
|
+
userDid: did,
|
|
107
|
+
userPk: pk,
|
|
108
|
+
},
|
|
109
|
+
{ blocklet, node }
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
await node.disconnectUserAccount({
|
|
114
|
+
teamDid,
|
|
115
|
+
connectedAccount: disconnectedAccount,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
98
119
|
/**
|
|
99
120
|
* member 站点向 master 站点请求拉取一个用户信息
|
|
100
121
|
*/
|
|
@@ -127,7 +148,7 @@ async function pullUserAccount(user, { node, teamDid, blocklet }) {
|
|
|
127
148
|
syncUser.avatar = getUserAvatarUrl(currentUser.avatar, blocklet);
|
|
128
149
|
syncUser.email = syncUser.email || '';
|
|
129
150
|
syncUser.connectedAccounts = currentUser.connectedAccounts.map((x) => {
|
|
130
|
-
const connectAccount = pick(x, ['did', 'pk', 'provider', 'id']);
|
|
151
|
+
const connectAccount = pick(x, ['did', 'pk', 'provider', 'id', 'userInfo']);
|
|
131
152
|
if (!connectAccount.id) {
|
|
132
153
|
delete connectAccount.id;
|
|
133
154
|
}
|
|
@@ -140,6 +161,7 @@ async function pullUserAccount(user, { node, teamDid, blocklet }) {
|
|
|
140
161
|
const syncFnMaps = {
|
|
141
162
|
switchProfile: syncSwitchProfile,
|
|
142
163
|
connectAccount: syncConnectAccount,
|
|
164
|
+
disconnectAccount: syncDisconnectAccount,
|
|
143
165
|
pullAccount: pullUserAccount,
|
|
144
166
|
};
|
|
145
167
|
|