@strapi/plugin-users-permissions 0.0.0-experimental.6340da17068c3bed7fb006e7bcc554c71129e282 → 0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc
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/.eslintrc.cjs +2 -0
- package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +3 -1
- package/admin/src/pages/Roles/pages/EditPage.jsx +1 -1
- package/admin/src/pages/Roles/pages/ListPage/index.jsx +1 -1
- package/admin/src/translations/en.json +1 -0
- package/admin/src/translations/es.json +1 -1
- package/admin/src/translations/ko.json +2 -1
- package/admin/src/translations/sv.json +1 -1
- package/admin/src/translations/uk.json +1 -1
- package/dist/admin/pages/EmailTemplates/components/EmailForm.js +2 -1
- package/dist/admin/pages/EmailTemplates/components/EmailForm.js.map +1 -1
- package/dist/admin/pages/EmailTemplates/components/EmailForm.mjs +2 -1
- package/dist/admin/pages/EmailTemplates/components/EmailForm.mjs.map +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.js +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.js.map +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.mjs +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.mjs.map +1 -1
- package/dist/admin/pages/Roles/pages/ListPage/index.js +1 -1
- package/dist/admin/pages/Roles/pages/ListPage/index.js.map +1 -1
- package/dist/admin/pages/Roles/pages/ListPage/index.mjs +1 -1
- package/dist/admin/pages/Roles/pages/ListPage/index.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +1 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +1 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -1
- package/dist/admin/translations/es.json.mjs +1 -1
- package/dist/admin/translations/ko.json.js +2 -1
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +2 -1
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/translations/sv.json.js +1 -1
- package/dist/admin/translations/sv.json.mjs +1 -1
- package/dist/admin/translations/uk.json.js +1 -1
- package/dist/admin/translations/uk.json.mjs +1 -1
- package/dist/server/_virtual/_node_crypto.js +10 -0
- package/dist/server/_virtual/_node_crypto.js.map +1 -0
- package/dist/server/_virtual/_node_crypto.mjs +7 -0
- package/dist/server/_virtual/_node_crypto.mjs.map +1 -0
- package/dist/server/_virtual/_node_url.js +10 -0
- package/dist/server/_virtual/_node_url.js.map +1 -0
- package/dist/server/_virtual/_node_url.mjs +7 -0
- package/dist/server/_virtual/_node_url.mjs.map +1 -0
- package/dist/server/bootstrap/index.js.map +1 -1
- package/dist/server/bootstrap/index.mjs.map +1 -1
- package/dist/server/bootstrap/users-permissions-actions.js.map +1 -1
- package/dist/server/bootstrap/users-permissions-actions.mjs.map +1 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/content-types/index.js.map +1 -1
- package/dist/server/content-types/index.mjs.map +1 -1
- package/dist/server/content-types/permission/index.js.map +1 -1
- package/dist/server/content-types/permission/index.mjs.map +1 -1
- package/dist/server/content-types/role/index.js.map +1 -1
- package/dist/server/content-types/role/index.mjs.map +1 -1
- package/dist/server/content-types/user/index.js.map +1 -1
- package/dist/server/content-types/user/index.mjs.map +1 -1
- package/dist/server/content-types/user/schema-config.js.map +1 -1
- package/dist/server/content-types/user/schema-config.mjs.map +1 -1
- package/dist/server/controllers/auth.js +38 -30
- package/dist/server/controllers/auth.js.map +1 -1
- package/dist/server/controllers/auth.mjs +38 -28
- package/dist/server/controllers/auth.mjs.map +1 -1
- package/dist/server/controllers/content-manager-user.js.map +1 -1
- package/dist/server/controllers/content-manager-user.mjs.map +1 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/permissions.js.map +1 -1
- package/dist/server/controllers/permissions.mjs.map +1 -1
- package/dist/server/controllers/role.js.map +1 -1
- package/dist/server/controllers/role.mjs.map +1 -1
- package/dist/server/controllers/settings.js.map +1 -1
- package/dist/server/controllers/settings.mjs.map +1 -1
- package/dist/server/controllers/user.js.map +1 -1
- package/dist/server/controllers/user.mjs.map +1 -1
- package/dist/server/controllers/validation/auth.js +6 -6
- package/dist/server/controllers/validation/auth.js.map +1 -1
- package/dist/server/controllers/validation/auth.mjs +6 -6
- package/dist/server/controllers/validation/auth.mjs.map +1 -1
- package/dist/server/controllers/validation/email-template.js +1 -4
- package/dist/server/controllers/validation/email-template.js.map +1 -1
- package/dist/server/controllers/validation/email-template.mjs +1 -3
- package/dist/server/controllers/validation/email-template.mjs.map +1 -1
- package/dist/server/controllers/validation/user.js.map +1 -1
- package/dist/server/controllers/validation/user.mjs.map +1 -1
- package/dist/server/graphql/index.js.map +1 -1
- package/dist/server/graphql/index.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/change-password.js +7 -4
- package/dist/server/graphql/mutations/auth/change-password.js.map +1 -1
- package/dist/server/graphql/mutations/auth/change-password.mjs +7 -4
- package/dist/server/graphql/mutations/auth/change-password.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/email-confirmation.js +1 -1
- package/dist/server/graphql/mutations/auth/email-confirmation.js.map +1 -1
- package/dist/server/graphql/mutations/auth/email-confirmation.mjs +1 -1
- package/dist/server/graphql/mutations/auth/email-confirmation.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/forgot-password.js +7 -4
- package/dist/server/graphql/mutations/auth/forgot-password.js.map +1 -1
- package/dist/server/graphql/mutations/auth/forgot-password.mjs +7 -4
- package/dist/server/graphql/mutations/auth/forgot-password.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/login.js +10 -7
- package/dist/server/graphql/mutations/auth/login.js.map +1 -1
- package/dist/server/graphql/mutations/auth/login.mjs +10 -7
- package/dist/server/graphql/mutations/auth/login.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/rate-limit.js +63 -0
- package/dist/server/graphql/mutations/auth/rate-limit.js.map +1 -0
- package/dist/server/graphql/mutations/auth/rate-limit.mjs +61 -0
- package/dist/server/graphql/mutations/auth/rate-limit.mjs.map +1 -0
- package/dist/server/graphql/mutations/auth/register.js +7 -4
- package/dist/server/graphql/mutations/auth/register.js.map +1 -1
- package/dist/server/graphql/mutations/auth/register.mjs +7 -4
- package/dist/server/graphql/mutations/auth/register.mjs.map +1 -1
- package/dist/server/graphql/mutations/auth/reset-password.js +7 -4
- package/dist/server/graphql/mutations/auth/reset-password.js.map +1 -1
- package/dist/server/graphql/mutations/auth/reset-password.mjs +7 -4
- package/dist/server/graphql/mutations/auth/reset-password.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/role/create-role.js +1 -1
- package/dist/server/graphql/mutations/crud/role/create-role.js.map +1 -1
- package/dist/server/graphql/mutations/crud/role/create-role.mjs +1 -1
- package/dist/server/graphql/mutations/crud/role/create-role.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/role/delete-role.js.map +1 -1
- package/dist/server/graphql/mutations/crud/role/delete-role.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/role/update-role.js.map +1 -1
- package/dist/server/graphql/mutations/crud/role/update-role.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.js +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.js.map +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.mjs +1 -1
- package/dist/server/graphql/mutations/crud/user/create-user.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/user/delete-user.js.map +1 -1
- package/dist/server/graphql/mutations/crud/user/delete-user.mjs.map +1 -1
- package/dist/server/graphql/mutations/crud/user/update-user.js +1 -1
- package/dist/server/graphql/mutations/crud/user/update-user.js.map +1 -1
- package/dist/server/graphql/mutations/crud/user/update-user.mjs +1 -1
- package/dist/server/graphql/mutations/crud/user/update-user.mjs.map +1 -1
- package/dist/server/graphql/mutations/index.js.map +1 -1
- package/dist/server/graphql/mutations/index.mjs.map +1 -1
- package/dist/server/graphql/queries/index.js.map +1 -1
- package/dist/server/graphql/queries/index.mjs.map +1 -1
- package/dist/server/graphql/queries/me.js.map +1 -1
- package/dist/server/graphql/queries/me.mjs.map +1 -1
- package/dist/server/graphql/resolvers-configs.js.map +1 -1
- package/dist/server/graphql/resolvers-configs.mjs.map +1 -1
- package/dist/server/graphql/types/create-role-payload.js.map +1 -1
- package/dist/server/graphql/types/create-role-payload.mjs.map +1 -1
- package/dist/server/graphql/types/delete-role-payload.js.map +1 -1
- package/dist/server/graphql/types/delete-role-payload.mjs.map +1 -1
- package/dist/server/graphql/types/index.js.map +1 -1
- package/dist/server/graphql/types/index.mjs.map +1 -1
- package/dist/server/graphql/types/login-input.js.map +1 -1
- package/dist/server/graphql/types/login-input.mjs.map +1 -1
- package/dist/server/graphql/types/login-payload.js.map +1 -1
- package/dist/server/graphql/types/login-payload.mjs.map +1 -1
- package/dist/server/graphql/types/me-role.js.map +1 -1
- package/dist/server/graphql/types/me-role.mjs.map +1 -1
- package/dist/server/graphql/types/me.js.map +1 -1
- package/dist/server/graphql/types/me.mjs.map +1 -1
- package/dist/server/graphql/types/password-payload.js.map +1 -1
- package/dist/server/graphql/types/password-payload.mjs.map +1 -1
- package/dist/server/graphql/types/register-input.js.map +1 -1
- package/dist/server/graphql/types/register-input.mjs.map +1 -1
- package/dist/server/graphql/types/update-role-payload.js.map +1 -1
- package/dist/server/graphql/types/update-role-payload.mjs.map +1 -1
- package/dist/server/graphql/types/user-input.js.map +1 -1
- package/dist/server/graphql/types/user-input.mjs.map +1 -1
- package/dist/server/graphql/utils.js +4 -4
- package/dist/server/graphql/utils.js.map +1 -1
- package/dist/server/graphql/utils.mjs +4 -4
- package/dist/server/graphql/utils.mjs.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +3 -3
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/index2.js +8 -8
- package/dist/server/index2.js.map +1 -1
- package/dist/server/index2.mjs +8 -8
- package/dist/server/index2.mjs.map +1 -1
- package/dist/server/middlewares/index.js.map +1 -1
- package/dist/server/middlewares/index.mjs.map +1 -1
- package/dist/server/middlewares/rateLimit.js +5 -5
- package/dist/server/middlewares/rateLimit.js.map +1 -1
- package/dist/server/middlewares/rateLimit.mjs +5 -5
- package/dist/server/middlewares/rateLimit.mjs.map +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/admin/index.js.map +1 -1
- package/dist/server/routes/admin/index.mjs.map +1 -1
- package/dist/server/routes/admin/permissions.js.map +1 -1
- package/dist/server/routes/admin/permissions.mjs.map +1 -1
- package/dist/server/routes/admin/role.js.map +1 -1
- package/dist/server/routes/admin/role.mjs.map +1 -1
- package/dist/server/routes/admin/settings.js.map +1 -1
- package/dist/server/routes/admin/settings.mjs.map +1 -1
- package/dist/server/routes/content-api/auth.js.map +1 -1
- package/dist/server/routes/content-api/auth.mjs.map +1 -1
- package/dist/server/routes/content-api/index.js.map +1 -1
- package/dist/server/routes/content-api/index.mjs.map +1 -1
- package/dist/server/routes/content-api/permissions.js.map +1 -1
- package/dist/server/routes/content-api/permissions.mjs.map +1 -1
- package/dist/server/routes/content-api/role.js.map +1 -1
- package/dist/server/routes/content-api/role.mjs.map +1 -1
- package/dist/server/routes/content-api/user.js.map +1 -1
- package/dist/server/routes/content-api/user.mjs.map +1 -1
- package/dist/server/routes/content-api/validation.js.map +1 -1
- package/dist/server/routes/content-api/validation.mjs.map +1 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/services/constants.js.map +1 -1
- package/dist/server/services/constants.mjs.map +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/jwt.js.map +1 -1
- package/dist/server/services/jwt.mjs.map +1 -1
- package/dist/server/services/permission.js.map +1 -1
- package/dist/server/services/permission.mjs.map +1 -1
- package/dist/server/services/providers-registry.js +188 -248
- package/dist/server/services/providers-registry.js.map +1 -1
- package/dist/server/services/providers-registry.mjs +188 -245
- package/dist/server/services/providers-registry.mjs.map +1 -1
- package/dist/server/services/providers.js +15 -11
- package/dist/server/services/providers.js.map +1 -1
- package/dist/server/services/providers.mjs +14 -10
- package/dist/server/services/providers.mjs.map +1 -1
- package/dist/server/services/role.js +2 -2
- package/dist/server/services/role.js.map +1 -1
- package/dist/server/services/role.mjs +2 -2
- package/dist/server/services/role.mjs.map +1 -1
- package/dist/server/services/user.js +14 -14
- package/dist/server/services/user.js.map +1 -1
- package/dist/server/services/user.mjs +13 -13
- package/dist/server/services/user.mjs.map +1 -1
- package/dist/server/services/users-permissions.js +17 -20
- package/dist/server/services/users-permissions.js.map +1 -1
- package/dist/server/services/users-permissions.mjs +16 -18
- package/dist/server/services/users-permissions.mjs.map +1 -1
- package/dist/server/strategies/users-permissions.js +9 -8
- package/dist/server/strategies/users-permissions.js.map +1 -1
- package/dist/server/strategies/users-permissions.mjs +9 -8
- package/dist/server/strategies/users-permissions.mjs.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/server/utils/oauth-connect/index.js +241 -0
- package/dist/server/utils/oauth-connect/index.js.map +1 -0
- package/dist/server/utils/oauth-connect/index.mjs +235 -0
- package/dist/server/utils/oauth-connect/index.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/oauth1.js +138 -0
- package/dist/server/utils/oauth-connect/oauth1.js.map +1 -0
- package/dist/server/utils/oauth-connect/oauth1.mjs +136 -0
- package/dist/server/utils/oauth-connect/oauth1.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/oauth2.js +117 -0
- package/dist/server/utils/oauth-connect/oauth2.js.map +1 -0
- package/dist/server/utils/oauth-connect/oauth2.mjs +115 -0
- package/dist/server/utils/oauth-connect/oauth2.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/providers.js +109 -0
- package/dist/server/utils/oauth-connect/providers.js.map +1 -0
- package/dist/server/utils/oauth-connect/providers.mjs +107 -0
- package/dist/server/utils/oauth-connect/providers.mjs.map +1 -0
- package/dist/server/utils/provider-http.js +52 -0
- package/dist/server/utils/provider-http.js.map +1 -0
- package/dist/server/utils/provider-http.mjs +50 -0
- package/dist/server/utils/provider-http.mjs.map +1 -0
- package/dist/server/utils/refresh-cookie-options.js.map +1 -1
- package/dist/server/utils/refresh-cookie-options.mjs.map +1 -1
- package/dist/server/utils/sanitize/index.js.map +1 -1
- package/dist/server/utils/sanitize/index.mjs.map +1 -1
- package/dist/server/utils/sanitize/sanitizers.js +1 -1
- package/dist/server/utils/sanitize/sanitizers.js.map +1 -1
- package/dist/server/utils/sanitize/sanitizers.mjs +1 -1
- package/dist/server/utils/sanitize/sanitizers.mjs.map +1 -1
- package/dist/server/utils/sanitize/visitors/index.js.map +1 -1
- package/dist/server/utils/sanitize/visitors/index.mjs.map +1 -1
- package/dist/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js.map +1 -1
- package/dist/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.mjs.map +1 -1
- package/dist/server/utils/trim-grant-session-response.js +67 -0
- package/dist/server/utils/trim-grant-session-response.js.map +1 -0
- package/dist/server/utils/trim-grant-session-response.mjs +65 -0
- package/dist/server/utils/trim-grant-session-response.mjs.map +1 -0
- package/dist/server/utils/verify-jwt-with-jwks.js +60 -0
- package/dist/server/utils/verify-jwt-with-jwks.js.map +1 -0
- package/dist/server/utils/verify-jwt-with-jwks.mjs +54 -0
- package/dist/server/utils/verify-jwt-with-jwks.mjs.map +1 -0
- package/jsconfig.json +7 -0
- package/package.json +28 -18
- package/rollup.config.mjs +2 -2
- package/server/{controllers → src/controllers}/auth.js +36 -29
- package/server/{controllers → src/controllers}/validation/auth.js +6 -6
- package/server/{controllers → src/controllers}/validation/email-template.js +1 -2
- package/server/{graphql → src/graphql}/mutations/auth/change-password.js +6 -6
- package/server/{graphql → src/graphql}/mutations/auth/email-confirmation.js +1 -1
- package/server/{graphql → src/graphql}/mutations/auth/forgot-password.js +6 -6
- package/server/{graphql → src/graphql}/mutations/auth/login.js +11 -7
- package/server/src/graphql/mutations/auth/rate-limit.js +62 -0
- package/server/{graphql → src/graphql}/mutations/auth/register.js +6 -6
- package/server/{graphql → src/graphql}/mutations/auth/reset-password.js +6 -6
- package/server/{graphql → src/graphql}/mutations/crud/role/create-role.js +1 -1
- package/server/{graphql → src/graphql}/mutations/crud/user/create-user.js +1 -1
- package/server/{graphql → src/graphql}/mutations/crud/user/update-user.js +1 -1
- package/server/{graphql → src/graphql}/utils.js +3 -3
- package/server/{middlewares → src/middlewares}/rateLimit.js +4 -4
- package/server/src/services/providers-registry.js +487 -0
- package/server/{services → src/services}/providers.js +9 -7
- package/server/{services → src/services}/role.js +2 -2
- package/server/{services → src/services}/user.js +16 -6
- package/server/{services → src/services}/users-permissions.js +14 -16
- package/server/{strategies → src/strategies}/users-permissions.js +14 -10
- package/server/src/utils/oauth-connect/index.js +262 -0
- package/server/src/utils/oauth-connect/oauth1.js +169 -0
- package/server/src/utils/oauth-connect/oauth2.js +123 -0
- package/server/src/utils/oauth-connect/providers.js +100 -0
- package/server/src/utils/provider-http.js +49 -0
- package/server/{utils → src/utils}/sanitize/sanitizers.js +1 -1
- package/server/src/utils/trim-grant-session-response.js +70 -0
- package/server/src/utils/verify-jwt-with-jwks.js +43 -0
- package/types/strapi-server.d.ts +65 -0
- package/server/services/providers-registry.js +0 -567
- package/server/utils/index.d.ts +0 -23
- /package/server/{bootstrap → src/bootstrap}/index.js +0 -0
- /package/server/{bootstrap → src/bootstrap}/users-permissions-actions.js +0 -0
- /package/server/{config.js → src/config.js} +0 -0
- /package/server/{content-types → src/content-types}/index.js +0 -0
- /package/server/{content-types → src/content-types}/permission/index.js +0 -0
- /package/server/{content-types → src/content-types}/role/index.js +0 -0
- /package/server/{content-types → src/content-types}/user/index.js +0 -0
- /package/server/{content-types → src/content-types}/user/schema-config.js +0 -0
- /package/server/{controllers → src/controllers}/content-manager-user.js +0 -0
- /package/server/{controllers → src/controllers}/index.js +0 -0
- /package/server/{controllers → src/controllers}/permissions.js +0 -0
- /package/server/{controllers → src/controllers}/role.js +0 -0
- /package/server/{controllers → src/controllers}/settings.js +0 -0
- /package/server/{controllers → src/controllers}/user.js +0 -0
- /package/server/{controllers → src/controllers}/validation/user.js +0 -0
- /package/server/{graphql → src/graphql}/index.js +0 -0
- /package/server/{graphql → src/graphql}/mutations/crud/role/delete-role.js +0 -0
- /package/server/{graphql → src/graphql}/mutations/crud/role/update-role.js +0 -0
- /package/server/{graphql → src/graphql}/mutations/crud/user/delete-user.js +0 -0
- /package/server/{graphql → src/graphql}/mutations/index.js +0 -0
- /package/server/{graphql → src/graphql}/queries/index.js +0 -0
- /package/server/{graphql → src/graphql}/queries/me.js +0 -0
- /package/server/{graphql → src/graphql}/resolvers-configs.js +0 -0
- /package/server/{graphql → src/graphql}/types/create-role-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/delete-role-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/index.js +0 -0
- /package/server/{graphql → src/graphql}/types/login-input.js +0 -0
- /package/server/{graphql → src/graphql}/types/login-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/me-role.js +0 -0
- /package/server/{graphql → src/graphql}/types/me.js +0 -0
- /package/server/{graphql → src/graphql}/types/password-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/register-input.js +0 -0
- /package/server/{graphql → src/graphql}/types/update-role-payload.js +0 -0
- /package/server/{graphql → src/graphql}/types/user-input.js +0 -0
- /package/server/{index.js → src/index.js} +0 -0
- /package/server/{middlewares → src/middlewares}/index.js +0 -0
- /package/server/{register.js → src/register.js} +0 -0
- /package/server/{routes → src/routes}/admin/index.js +0 -0
- /package/server/{routes → src/routes}/admin/permissions.js +0 -0
- /package/server/{routes → src/routes}/admin/role.js +0 -0
- /package/server/{routes → src/routes}/admin/settings.js +0 -0
- /package/server/{routes → src/routes}/content-api/auth.js +0 -0
- /package/server/{routes → src/routes}/content-api/index.js +0 -0
- /package/server/{routes → src/routes}/content-api/permissions.js +0 -0
- /package/server/{routes → src/routes}/content-api/role.js +0 -0
- /package/server/{routes → src/routes}/content-api/user.js +0 -0
- /package/server/{routes → src/routes}/content-api/validation.js +0 -0
- /package/server/{routes → src/routes}/index.js +0 -0
- /package/server/{services → src/services}/constants.js +0 -0
- /package/server/{services → src/services}/index.js +0 -0
- /package/server/{services → src/services}/jwt.js +0 -0
- /package/server/{services → src/services}/permission.js +0 -0
- /package/server/{utils → src/utils}/index.js +0 -0
- /package/server/{utils → src/utils}/refresh-cookie-options.js +0 -0
- /package/server/{utils → src/utils}/sanitize/index.js +0 -0
- /package/server/{utils → src/utils}/sanitize/visitors/index.js +0 -0
- /package/server/{utils → src/utils}/sanitize/visitors/remove-user-relation-from-role-entities.js +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const crypto = require('node:crypto');
|
|
4
|
+
|
|
5
|
+
const formatScope = (scope, delimiter = ',') => {
|
|
6
|
+
if (Array.isArray(scope)) {
|
|
7
|
+
return scope.filter(Boolean).join(delimiter) || undefined;
|
|
8
|
+
}
|
|
9
|
+
return scope || undefined;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const substituteSubdomain = (url, subdomain) =>
|
|
13
|
+
subdomain ? url.replace('[subdomain]', subdomain) : url;
|
|
14
|
+
|
|
15
|
+
const buildAuthorizeUrl = (provider, { key, redirectUri, scope, subdomain }) => {
|
|
16
|
+
const authorizeUrl = substituteSubdomain(provider.authorize_url, subdomain);
|
|
17
|
+
const params = new URLSearchParams({
|
|
18
|
+
client_id: key,
|
|
19
|
+
response_type: 'code',
|
|
20
|
+
redirect_uri: redirectUri,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const formattedScope = formatScope(scope, provider.scope_delimiter);
|
|
24
|
+
if (formattedScope) {
|
|
25
|
+
params.set('scope', formattedScope);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (provider.name === 'instagram' && /^\d+$/.test(key)) {
|
|
29
|
+
params.delete('client_id');
|
|
30
|
+
params.set('app_id', key);
|
|
31
|
+
if (formattedScope) {
|
|
32
|
+
params.set('scope', formattedScope.replaceAll(' ', ','));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return `${authorizeUrl}?${params.toString()}`;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const parseTokenResponse = async (response) => {
|
|
40
|
+
const contentType = response.headers.get('content-type') || '';
|
|
41
|
+
if (contentType.includes('application/json')) {
|
|
42
|
+
return response.json();
|
|
43
|
+
}
|
|
44
|
+
const text = await response.text();
|
|
45
|
+
return Object.fromEntries(new URLSearchParams(text));
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const exchangeAuthorizationCode = async (
|
|
49
|
+
provider,
|
|
50
|
+
{ key, secret, redirectUri, code, subdomain }
|
|
51
|
+
) => {
|
|
52
|
+
const accessUrl = substituteSubdomain(provider.access_url, subdomain);
|
|
53
|
+
const body = new URLSearchParams({
|
|
54
|
+
grant_type: 'authorization_code',
|
|
55
|
+
code,
|
|
56
|
+
redirect_uri: redirectUri,
|
|
57
|
+
client_id: key,
|
|
58
|
+
client_secret: secret,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
|
|
62
|
+
|
|
63
|
+
if (provider.token_endpoint_auth_method === 'client_secret_basic') {
|
|
64
|
+
const credentials = Buffer.from(`${key}:${secret}`).toString('base64');
|
|
65
|
+
headers.Authorization = `Basic ${credentials}`;
|
|
66
|
+
body.delete('client_id');
|
|
67
|
+
body.delete('client_secret');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (provider.name === 'instagram' && /^\d+$/.test(key)) {
|
|
71
|
+
body.delete('client_id');
|
|
72
|
+
body.delete('client_secret');
|
|
73
|
+
body.set('app_id', key);
|
|
74
|
+
body.set('app_secret', secret);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const response = await fetch(accessUrl, { method: 'POST', headers, body });
|
|
78
|
+
const output = await parseTokenResponse(response);
|
|
79
|
+
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
output.error_description || output.error || `Token exchange failed (${response.status})`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return output;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const tokensToQueryPayload = (provider, tokenResponse) => {
|
|
90
|
+
const data = { raw: tokenResponse };
|
|
91
|
+
|
|
92
|
+
if (provider.oauth === 1) {
|
|
93
|
+
if (tokenResponse.oauth_token) {
|
|
94
|
+
data.access_token = tokenResponse.oauth_token;
|
|
95
|
+
}
|
|
96
|
+
if (tokenResponse.oauth_token_secret) {
|
|
97
|
+
data.access_secret = tokenResponse.oauth_token_secret;
|
|
98
|
+
}
|
|
99
|
+
return data;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (tokenResponse.id_token) {
|
|
103
|
+
data.id_token = tokenResponse.id_token;
|
|
104
|
+
}
|
|
105
|
+
if (tokenResponse.access_token) {
|
|
106
|
+
data.access_token = tokenResponse.access_token;
|
|
107
|
+
}
|
|
108
|
+
if (tokenResponse.refresh_token) {
|
|
109
|
+
data.refresh_token = tokenResponse.refresh_token;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return data;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const generateState = () => crypto.randomBytes(20).toString('hex');
|
|
116
|
+
|
|
117
|
+
module.exports = {
|
|
118
|
+
buildAuthorizeUrl,
|
|
119
|
+
exchangeAuthorizationCode,
|
|
120
|
+
tokensToQueryPayload,
|
|
121
|
+
generateState,
|
|
122
|
+
substituteSubdomain,
|
|
123
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OAuth endpoint definitions for built-in users-permissions providers.
|
|
5
|
+
* Derived from grant's oauth.json (MIT) — inlined to drop the grant dependency.
|
|
6
|
+
*/
|
|
7
|
+
module.exports = {
|
|
8
|
+
discord: {
|
|
9
|
+
oauth: 2,
|
|
10
|
+
authorize_url: 'https://discord.com/api/oauth2/authorize',
|
|
11
|
+
access_url: 'https://discord.com/api/oauth2/token',
|
|
12
|
+
scope_delimiter: ' ',
|
|
13
|
+
},
|
|
14
|
+
facebook: {
|
|
15
|
+
oauth: 2,
|
|
16
|
+
authorize_url: 'https://www.facebook.com/dialog/oauth',
|
|
17
|
+
access_url: 'https://graph.facebook.com/oauth/access_token',
|
|
18
|
+
},
|
|
19
|
+
google: {
|
|
20
|
+
oauth: 2,
|
|
21
|
+
authorize_url: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
22
|
+
access_url: 'https://oauth2.googleapis.com/token',
|
|
23
|
+
scope_delimiter: ' ',
|
|
24
|
+
},
|
|
25
|
+
github: {
|
|
26
|
+
oauth: 2,
|
|
27
|
+
authorize_url: 'https://github.com/login/oauth/authorize',
|
|
28
|
+
access_url: 'https://github.com/login/oauth/access_token',
|
|
29
|
+
},
|
|
30
|
+
microsoft: {
|
|
31
|
+
oauth: 2,
|
|
32
|
+
authorize_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
|
|
33
|
+
access_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
|
|
34
|
+
scope_delimiter: ' ',
|
|
35
|
+
},
|
|
36
|
+
twitter: {
|
|
37
|
+
oauth: 1,
|
|
38
|
+
request_url: 'https://api.twitter.com/oauth/request_token',
|
|
39
|
+
authorize_url: 'https://api.twitter.com/oauth/authenticate',
|
|
40
|
+
access_url: 'https://api.twitter.com/oauth/access_token',
|
|
41
|
+
},
|
|
42
|
+
instagram: {
|
|
43
|
+
oauth: 2,
|
|
44
|
+
authorize_url: 'https://api.instagram.com/oauth/authorize',
|
|
45
|
+
access_url: 'https://api.instagram.com/oauth/access_token',
|
|
46
|
+
scope_delimiter: ' ',
|
|
47
|
+
},
|
|
48
|
+
vk: {
|
|
49
|
+
oauth: 2,
|
|
50
|
+
authorize_url: 'https://oauth.vk.com/authorize',
|
|
51
|
+
access_url: 'https://oauth.vk.com/access_token',
|
|
52
|
+
},
|
|
53
|
+
twitch: {
|
|
54
|
+
oauth: 2,
|
|
55
|
+
authorize_url: 'https://id.twitch.tv/oauth2/authorize',
|
|
56
|
+
access_url: 'https://id.twitch.tv/oauth2/token',
|
|
57
|
+
scope_delimiter: ' ',
|
|
58
|
+
},
|
|
59
|
+
linkedin: {
|
|
60
|
+
oauth: 2,
|
|
61
|
+
authorize_url: 'https://www.linkedin.com/oauth/v2/authorization',
|
|
62
|
+
access_url: 'https://www.linkedin.com/oauth/v2/accessToken',
|
|
63
|
+
scope_delimiter: ' ',
|
|
64
|
+
},
|
|
65
|
+
cognito: {
|
|
66
|
+
oauth: 2,
|
|
67
|
+
authorize_url: 'https://[subdomain]/oauth2/authorize',
|
|
68
|
+
access_url: 'https://[subdomain]/oauth2/token',
|
|
69
|
+
scope_delimiter: ' ',
|
|
70
|
+
},
|
|
71
|
+
reddit: {
|
|
72
|
+
oauth: 2,
|
|
73
|
+
authorize_url: 'https://ssl.reddit.com/api/v1/authorize',
|
|
74
|
+
access_url: 'https://ssl.reddit.com/api/v1/access_token',
|
|
75
|
+
token_endpoint_auth_method: 'client_secret_basic',
|
|
76
|
+
},
|
|
77
|
+
auth0: {
|
|
78
|
+
oauth: 2,
|
|
79
|
+
authorize_url: 'https://[subdomain].auth0.com/authorize',
|
|
80
|
+
access_url: 'https://[subdomain].auth0.com/oauth/token',
|
|
81
|
+
scope_delimiter: ' ',
|
|
82
|
+
},
|
|
83
|
+
cas: {
|
|
84
|
+
oauth: 2,
|
|
85
|
+
authorize_url: 'https://[subdomain]/oidc/authorize',
|
|
86
|
+
access_url: 'https://[subdomain]/oidc/token',
|
|
87
|
+
},
|
|
88
|
+
patreon: {
|
|
89
|
+
oauth: 2,
|
|
90
|
+
authorize_url: 'https://www.patreon.com/oauth2/authorize',
|
|
91
|
+
access_url: 'https://www.patreon.com/api/oauth2/token',
|
|
92
|
+
scope_delimiter: ' ',
|
|
93
|
+
},
|
|
94
|
+
keycloak: {
|
|
95
|
+
oauth: 2,
|
|
96
|
+
authorize_url: 'https://[subdomain]/protocol/openid-connect/auth',
|
|
97
|
+
access_url: 'https://[subdomain]/protocol/openid-connect/token',
|
|
98
|
+
scope_delimiter: ' ',
|
|
99
|
+
},
|
|
100
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fetchJson = async (url, options = {}) => {
|
|
4
|
+
const response = await fetch(url, options);
|
|
5
|
+
const contentType = response.headers.get('content-type') || '';
|
|
6
|
+
|
|
7
|
+
let body;
|
|
8
|
+
if (contentType.includes('application/json')) {
|
|
9
|
+
body = await response.json();
|
|
10
|
+
} else {
|
|
11
|
+
const text = await response.text();
|
|
12
|
+
try {
|
|
13
|
+
body = JSON.parse(text);
|
|
14
|
+
} catch {
|
|
15
|
+
body = text;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!response.ok) {
|
|
20
|
+
const message =
|
|
21
|
+
typeof body === 'object' && body !== null
|
|
22
|
+
? body.error_description || body.error || body.message
|
|
23
|
+
: body;
|
|
24
|
+
throw new Error(message || `HTTP ${response.status}`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return { body };
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const bearerGet = (url, accessToken, { headers = {}, qs = {} } = {}) => {
|
|
31
|
+
const target = new URL(url);
|
|
32
|
+
Object.entries(qs).forEach(([key, value]) => {
|
|
33
|
+
if (value !== undefined && value !== null) {
|
|
34
|
+
target.searchParams.set(key, String(value));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
return fetchJson(target, {
|
|
39
|
+
headers: {
|
|
40
|
+
Authorization: `Bearer ${accessToken}`,
|
|
41
|
+
...headers,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
module.exports = {
|
|
47
|
+
fetchJson,
|
|
48
|
+
bearerGet,
|
|
49
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const compact = (value) => {
|
|
4
|
+
if (value === null || value === undefined) {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
if (typeof value !== 'object' || Array.isArray(value)) {
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return Object.fromEntries(
|
|
13
|
+
Object.entries(value)
|
|
14
|
+
.map(([key, entry]) => [key, compact(entry)])
|
|
15
|
+
.filter(([, entry]) => entry !== undefined)
|
|
16
|
+
);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Compact grant's OAuth token response before it is written to the signed
|
|
21
|
+
* koa-session cookie. The full token exchange payload (especially Cognito's
|
|
22
|
+
* dual JWTs plus a duplicated raw blob) can exceed the browser's ~4 KB
|
|
23
|
+
* per-cookie limit and silently break the auth callback.
|
|
24
|
+
*
|
|
25
|
+
* Keep only fields that auth.callback / providers-registry actually read.
|
|
26
|
+
*/
|
|
27
|
+
const trimGrantSessionResponse = (grantResponse, provider) => {
|
|
28
|
+
if (!grantResponse || typeof grantResponse !== 'object') {
|
|
29
|
+
return grantResponse;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
switch (provider) {
|
|
33
|
+
case 'cognito':
|
|
34
|
+
return compact({
|
|
35
|
+
id_token: grantResponse.id_token,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
case 'twitter':
|
|
39
|
+
return compact({
|
|
40
|
+
access_token: grantResponse.access_token,
|
|
41
|
+
access_secret: grantResponse.access_secret,
|
|
42
|
+
raw: grantResponse.raw?.screen_name
|
|
43
|
+
? { screen_name: grantResponse.raw.screen_name }
|
|
44
|
+
: undefined,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
case 'vk':
|
|
48
|
+
return compact({
|
|
49
|
+
access_token: grantResponse.access_token,
|
|
50
|
+
raw:
|
|
51
|
+
grantResponse.raw?.email != null && grantResponse.raw?.user_id != null
|
|
52
|
+
? {
|
|
53
|
+
email: grantResponse.raw.email,
|
|
54
|
+
user_id: grantResponse.raw.user_id,
|
|
55
|
+
}
|
|
56
|
+
: undefined,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
default:
|
|
60
|
+
return compact({
|
|
61
|
+
access_token: grantResponse.access_token,
|
|
62
|
+
oauth_token: grantResponse.oauth_token,
|
|
63
|
+
id_token: grantResponse.id_token,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
module.exports = {
|
|
69
|
+
trimGrantSessionResponse,
|
|
70
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const crypto = require('node:crypto');
|
|
4
|
+
const jwt = require('jsonwebtoken');
|
|
5
|
+
|
|
6
|
+
const jwkToKeyObject = (jwk) => crypto.createPublicKey({ key: jwk, format: 'jwk' });
|
|
7
|
+
|
|
8
|
+
const verifyJwtWithJwks = async ({ idToken, jwksUrl }) => {
|
|
9
|
+
const decoded = jwt.decode(idToken, { complete: true });
|
|
10
|
+
|
|
11
|
+
if (!decoded?.header?.kid || !decoded.payload) {
|
|
12
|
+
throw new Error('The provided token is not valid');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const response = await fetch(jwksUrl.toString());
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error('There was an error verifying the token');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const jwk = await response.json();
|
|
21
|
+
const key = jwk.keys?.find(({ kid }) => kid === decoded.header.kid);
|
|
22
|
+
|
|
23
|
+
if (!key) {
|
|
24
|
+
throw new Error('There was an error verifying the token');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const publicKey = jwkToKeyObject(key);
|
|
28
|
+
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
jwt.verify(idToken, publicKey, { algorithms: ['RS256'] }, (err, tokenPayload) => {
|
|
31
|
+
if (err) {
|
|
32
|
+
reject(new Error('There was an error verifying the token'));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
resolve(tokenPayload);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
module.exports = {
|
|
41
|
+
jwkToKeyObject,
|
|
42
|
+
verifyJwtWithJwks,
|
|
43
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarations of the `strapi-server` entry of `@strapi/plugin-users-permissions`, a JavaScript
|
|
3
|
+
* package. They register its config contract for applications with `typescript.strictTypes`, until
|
|
4
|
+
* the plugin moves to TypeScript and emits its own declarations.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** The `jwtManagement` modes of the Content API authentication. */
|
|
8
|
+
export type JwtManagement = 'legacy-support' | 'refresh';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* `strapi.config.get('plugin::users-permissions')`: the plugin config merged with its defaults
|
|
12
|
+
* (`server/src/config.js`).
|
|
13
|
+
*/
|
|
14
|
+
export type UsersPermissionsConfig = {
|
|
15
|
+
/** `JWT_SECRET`, unset when the environment does not define it. */
|
|
16
|
+
jwtSecret?: string;
|
|
17
|
+
/** Options of the plugin JWTs (`legacy-support` mode), e.g. `expiresIn`. */
|
|
18
|
+
jwt: { expiresIn?: string | number; [option: string]: unknown };
|
|
19
|
+
jwtManagement: JwtManagement;
|
|
20
|
+
/** Session manager lifespans, in seconds, and the refresh cookie (`refresh` mode). */
|
|
21
|
+
sessions: {
|
|
22
|
+
accessTokenLifespan: number;
|
|
23
|
+
maxRefreshTokenLifespan: number;
|
|
24
|
+
idleRefreshTokenLifespan: number;
|
|
25
|
+
maxSessionLifespan: number;
|
|
26
|
+
idleSessionLifespan: number;
|
|
27
|
+
httpOnly: boolean;
|
|
28
|
+
cookie?: {
|
|
29
|
+
name?: string;
|
|
30
|
+
secure?: boolean;
|
|
31
|
+
sameSite?: 'lax' | 'strict' | 'none' | boolean;
|
|
32
|
+
path?: string;
|
|
33
|
+
domain?: string;
|
|
34
|
+
maxAge?: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
/** Options of the authentication routes' rate limit. */
|
|
38
|
+
ratelimit: { interval: number; max: number; [option: string]: unknown };
|
|
39
|
+
layout: { user: { actions: { create: string; update: string } } };
|
|
40
|
+
callback: {
|
|
41
|
+
/** Throws when a provider callback URL is not allowed. */
|
|
42
|
+
validate(callback: string, provider: { callback: string }): void;
|
|
43
|
+
};
|
|
44
|
+
/** Extra user fields the register route accepts. */
|
|
45
|
+
register?: { allowedFields?: string[] };
|
|
46
|
+
/** Password validation rules of the register and password routes. */
|
|
47
|
+
validationRules?: Record<string, unknown>;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
declare global {
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
52
|
+
namespace Strapi {
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
54
|
+
namespace Registries {
|
|
55
|
+
interface PackageConfigs {
|
|
56
|
+
'plugin::users-permissions': UsersPermissionsConfig;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The plugin's server entry. Untyped, as the JavaScript entry was without these declarations. */
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
declare const usersPermissions: any;
|
|
65
|
+
export default usersPermissions;
|