@strapi/plugin-users-permissions 5.50.1 → 5.51.0

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.
Files changed (65) hide show
  1. package/admin/src/pages/Roles/pages/EditPage.jsx +1 -1
  2. package/admin/src/translations/en.json +2 -0
  3. package/admin/src/translations/ko.json +2 -1
  4. package/dist/admin/pages/Roles/pages/EditPage.js +1 -1
  5. package/dist/admin/pages/Roles/pages/EditPage.js.map +1 -1
  6. package/dist/admin/pages/Roles/pages/EditPage.mjs +1 -1
  7. package/dist/admin/pages/Roles/pages/EditPage.mjs.map +1 -1
  8. package/dist/admin/translations/en.json.js +1 -0
  9. package/dist/admin/translations/en.json.js.map +1 -1
  10. package/dist/admin/translations/en.json.mjs +1 -0
  11. package/dist/admin/translations/en.json.mjs.map +1 -1
  12. package/dist/admin/translations/ko.json.js +2 -1
  13. package/dist/admin/translations/ko.json.js.map +1 -1
  14. package/dist/admin/translations/ko.json.mjs +2 -1
  15. package/dist/admin/translations/ko.json.mjs.map +1 -1
  16. package/dist/server/_virtual/_node_crypto.js +10 -0
  17. package/dist/server/_virtual/_node_crypto.js.map +1 -0
  18. package/dist/server/_virtual/_node_crypto.mjs +7 -0
  19. package/dist/server/_virtual/_node_crypto.mjs.map +1 -0
  20. package/dist/server/_virtual/_node_url.js +10 -0
  21. package/dist/server/_virtual/_node_url.js.map +1 -0
  22. package/dist/server/_virtual/_node_url.mjs +7 -0
  23. package/dist/server/_virtual/_node_url.mjs.map +1 -0
  24. package/dist/server/controllers/auth.js +19 -19
  25. package/dist/server/controllers/auth.js.map +1 -1
  26. package/dist/server/controllers/auth.mjs +19 -18
  27. package/dist/server/controllers/auth.mjs.map +1 -1
  28. package/dist/server/services/providers-registry.js +121 -242
  29. package/dist/server/services/providers-registry.js.map +1 -1
  30. package/dist/server/services/providers-registry.mjs +121 -239
  31. package/dist/server/services/providers-registry.mjs.map +1 -1
  32. package/dist/server/utils/oauth-connect/index.js +236 -0
  33. package/dist/server/utils/oauth-connect/index.js.map +1 -0
  34. package/dist/server/utils/oauth-connect/index.mjs +230 -0
  35. package/dist/server/utils/oauth-connect/index.mjs.map +1 -0
  36. package/dist/server/utils/oauth-connect/oauth1.js +138 -0
  37. package/dist/server/utils/oauth-connect/oauth1.js.map +1 -0
  38. package/dist/server/utils/oauth-connect/oauth1.mjs +136 -0
  39. package/dist/server/utils/oauth-connect/oauth1.mjs.map +1 -0
  40. package/dist/server/utils/oauth-connect/oauth2.js +117 -0
  41. package/dist/server/utils/oauth-connect/oauth2.js.map +1 -0
  42. package/dist/server/utils/oauth-connect/oauth2.mjs +115 -0
  43. package/dist/server/utils/oauth-connect/oauth2.mjs.map +1 -0
  44. package/dist/server/utils/oauth-connect/providers.js +109 -0
  45. package/dist/server/utils/oauth-connect/providers.js.map +1 -0
  46. package/dist/server/utils/oauth-connect/providers.mjs +107 -0
  47. package/dist/server/utils/oauth-connect/providers.mjs.map +1 -0
  48. package/dist/server/utils/provider-http.js +52 -0
  49. package/dist/server/utils/provider-http.js.map +1 -0
  50. package/dist/server/utils/provider-http.mjs +50 -0
  51. package/dist/server/utils/provider-http.mjs.map +1 -0
  52. package/dist/server/utils/verify-jwt-with-jwks.js +60 -0
  53. package/dist/server/utils/verify-jwt-with-jwks.js.map +1 -0
  54. package/dist/server/utils/verify-jwt-with-jwks.mjs +54 -0
  55. package/dist/server/utils/verify-jwt-with-jwks.mjs.map +1 -0
  56. package/jsconfig.json +7 -0
  57. package/package.json +12 -12
  58. package/server/controllers/auth.js +13 -20
  59. package/server/services/providers-registry.js +137 -293
  60. package/server/utils/oauth-connect/index.js +256 -0
  61. package/server/utils/oauth-connect/oauth1.js +169 -0
  62. package/server/utils/oauth-connect/oauth2.js +123 -0
  63. package/server/utils/oauth-connect/providers.js +100 -0
  64. package/server/utils/provider-http.js +49 -0
  65. package/server/utils/verify-jwt-with-jwks.js +43 -0
@@ -1 +1 @@
1
- {"version":3,"file":"providers-registry.mjs","sources":["../../../server/services/providers-registry.js"],"sourcesContent":["'use strict';\n\nconst { strict: assert } = require('assert');\nconst jwt = require('jsonwebtoken');\nconst urljoin = require('url-join');\nconst jwkToPem = require('jwk-to-pem');\n\nconst getCognitoPayload = async ({ idToken, jwksUrl, purest }) => {\n const {\n header: { kid },\n payload,\n } = jwt.decode(idToken, { complete: true });\n\n if (!payload || !kid) {\n throw new Error('The provided token is not valid');\n }\n\n const config = {\n cognito: {\n discovery: {\n origin: jwksUrl.origin,\n path: jwksUrl.pathname,\n },\n },\n };\n try {\n const cognito = purest({ provider: 'cognito', config });\n // get the JSON Web Key (JWK) for the user pool\n const { body: jwk } = await cognito('discovery').request();\n // Get the key with the same Key ID as the provided token\n const key = jwk.keys.find(({ kid: jwkKid }) => jwkKid === kid);\n const pem = jwkToPem(key);\n\n // https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html\n const decodedToken = await new Promise((resolve, reject) => {\n jwt.verify(idToken, pem, { algorithms: ['RS256'] }, (err, decodedToken) => {\n if (err) {\n reject();\n }\n resolve(decodedToken);\n });\n });\n return decodedToken;\n } catch (err) {\n throw new Error('There was an error verifying the token');\n }\n};\n\nconst initProviders = ({ baseURL, purest }) => ({\n email: {\n enabled: true,\n icon: 'envelope',\n grantConfig: {},\n },\n discord: {\n enabled: false,\n icon: 'discord',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/discord/callback`,\n scope: ['identify', 'email'],\n },\n async authCallback({ accessToken }) {\n const discord = purest({ provider: 'discord' });\n\n return discord\n .get('users/@me')\n .auth(accessToken)\n .request()\n .then(({ body }) => {\n // Combine username and discriminator (if discriminator exists and not equal to 0)\n const username =\n body.discriminator && body.discriminator !== '0'\n ? `${body.username}#${body.discriminator}`\n : body.username;\n return {\n username,\n email: body.email,\n };\n });\n },\n },\n facebook: {\n enabled: false,\n icon: 'facebook-square',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/facebook/callback`,\n scope: ['email'],\n },\n async authCallback({ accessToken }) {\n const facebook = purest({ provider: 'facebook' });\n\n return facebook\n .get('me')\n .auth(accessToken)\n .qs({ fields: 'name,email' })\n .request()\n .then(({ body }) => ({\n username: body.name,\n email: body.email,\n }));\n },\n },\n google: {\n enabled: false,\n icon: 'google',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/google/callback`,\n scope: ['email'],\n },\n async authCallback({ accessToken }) {\n const google = purest({ provider: 'google' });\n\n return google\n .query('oauth')\n .get('tokeninfo')\n .qs({ accessToken })\n .request()\n .then(({ body }) => ({\n username: body.email.split('@')[0],\n email: body.email,\n }));\n },\n },\n github: {\n enabled: false,\n icon: 'github',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/github/callback`,\n scope: ['user', 'user:email'],\n },\n async authCallback({ accessToken }) {\n const github = purest({\n provider: 'github',\n defaults: {\n headers: {\n 'user-agent': 'strapi',\n },\n },\n });\n\n const { body: userBody } = await github.get('user').auth(accessToken).request();\n\n // This is the public email on the github profile\n if (userBody.email) {\n return {\n username: userBody.login,\n email: userBody.email,\n };\n }\n // Get the email with Github's user/emails API\n const { body: emailBody } = await github.get('user/emails').auth(accessToken).request();\n\n return {\n username: userBody.login,\n email: Array.isArray(emailBody)\n ? emailBody.find((email) => email.primary === true).email\n : null,\n };\n },\n },\n microsoft: {\n enabled: false,\n icon: 'windows',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/microsoft/callback`,\n scope: ['user.read'],\n },\n async authCallback({ accessToken }) {\n const microsoft = purest({ provider: 'microsoft' });\n\n return microsoft\n .get('me')\n .auth(accessToken)\n .request()\n .then(({ body }) => ({\n username: body.userPrincipalName,\n email: body.userPrincipalName,\n }));\n },\n },\n\n twitter: {\n enabled: false,\n icon: 'twitter',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/twitter/callback`,\n },\n async authCallback({ accessToken, query, providers }) {\n const twitter = purest({\n provider: 'twitter',\n defaults: {\n oauth: {\n consumer_key: providers.twitter.key,\n consumer_secret: providers.twitter.secret,\n },\n },\n });\n\n return twitter\n .get('account/verify_credentials')\n .auth(accessToken, query.access_secret)\n .qs({ screen_name: query['raw[screen_name]'], include_email: 'true' })\n .request()\n .then(({ body }) => ({\n username: body.screen_name,\n email: body.email,\n }));\n },\n },\n instagram: {\n enabled: false,\n icon: 'instagram',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/instagram/callback`,\n scope: ['user_profile'],\n },\n async authCallback({ accessToken }) {\n const instagram = purest({ provider: 'instagram' });\n\n return instagram\n .get('me')\n .auth(accessToken)\n .qs({ fields: 'id,username' })\n .request()\n .then(({ body }) => ({\n username: body.username,\n email: `${body.username}@strapi.io`, // dummy email as Instagram does not provide user email\n }));\n },\n },\n vk: {\n enabled: false,\n icon: 'vk',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/vk/callback`,\n scope: ['email'],\n },\n async authCallback({ accessToken, query }) {\n const vk = purest({ provider: 'vk' });\n\n return vk\n .get('users')\n .auth(accessToken)\n .qs({ id: query.raw.user_id, v: '5.122' })\n .request()\n .then(({ body }) => ({\n username: `${body.response[0].last_name} ${body.response[0].first_name}`,\n email: query.raw.email,\n }));\n },\n },\n\n twitch: {\n enabled: false,\n icon: 'twitch',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/twitch/callback`,\n scope: ['user:read:email'],\n },\n async authCallback({ accessToken, providers }) {\n const twitch = purest({\n provider: 'twitch',\n config: {\n twitch: {\n default: {\n origin: 'https://api.twitch.tv',\n path: 'helix/{path}',\n headers: {\n Authorization: 'Bearer {auth}',\n 'Client-Id': '{auth}',\n },\n },\n },\n },\n });\n\n return twitch\n .get('users')\n .auth(accessToken, providers.twitch.key)\n .request()\n .then(({ body }) => ({\n username: body.data[0].login,\n email: body.data[0].email,\n }));\n },\n },\n\n linkedin: {\n enabled: false,\n icon: 'linkedin',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/linkedin/callback`,\n scope: ['r_liteprofile', 'r_emailaddress'],\n },\n async authCallback({ accessToken }) {\n const linkedIn = purest({ provider: 'linkedin' });\n const {\n body: { localizedFirstName },\n } = await linkedIn.get('me').auth(accessToken).request();\n const {\n body: { elements },\n } = await linkedIn\n .get('emailAddress?q=members&projection=(elements*(handle~))')\n .auth(accessToken)\n .request();\n\n const email = elements[0]['handle~'];\n\n return {\n username: localizedFirstName,\n email: email.emailAddress,\n };\n },\n },\n\n cognito: {\n enabled: false,\n icon: 'aws',\n grantConfig: {\n key: '',\n secret: '',\n subdomain: 'my.subdomain.com',\n callback: `${baseURL}/cognito/callback`,\n scope: ['email', 'openid', 'profile'],\n },\n async authCallback({ query, providers }) {\n const jwksUrl = new URL(providers.cognito.jwksurl);\n const idToken = query.id_token;\n const tokenPayload = await getCognitoPayload({ idToken, jwksUrl, purest });\n return {\n username: tokenPayload['cognito:username'],\n email: tokenPayload.email,\n };\n },\n },\n\n reddit: {\n enabled: false,\n icon: 'reddit',\n grantConfig: {\n key: '',\n secret: '',\n callback: `${baseURL}/reddit/callback`,\n scope: ['identity'],\n },\n async authCallback({ accessToken }) {\n const reddit = purest({\n provider: 'reddit',\n config: {\n reddit: {\n default: {\n origin: 'https://oauth.reddit.com',\n path: 'api/{version}/{path}',\n version: 'v1',\n headers: {\n Authorization: 'Bearer {auth}',\n 'user-agent': 'strapi',\n },\n },\n },\n },\n });\n\n return reddit\n .get('me')\n .auth(accessToken)\n .request()\n .then(({ body }) => ({\n username: body.name,\n email: `${body.name}@strapi.io`, // dummy email as Reddit does not provide user email\n }));\n },\n },\n\n auth0: {\n enabled: false,\n icon: '',\n grantConfig: {\n key: '',\n secret: '',\n subdomain: 'my-tenant.eu',\n callback: `${baseURL}/auth0/callback`,\n scope: ['openid', 'email', 'profile'],\n },\n async authCallback({ accessToken, providers }) {\n const auth0 = purest({ provider: 'auth0' });\n\n return auth0\n .get('userinfo')\n .subdomain(providers.auth0.subdomain)\n .auth(accessToken)\n .request()\n .then(({ body }) => {\n const username = body.username || body.nickname || body.name || body.email.split('@')[0];\n const email = body.email || `${username.replace(/\\s+/g, '.')}@strapi.io`;\n\n return {\n username,\n email,\n };\n });\n },\n },\n\n cas: {\n enabled: false,\n icon: 'book',\n grantConfig: {\n key: '',\n secret: '',\n callback: `${baseURL}/cas/callback`,\n scope: ['openid email'], // scopes should be space delimited\n subdomain: 'my.subdomain.com/cas',\n },\n async authCallback({ accessToken, providers }) {\n const cas = purest({ provider: 'cas' });\n\n return cas\n .get('oidc/profile')\n .subdomain(providers.cas.subdomain)\n .auth(accessToken)\n .request()\n .then(({ body }) => {\n // CAS attribute may be in body.attributes or \"FLAT\", depending on CAS config\n const username = body.attributes\n ? body.attributes.strapiusername || body.id || body.sub\n : body.strapiusername || body.id || body.sub;\n const email = body.attributes\n ? body.attributes.strapiemail || body.attributes.email\n : body.strapiemail || body.email;\n if (!username || !email) {\n strapi.log.warn(\n `CAS Response Body did not contain required attributes: ${JSON.stringify(body)}`\n );\n }\n return {\n username,\n email,\n };\n });\n },\n },\n\n patreon: {\n enabled: false,\n icon: '',\n grantConfig: {\n key: '',\n secret: '',\n callback: `${baseURL}/patreon/callback`,\n scope: ['identity', 'identity[email]'],\n },\n async authCallback({ accessToken }) {\n const patreon = purest({\n provider: 'patreon',\n config: {\n patreon: {\n default: {\n origin: 'https://www.patreon.com',\n path: 'api/oauth2/{path}',\n headers: {\n authorization: 'Bearer {auth}',\n },\n },\n },\n },\n });\n\n return patreon\n .get('v2/identity')\n .auth(accessToken)\n .qs(new URLSearchParams({ 'fields[user]': 'full_name,email' }).toString())\n .request()\n .then(({ body }) => {\n const patreonData = body.data.attributes;\n return {\n username: patreonData.full_name,\n email: patreonData.email,\n };\n });\n },\n },\n keycloak: {\n enabled: false,\n icon: '',\n grantConfig: {\n key: '',\n secret: '',\n subdomain: 'myKeycloakProvider.com/realms/myrealm',\n callback: `${baseURL}/keycloak/callback`,\n scope: ['openid', 'email', 'profile'],\n },\n async authCallback({ accessToken, providers }) {\n const keycloak = purest({ provider: 'keycloak' });\n\n return keycloak\n .subdomain(providers.keycloak.subdomain)\n .get('protocol/openid-connect/userinfo')\n .auth(accessToken)\n .request()\n .then(({ body }) => {\n return {\n username: body.preferred_username,\n email: body.email,\n };\n });\n },\n },\n});\n\nmodule.exports = () => {\n const purest = require('purest');\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n const baseURL = urljoin(strapi.config.server.url, apiPrefix, 'auth');\n\n const authProviders = initProviders({ baseURL, purest });\n\n /**\n * @public\n */\n return {\n getAll() {\n return authProviders;\n },\n get(name) {\n return authProviders[name];\n },\n add(name, config) {\n authProviders[name] = config;\n },\n remove(name) {\n delete authProviders[name];\n },\n\n /**\n * @internal\n */\n async run({ provider, accessToken, query, providers }) {\n const authProvider = authProviders[provider];\n\n assert(authProvider, 'Unknown auth provider');\n\n return authProvider.authCallback({ accessToken, query, providers, purest });\n },\n };\n};\n"],"names":["strict","assert","require$$0","jwt","require$$1","urljoin","require$$2","jwkToPem","require$$3","getCognitoPayload","idToken","jwksUrl","purest","header","kid","payload","decode","complete","Error","config","cognito","discovery","origin","path","pathname","provider","body","jwk","request","key","keys","find","jwkKid","pem","decodedToken","Promise","resolve","reject","verify","algorithms","err","initProviders","baseURL","email","enabled","icon","grantConfig","discord","secret","callbackUrl","scope","authCallback","accessToken","get","auth","then","username","discriminator","facebook","qs","fields","name","google","query","split","github","defaults","headers","userBody","login","emailBody","Array","isArray","primary","microsoft","userPrincipalName","twitter","providers","oauth","consumer_key","consumer_secret","access_secret","screen_name","include_email","instagram","vk","id","raw","user_id","v","response","last_name","first_name","twitch","default","Authorization","data","linkedin","linkedIn","localizedFirstName","elements","emailAddress","subdomain","callback","URL","jwksurl","id_token","tokenPayload","reddit","version","auth0","nickname","replace","cas","attributes","strapiusername","sub","strapiemail","strapi","log","warn","JSON","stringify","patreon","authorization","URLSearchParams","toString","patreonData","full_name","keycloak","preferred_username","providersRegistry","require$$4","apiPrefix","server","url","authProviders","getAll","add","remove","run","authProvider"],"mappings":"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"}
1
+ {"version":3,"file":"providers-registry.mjs","sources":["../../../server/services/providers-registry.js"],"sourcesContent":["'use strict';\n\nconst { strict: assert } = require('assert');\nconst urljoin = require('url-join');\n\nconst { verifyJwtWithJwks } = require('../utils/verify-jwt-with-jwks');\nconst { bearerGet, fetchJson } = require('../utils/provider-http');\n\nconst initProviders = ({ baseURL }) => ({\n email: {\n enabled: true,\n icon: 'envelope',\n grantConfig: {},\n },\n discord: {\n enabled: false,\n icon: 'discord',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/discord/callback`,\n scope: ['identify', 'email'],\n },\n async authCallback({ accessToken }) {\n const { body } = await bearerGet('https://discord.com/api/users/@me', accessToken);\n const username =\n body.discriminator && body.discriminator !== '0'\n ? `${body.username}#${body.discriminator}`\n : body.username;\n return {\n username,\n email: body.email,\n };\n },\n },\n facebook: {\n enabled: false,\n icon: 'facebook-square',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/facebook/callback`,\n scope: ['email'],\n },\n async authCallback({ accessToken }) {\n const { body } = await bearerGet('https://graph.facebook.com/me', accessToken, {\n qs: { fields: 'name,email' },\n });\n return {\n username: body.name,\n email: body.email,\n };\n },\n },\n google: {\n enabled: false,\n icon: 'google',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/google/callback`,\n scope: ['email'],\n },\n async authCallback({ accessToken }) {\n const { body } = await fetchJson(\n `https://oauth2.googleapis.com/tokeninfo?access_token=${encodeURIComponent(accessToken)}`\n );\n return {\n username: body.email.split('@')[0],\n email: body.email,\n };\n },\n },\n github: {\n enabled: false,\n icon: 'github',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/github/callback`,\n scope: ['user', 'user:email'],\n },\n async authCallback({ accessToken }) {\n const { body: userBody } = await bearerGet('https://api.github.com/user', accessToken, {\n headers: { 'user-agent': 'strapi' },\n });\n\n if (userBody.email) {\n return {\n username: userBody.login,\n email: userBody.email,\n };\n }\n\n const { body: emailBody } = await bearerGet(\n 'https://api.github.com/user/emails',\n accessToken,\n {\n headers: { 'user-agent': 'strapi' },\n }\n );\n\n return {\n username: userBody.login,\n email: Array.isArray(emailBody)\n ? emailBody.find((email) => email.primary === true).email\n : null,\n };\n },\n },\n microsoft: {\n enabled: false,\n icon: 'windows',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/microsoft/callback`,\n scope: ['user.read'],\n },\n async authCallback({ accessToken }) {\n const { body } = await bearerGet('https://graph.microsoft.com/v1.0/me', accessToken);\n return {\n username: body.userPrincipalName,\n email: body.userPrincipalName,\n };\n },\n },\n\n twitter: {\n enabled: false,\n icon: 'twitter',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/twitter/callback`,\n },\n async authCallback({ accessToken, query, providers }) {\n const { twitterGet } = require('../utils/oauth-connect/oauth1');\n const { body } = await twitterGet({\n url: 'https://api.twitter.com/1.1/account/verify_credentials.json',\n accessToken,\n accessCredential: query.access_secret,\n consumerKey: providers.twitter.key,\n clientCredential: providers.twitter.secret,\n qs: { include_email: 'true', screen_name: query['raw[screen_name]'] },\n });\n\n return {\n username: body.screen_name,\n email: body.email,\n };\n },\n },\n instagram: {\n enabled: false,\n icon: 'instagram',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/instagram/callback`,\n scope: ['user_profile'],\n },\n async authCallback({ accessToken }) {\n const { body } = await bearerGet('https://graph.instagram.com/me', accessToken, {\n qs: { fields: 'id,username' },\n });\n return {\n username: body.username,\n email: `${body.username}@strapi.io`,\n };\n },\n },\n vk: {\n enabled: false,\n icon: 'vk',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/vk/callback`,\n scope: ['email'],\n },\n async authCallback({ accessToken, query }) {\n const { body } = await bearerGet('https://api.vk.com/method/users.get', accessToken, {\n qs: { user_ids: query.raw.user_id, v: '5.122' },\n });\n return {\n username: `${body.response[0].last_name} ${body.response[0].first_name}`,\n email: query.raw.email,\n };\n },\n },\n\n twitch: {\n enabled: false,\n icon: 'twitch',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/twitch/callback`,\n scope: ['user:read:email'],\n },\n async authCallback({ accessToken, providers }) {\n const { body } = await bearerGet('https://api.twitch.tv/helix/users', accessToken, {\n headers: {\n 'Client-Id': providers.twitch.key,\n },\n });\n return {\n username: body.data[0].login,\n email: body.data[0].email,\n };\n },\n },\n\n linkedin: {\n enabled: false,\n icon: 'linkedin',\n grantConfig: {\n key: '',\n secret: '',\n callbackUrl: `${baseURL}/linkedin/callback`,\n scope: ['r_liteprofile', 'r_emailaddress'],\n },\n async authCallback({ accessToken }) {\n const { body: profileBody } = await bearerGet('https://api.linkedin.com/v2/me', accessToken);\n const { body: emailBody } = await bearerGet(\n 'https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))',\n accessToken\n );\n\n const email = emailBody.elements[0]['handle~'];\n\n return {\n username: profileBody.localizedFirstName,\n email: email.emailAddress,\n };\n },\n },\n\n cognito: {\n enabled: false,\n icon: 'aws',\n grantConfig: {\n key: '',\n secret: '',\n subdomain: 'my.subdomain.com',\n callback: `${baseURL}/cognito/callback`,\n scope: ['email', 'openid', 'profile'],\n },\n async authCallback({ query, providers }) {\n const jwksUrl = new URL(providers.cognito.jwksurl);\n const idToken = query.id_token;\n const tokenPayload = await verifyJwtWithJwks({ idToken, jwksUrl });\n return {\n username: tokenPayload['cognito:username'],\n email: tokenPayload.email,\n };\n },\n },\n\n reddit: {\n enabled: false,\n icon: 'reddit',\n grantConfig: {\n key: '',\n secret: '',\n callback: `${baseURL}/reddit/callback`,\n scope: ['identity'],\n },\n async authCallback({ accessToken }) {\n const { body } = await bearerGet('https://oauth.reddit.com/api/v1/me', accessToken, {\n headers: { 'user-agent': 'strapi' },\n });\n return {\n username: body.name,\n email: `${body.name}@strapi.io`,\n };\n },\n },\n\n auth0: {\n enabled: false,\n icon: '',\n grantConfig: {\n key: '',\n secret: '',\n subdomain: 'my-tenant.eu',\n callback: `${baseURL}/auth0/callback`,\n scope: ['openid', 'email', 'profile'],\n },\n async authCallback({ accessToken, providers }) {\n const { body } = await bearerGet(\n `https://${providers.auth0.subdomain}.auth0.com/userinfo`,\n accessToken\n );\n const username = body.username || body.nickname || body.name || body.email.split('@')[0];\n const email = body.email || `${username.replace(/\\s+/g, '.')}@strapi.io`;\n\n return {\n username,\n email,\n };\n },\n },\n\n cas: {\n enabled: false,\n icon: 'book',\n grantConfig: {\n key: '',\n secret: '',\n callback: `${baseURL}/cas/callback`,\n scope: ['openid email'],\n subdomain: 'my.subdomain.com/cas',\n },\n async authCallback({ accessToken, providers }) {\n const { body } = await bearerGet(\n `https://${providers.cas.subdomain}/oidc/profile`,\n accessToken\n );\n const username = body.attributes\n ? body.attributes.strapiusername || body.id || body.sub\n : body.strapiusername || body.id || body.sub;\n const email = body.attributes\n ? body.attributes.strapiemail || body.attributes.email\n : body.strapiemail || body.email;\n if (!username || !email) {\n strapi.log.warn(\n `CAS Response Body did not contain required attributes: ${JSON.stringify(body)}`\n );\n }\n return {\n username,\n email,\n };\n },\n },\n\n patreon: {\n enabled: false,\n icon: '',\n grantConfig: {\n key: '',\n secret: '',\n callback: `${baseURL}/patreon/callback`,\n scope: ['identity', 'identity[email]'],\n },\n async authCallback({ accessToken }) {\n const { body } = await bearerGet(\n 'https://www.patreon.com/api/oauth2/v2/identity?fields[user]=full_name,email',\n accessToken\n );\n const patreonData = body.data.attributes;\n return {\n username: patreonData.full_name,\n email: patreonData.email,\n };\n },\n },\n keycloak: {\n enabled: false,\n icon: '',\n grantConfig: {\n key: '',\n secret: '',\n subdomain: 'myKeycloakProvider.com/realms/myrealm',\n callback: `${baseURL}/keycloak/callback`,\n scope: ['openid', 'email', 'profile'],\n },\n async authCallback({ accessToken, providers }) {\n const { body } = await bearerGet(\n `https://${providers.keycloak.subdomain}/protocol/openid-connect/userinfo`,\n accessToken\n );\n return {\n username: body.preferred_username,\n email: body.email,\n };\n },\n },\n});\n\nmodule.exports = () => {\n const apiPrefix = strapi.config.get('api.rest.prefix');\n const baseURL = urljoin(strapi.config.server.url, apiPrefix, 'auth');\n\n const authProviders = initProviders({ baseURL });\n\n return {\n getAll() {\n return authProviders;\n },\n get(name) {\n return authProviders[name];\n },\n add(name, config) {\n authProviders[name] = config;\n },\n remove(name) {\n delete authProviders[name];\n },\n\n async run({ provider, accessToken, query, providers }) {\n const authProvider = authProviders[provider];\n\n assert(authProvider, 'Unknown auth provider');\n\n return authProvider.authCallback({ accessToken, query, providers });\n },\n };\n};\n"],"names":["strict","assert","require$$0","urljoin","require$$1","verifyJwtWithJwks","require$$2","bearerGet","fetchJson","require$$3","initProviders","baseURL","email","enabled","icon","grantConfig","discord","key","secret","callbackUrl","scope","authCallback","accessToken","body","username","discriminator","facebook","qs","fields","name","google","encodeURIComponent","split","github","userBody","headers","login","emailBody","Array","isArray","find","primary","microsoft","userPrincipalName","twitter","query","providers","twitterGet","require$$4","url","accessCredential","access_secret","consumerKey","clientCredential","include_email","screen_name","instagram","vk","user_ids","raw","user_id","v","response","last_name","first_name","twitch","data","linkedin","profileBody","elements","localizedFirstName","emailAddress","cognito","subdomain","callback","jwksUrl","URL","jwksurl","idToken","id_token","tokenPayload","reddit","auth0","nickname","replace","cas","attributes","strapiusername","id","sub","strapiemail","strapi","log","warn","JSON","stringify","patreon","patreonData","full_name","keycloak","preferred_username","providersRegistry","apiPrefix","config","get","server","authProviders","getAll","add","remove","run","provider","authProvider"],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ 'use strict';
2
+
3
+ var require$$1 = require('@strapi/utils');
4
+ var providers = require('./providers.js');
5
+ var oauth1 = require('./oauth1.js');
6
+ var oauth2 = require('./oauth2.js');
7
+ var index = require('../index.js');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var require$$1__default = /*#__PURE__*/_interopDefault(require$$1);
12
+
13
+ var oauthConnect;
14
+ var hasRequiredOauthConnect;
15
+ function requireOauthConnect() {
16
+ if (hasRequiredOauthConnect) return oauthConnect;
17
+ hasRequiredOauthConnect = 1;
18
+ const { errors } = require$$1__default.default;
19
+ const builtinProviderEndpoints = providers.__require();
20
+ const oauth1$1 = oauth1.__require();
21
+ const oauth2$1 = oauth2.__require();
22
+ const CONNECT_PREFIX = '/connect';
23
+ const parseConnectPath = (requestPath, apiPrefix)=>{
24
+ const prefix = `${apiPrefix}${CONNECT_PREFIX}/`;
25
+ if (!requestPath.startsWith(prefix)) {
26
+ return null;
27
+ }
28
+ const remainder = requestPath.slice(prefix.length);
29
+ const [provider, segment] = remainder.split('/').filter(Boolean);
30
+ if (!provider) {
31
+ return null;
32
+ }
33
+ return {
34
+ provider,
35
+ isCallback: segment === 'callback'
36
+ };
37
+ };
38
+ /**
39
+ * Resolve OAuth endpoint config from built-ins, falling back to store-defined
40
+ * endpoints so custom providers registered via providers-registry still work.
41
+ */ const buildProviderConfig = (providerName, storedConfig, redirectUri)=>{
42
+ const defaults = builtinProviderEndpoints[providerName];
43
+ const endpoints = defaults || {
44
+ oauth: storedConfig.oauth,
45
+ authorize_url: storedConfig.authorize_url,
46
+ access_url: storedConfig.access_url,
47
+ request_url: storedConfig.request_url,
48
+ scope_delimiter: storedConfig.scope_delimiter,
49
+ token_endpoint_auth_method: storedConfig.token_endpoint_auth_method
50
+ };
51
+ if (endpoints.oauth === 1) {
52
+ if (!endpoints.request_url || !endpoints.authorize_url || !endpoints.access_url) {
53
+ return null;
54
+ }
55
+ } else if (!endpoints.authorize_url || !endpoints.access_url) {
56
+ return null;
57
+ }
58
+ return {
59
+ name: providerName,
60
+ ...endpoints,
61
+ key: storedConfig.key,
62
+ secret: storedConfig.secret,
63
+ scope: storedConfig.scope,
64
+ subdomain: storedConfig.subdomain,
65
+ callback: storedConfig.callback,
66
+ redirect_uri: redirectUri
67
+ };
68
+ };
69
+ const redirectWithPayload = (ctx, callbackUrl, payload)=>{
70
+ const url = new URL(callbackUrl);
71
+ const params = new URLSearchParams();
72
+ Object.entries(payload).forEach(([key, value])=>{
73
+ if (key === 'raw') {
74
+ Object.entries(value).forEach(([rawKey, rawValue])=>{
75
+ params.set(`raw[${rawKey}]`, String(rawValue));
76
+ });
77
+ return;
78
+ }
79
+ if (value !== undefined && value !== null) {
80
+ params.set(key, String(value));
81
+ }
82
+ });
83
+ url.search = params.toString();
84
+ ctx.redirect(url.toString());
85
+ };
86
+ const preserveGrantDynamic = (ctx)=>{
87
+ const dynamic = ctx.session.grant?.dynamic;
88
+ return dynamic ? {
89
+ dynamic
90
+ } : {};
91
+ };
92
+ const startOAuth1Flow = async (ctx, provider, parsed, redirectUri)=>{
93
+ const requestToken = await oauth1$1.requestToken({
94
+ requestUrl: provider.request_url,
95
+ redirectUri,
96
+ consumerKey: provider.key,
97
+ clientCredential: provider.secret
98
+ });
99
+ ctx.session.grant = {
100
+ ...preserveGrantDynamic(ctx),
101
+ provider: parsed.provider,
102
+ request: requestToken
103
+ };
104
+ const authorizeUrl = `${provider.authorize_url}?oauth_token=${encodeURIComponent(requestToken.oauth_token)}`;
105
+ return ctx.redirect(authorizeUrl);
106
+ };
107
+ const startOAuth2Flow = (ctx, provider, parsed, redirectUri)=>{
108
+ const state = oauth2$1.generateState();
109
+ ctx.session.grant = {
110
+ ...preserveGrantDynamic(ctx),
111
+ provider: parsed.provider,
112
+ state
113
+ };
114
+ let authorizeUrl = oauth2$1.buildAuthorizeUrl(provider, {
115
+ key: provider.key,
116
+ redirectUri,
117
+ scope: provider.scope,
118
+ subdomain: provider.subdomain
119
+ });
120
+ authorizeUrl += `&state=${encodeURIComponent(state)}`;
121
+ return ctx.redirect(authorizeUrl);
122
+ };
123
+ const handleOAuth1Callback = async (ctx, provider, callbackUrl)=>{
124
+ const session = ctx.session.grant || {};
125
+ const { oauth_token: oauthToken, oauth_verifier: oauthVerifier } = ctx.query;
126
+ const requestToken = session.request;
127
+ if (!requestToken?.oauth_token || oauthToken !== requestToken.oauth_token) {
128
+ throw new Error('OAuth1 token mismatch');
129
+ }
130
+ const tokenResponse = await oauth1$1.accessToken({
131
+ accessUrl: provider.access_url,
132
+ consumerKey: provider.key,
133
+ clientCredential: provider.secret,
134
+ oauthToken,
135
+ oauthVerifier,
136
+ oauthTokenCredential: requestToken.oauth_token_secret
137
+ });
138
+ const payload = oauth2$1.tokensToQueryPayload(provider, tokenResponse);
139
+ ctx.session.grant = {};
140
+ return redirectWithPayload(ctx, callbackUrl, payload);
141
+ };
142
+ const handleOAuth2Callback = async (ctx, provider, callbackUrl, redirectUri)=>{
143
+ const session = ctx.session.grant || {};
144
+ const { code, state: queryState, error, error_description: errorDescription } = ctx.query;
145
+ if (error) {
146
+ ctx.session.grant = {};
147
+ return redirectWithPayload(ctx, callbackUrl, {
148
+ error,
149
+ error_description: errorDescription
150
+ });
151
+ }
152
+ if (!code) {
153
+ throw new Error('OAuth2 missing code parameter');
154
+ }
155
+ // Reject when session state is missing (not only on mismatch) to close login-CSRF.
156
+ if (!session.state || queryState !== session.state) {
157
+ throw new Error('OAuth2 state mismatch');
158
+ }
159
+ const tokenResponse = await oauth2$1.exchangeAuthorizationCode(provider, {
160
+ key: provider.key,
161
+ secret: provider.secret,
162
+ redirectUri,
163
+ code,
164
+ subdomain: provider.subdomain
165
+ });
166
+ const payload = oauth2$1.tokensToQueryPayload(provider, tokenResponse);
167
+ ctx.session.grant = {};
168
+ return redirectWithPayload(ctx, callbackUrl, payload);
169
+ };
170
+ const createOAuthConnectMiddleware = ()=>{
171
+ return async (ctx, next)=>{
172
+ const apiPrefix = strapi.config.get('api.rest.prefix');
173
+ const [requestPath] = ctx.request.url.split('?');
174
+ const parsed = parseConnectPath(requestPath, apiPrefix);
175
+ if (!parsed) {
176
+ return next();
177
+ }
178
+ if (!ctx.session) {
179
+ ctx.throw(400, 'OAuth connect requires session middleware');
180
+ }
181
+ const storedProviders = await strapi.store({
182
+ type: 'plugin',
183
+ name: 'users-permissions',
184
+ key: 'grant'
185
+ }).get();
186
+ const storedConfig = storedProviders?.[parsed.provider];
187
+ if (!storedConfig?.enabled) {
188
+ throw new errors.ApplicationError('This provider is disabled');
189
+ }
190
+ const { getService } = index.__require();
191
+ const redirectUri = getService('providers').buildRedirectUri(parsed.provider);
192
+ const callbackOverride = ctx.state.oauthConnect?.callback ?? ctx.session.grant?.dynamic?.callback;
193
+ const effectiveConfig = callbackOverride ? {
194
+ ...storedConfig,
195
+ callback: callbackOverride
196
+ } : storedConfig;
197
+ const provider = buildProviderConfig(parsed.provider, effectiveConfig, redirectUri);
198
+ if (!provider) {
199
+ throw new errors.ApplicationError('Unknown OAuth provider');
200
+ }
201
+ ctx.session.grant = ctx.session.grant || {};
202
+ if (!parsed.isCallback) {
203
+ if (provider.oauth === 1) {
204
+ return startOAuth1Flow(ctx, provider, parsed, redirectUri);
205
+ }
206
+ return startOAuth2Flow(ctx, provider, parsed, redirectUri);
207
+ }
208
+ const callbackUrl = effectiveConfig.callback;
209
+ if (!callbackUrl) {
210
+ throw new errors.ApplicationError('Provider callback URL is not configured');
211
+ }
212
+ try {
213
+ if (provider.oauth === 1) {
214
+ return await handleOAuth1Callback(ctx, provider, callbackUrl);
215
+ }
216
+ return await handleOAuth2Callback(ctx, provider, callbackUrl, redirectUri);
217
+ } catch (err) {
218
+ ctx.session.grant = {};
219
+ return redirectWithPayload(ctx, callbackUrl, {
220
+ error: 'oauth_error',
221
+ error_description: err.message
222
+ });
223
+ }
224
+ };
225
+ };
226
+ oauthConnect = {
227
+ createOAuthConnectMiddleware,
228
+ parseConnectPath,
229
+ buildProviderConfig,
230
+ redirectWithPayload
231
+ };
232
+ return oauthConnect;
233
+ }
234
+
235
+ exports.__require = requireOauthConnect;
236
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../server/utils/oauth-connect/index.js"],"sourcesContent":["'use strict';\n\nconst { errors } = require('@strapi/utils');\n\nconst builtinProviderEndpoints = require('./providers');\nconst oauth1 = require('./oauth1');\nconst oauth2 = require('./oauth2');\n\nconst CONNECT_PREFIX = '/connect';\n\nconst parseConnectPath = (requestPath, apiPrefix) => {\n const prefix = `${apiPrefix}${CONNECT_PREFIX}/`;\n if (!requestPath.startsWith(prefix)) {\n return null;\n }\n\n const remainder = requestPath.slice(prefix.length);\n const [provider, segment] = remainder.split('/').filter(Boolean);\n\n if (!provider) {\n return null;\n }\n\n return {\n provider,\n isCallback: segment === 'callback',\n };\n};\n\n/**\n * Resolve OAuth endpoint config from built-ins, falling back to store-defined\n * endpoints so custom providers registered via providers-registry still work.\n */\nconst buildProviderConfig = (providerName, storedConfig, redirectUri) => {\n const defaults = builtinProviderEndpoints[providerName];\n const endpoints = defaults || {\n oauth: storedConfig.oauth,\n authorize_url: storedConfig.authorize_url,\n access_url: storedConfig.access_url,\n request_url: storedConfig.request_url,\n scope_delimiter: storedConfig.scope_delimiter,\n token_endpoint_auth_method: storedConfig.token_endpoint_auth_method,\n };\n\n if (endpoints.oauth === 1) {\n if (!endpoints.request_url || !endpoints.authorize_url || !endpoints.access_url) {\n return null;\n }\n } else if (!endpoints.authorize_url || !endpoints.access_url) {\n return null;\n }\n\n return {\n name: providerName,\n ...endpoints,\n key: storedConfig.key,\n secret: storedConfig.secret,\n scope: storedConfig.scope,\n subdomain: storedConfig.subdomain,\n callback: storedConfig.callback,\n redirect_uri: redirectUri,\n };\n};\n\nconst redirectWithPayload = (ctx, callbackUrl, payload) => {\n const url = new URL(callbackUrl);\n const params = new URLSearchParams();\n\n Object.entries(payload).forEach(([key, value]) => {\n if (key === 'raw') {\n Object.entries(value).forEach(([rawKey, rawValue]) => {\n params.set(`raw[${rawKey}]`, String(rawValue));\n });\n return;\n }\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n });\n\n url.search = params.toString();\n ctx.redirect(url.toString());\n};\n\nconst preserveGrantDynamic = (ctx) => {\n const dynamic = ctx.session.grant?.dynamic;\n return dynamic ? { dynamic } : {};\n};\n\nconst startOAuth1Flow = async (ctx, provider, parsed, redirectUri) => {\n const requestToken = await oauth1.requestToken({\n requestUrl: provider.request_url,\n redirectUri,\n consumerKey: provider.key,\n clientCredential: provider.secret,\n });\n\n ctx.session.grant = {\n ...preserveGrantDynamic(ctx),\n provider: parsed.provider,\n request: requestToken,\n };\n\n const authorizeUrl = `${provider.authorize_url}?oauth_token=${encodeURIComponent(requestToken.oauth_token)}`;\n return ctx.redirect(authorizeUrl);\n};\n\nconst startOAuth2Flow = (ctx, provider, parsed, redirectUri) => {\n const state = oauth2.generateState();\n ctx.session.grant = {\n ...preserveGrantDynamic(ctx),\n provider: parsed.provider,\n state,\n };\n\n let authorizeUrl = oauth2.buildAuthorizeUrl(provider, {\n key: provider.key,\n redirectUri,\n scope: provider.scope,\n subdomain: provider.subdomain,\n });\n\n authorizeUrl += `&state=${encodeURIComponent(state)}`;\n return ctx.redirect(authorizeUrl);\n};\n\nconst handleOAuth1Callback = async (ctx, provider, callbackUrl) => {\n const session = ctx.session.grant || {};\n const { oauth_token: oauthToken, oauth_verifier: oauthVerifier } = ctx.query;\n const requestToken = session.request;\n\n if (!requestToken?.oauth_token || oauthToken !== requestToken.oauth_token) {\n throw new Error('OAuth1 token mismatch');\n }\n\n const tokenResponse = await oauth1.accessToken({\n accessUrl: provider.access_url,\n consumerKey: provider.key,\n clientCredential: provider.secret,\n oauthToken,\n oauthVerifier,\n oauthTokenCredential: requestToken.oauth_token_secret,\n });\n\n const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\n};\n\nconst handleOAuth2Callback = async (ctx, provider, callbackUrl, redirectUri) => {\n const session = ctx.session.grant || {};\n const { code, state: queryState, error, error_description: errorDescription } = ctx.query;\n\n if (error) {\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, {\n error,\n error_description: errorDescription,\n });\n }\n\n if (!code) {\n throw new Error('OAuth2 missing code parameter');\n }\n\n // Reject when session state is missing (not only on mismatch) to close login-CSRF.\n if (!session.state || queryState !== session.state) {\n throw new Error('OAuth2 state mismatch');\n }\n\n const tokenResponse = await oauth2.exchangeAuthorizationCode(provider, {\n key: provider.key,\n secret: provider.secret,\n redirectUri,\n code,\n subdomain: provider.subdomain,\n });\n\n const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, payload);\n};\n\nconst createOAuthConnectMiddleware = () => {\n return async (ctx, next) => {\n const apiPrefix = strapi.config.get('api.rest.prefix');\n const [requestPath] = ctx.request.url.split('?');\n const parsed = parseConnectPath(requestPath, apiPrefix);\n\n if (!parsed) {\n return next();\n }\n\n if (!ctx.session) {\n ctx.throw(400, 'OAuth connect requires session middleware');\n }\n\n const storedProviders = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })\n .get();\n\n const storedConfig = storedProviders?.[parsed.provider];\n if (!storedConfig?.enabled) {\n throw new errors.ApplicationError('This provider is disabled');\n }\n\n const { getService } = require('..');\n const redirectUri = getService('providers').buildRedirectUri(parsed.provider);\n\n const callbackOverride =\n ctx.state.oauthConnect?.callback ?? ctx.session.grant?.dynamic?.callback;\n const effectiveConfig = callbackOverride\n ? { ...storedConfig, callback: callbackOverride }\n : storedConfig;\n\n const provider = buildProviderConfig(parsed.provider, effectiveConfig, redirectUri);\n\n if (!provider) {\n throw new errors.ApplicationError('Unknown OAuth provider');\n }\n\n ctx.session.grant = ctx.session.grant || {};\n\n if (!parsed.isCallback) {\n if (provider.oauth === 1) {\n return startOAuth1Flow(ctx, provider, parsed, redirectUri);\n }\n return startOAuth2Flow(ctx, provider, parsed, redirectUri);\n }\n\n const callbackUrl = effectiveConfig.callback;\n if (!callbackUrl) {\n throw new errors.ApplicationError('Provider callback URL is not configured');\n }\n\n try {\n if (provider.oauth === 1) {\n return await handleOAuth1Callback(ctx, provider, callbackUrl);\n }\n return await handleOAuth2Callback(ctx, provider, callbackUrl, redirectUri);\n } catch (err) {\n ctx.session.grant = {};\n return redirectWithPayload(ctx, callbackUrl, {\n error: 'oauth_error',\n error_description: err.message,\n });\n }\n };\n};\n\nmodule.exports = {\n createOAuthConnectMiddleware,\n parseConnectPath,\n buildProviderConfig,\n redirectWithPayload,\n};\n"],"names":["errors","require$$0","builtinProviderEndpoints","require$$1","oauth1","require$$2","oauth2","require$$3","CONNECT_PREFIX","parseConnectPath","requestPath","apiPrefix","prefix","startsWith","remainder","slice","length","provider","segment","split","filter","Boolean","isCallback","buildProviderConfig","providerName","storedConfig","redirectUri","defaults","endpoints","oauth","authorize_url","access_url","request_url","scope_delimiter","token_endpoint_auth_method","name","key","secret","scope","subdomain","callback","redirect_uri","redirectWithPayload","ctx","callbackUrl","payload","url","URL","params","URLSearchParams","Object","entries","forEach","value","rawKey","rawValue","set","String","undefined","search","toString","redirect","preserveGrantDynamic","dynamic","session","grant","startOAuth1Flow","parsed","requestToken","requestUrl","consumerKey","clientCredential","request","authorizeUrl","encodeURIComponent","oauth_token","startOAuth2Flow","state","generateState","buildAuthorizeUrl","handleOAuth1Callback","oauthToken","oauth_verifier","oauthVerifier","query","Error","tokenResponse","accessToken","accessUrl","oauthTokenCredential","oauth_token_secret","tokensToQueryPayload","handleOAuth2Callback","code","queryState","error","error_description","errorDescription","exchangeAuthorizationCode","createOAuthConnectMiddleware","next","strapi","config","get","throw","storedProviders","store","type","enabled","ApplicationError","getService","require$$4","buildRedirectUri","callbackOverride","oauthConnect","effectiveConfig","err","message"],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ import require$$1 from '@strapi/utils';
2
+ import { __require as requireProviders } from './providers.mjs';
3
+ import { __require as requireOauth1 } from './oauth1.mjs';
4
+ import { __require as requireOauth2 } from './oauth2.mjs';
5
+ import { __require as requireUtils } from '../index.mjs';
6
+
7
+ var oauthConnect;
8
+ var hasRequiredOauthConnect;
9
+ function requireOauthConnect() {
10
+ if (hasRequiredOauthConnect) return oauthConnect;
11
+ hasRequiredOauthConnect = 1;
12
+ const { errors } = require$$1;
13
+ const builtinProviderEndpoints = requireProviders();
14
+ const oauth1 = requireOauth1();
15
+ const oauth2 = requireOauth2();
16
+ const CONNECT_PREFIX = '/connect';
17
+ const parseConnectPath = (requestPath, apiPrefix)=>{
18
+ const prefix = `${apiPrefix}${CONNECT_PREFIX}/`;
19
+ if (!requestPath.startsWith(prefix)) {
20
+ return null;
21
+ }
22
+ const remainder = requestPath.slice(prefix.length);
23
+ const [provider, segment] = remainder.split('/').filter(Boolean);
24
+ if (!provider) {
25
+ return null;
26
+ }
27
+ return {
28
+ provider,
29
+ isCallback: segment === 'callback'
30
+ };
31
+ };
32
+ /**
33
+ * Resolve OAuth endpoint config from built-ins, falling back to store-defined
34
+ * endpoints so custom providers registered via providers-registry still work.
35
+ */ const buildProviderConfig = (providerName, storedConfig, redirectUri)=>{
36
+ const defaults = builtinProviderEndpoints[providerName];
37
+ const endpoints = defaults || {
38
+ oauth: storedConfig.oauth,
39
+ authorize_url: storedConfig.authorize_url,
40
+ access_url: storedConfig.access_url,
41
+ request_url: storedConfig.request_url,
42
+ scope_delimiter: storedConfig.scope_delimiter,
43
+ token_endpoint_auth_method: storedConfig.token_endpoint_auth_method
44
+ };
45
+ if (endpoints.oauth === 1) {
46
+ if (!endpoints.request_url || !endpoints.authorize_url || !endpoints.access_url) {
47
+ return null;
48
+ }
49
+ } else if (!endpoints.authorize_url || !endpoints.access_url) {
50
+ return null;
51
+ }
52
+ return {
53
+ name: providerName,
54
+ ...endpoints,
55
+ key: storedConfig.key,
56
+ secret: storedConfig.secret,
57
+ scope: storedConfig.scope,
58
+ subdomain: storedConfig.subdomain,
59
+ callback: storedConfig.callback,
60
+ redirect_uri: redirectUri
61
+ };
62
+ };
63
+ const redirectWithPayload = (ctx, callbackUrl, payload)=>{
64
+ const url = new URL(callbackUrl);
65
+ const params = new URLSearchParams();
66
+ Object.entries(payload).forEach(([key, value])=>{
67
+ if (key === 'raw') {
68
+ Object.entries(value).forEach(([rawKey, rawValue])=>{
69
+ params.set(`raw[${rawKey}]`, String(rawValue));
70
+ });
71
+ return;
72
+ }
73
+ if (value !== undefined && value !== null) {
74
+ params.set(key, String(value));
75
+ }
76
+ });
77
+ url.search = params.toString();
78
+ ctx.redirect(url.toString());
79
+ };
80
+ const preserveGrantDynamic = (ctx)=>{
81
+ const dynamic = ctx.session.grant?.dynamic;
82
+ return dynamic ? {
83
+ dynamic
84
+ } : {};
85
+ };
86
+ const startOAuth1Flow = async (ctx, provider, parsed, redirectUri)=>{
87
+ const requestToken = await oauth1.requestToken({
88
+ requestUrl: provider.request_url,
89
+ redirectUri,
90
+ consumerKey: provider.key,
91
+ clientCredential: provider.secret
92
+ });
93
+ ctx.session.grant = {
94
+ ...preserveGrantDynamic(ctx),
95
+ provider: parsed.provider,
96
+ request: requestToken
97
+ };
98
+ const authorizeUrl = `${provider.authorize_url}?oauth_token=${encodeURIComponent(requestToken.oauth_token)}`;
99
+ return ctx.redirect(authorizeUrl);
100
+ };
101
+ const startOAuth2Flow = (ctx, provider, parsed, redirectUri)=>{
102
+ const state = oauth2.generateState();
103
+ ctx.session.grant = {
104
+ ...preserveGrantDynamic(ctx),
105
+ provider: parsed.provider,
106
+ state
107
+ };
108
+ let authorizeUrl = oauth2.buildAuthorizeUrl(provider, {
109
+ key: provider.key,
110
+ redirectUri,
111
+ scope: provider.scope,
112
+ subdomain: provider.subdomain
113
+ });
114
+ authorizeUrl += `&state=${encodeURIComponent(state)}`;
115
+ return ctx.redirect(authorizeUrl);
116
+ };
117
+ const handleOAuth1Callback = async (ctx, provider, callbackUrl)=>{
118
+ const session = ctx.session.grant || {};
119
+ const { oauth_token: oauthToken, oauth_verifier: oauthVerifier } = ctx.query;
120
+ const requestToken = session.request;
121
+ if (!requestToken?.oauth_token || oauthToken !== requestToken.oauth_token) {
122
+ throw new Error('OAuth1 token mismatch');
123
+ }
124
+ const tokenResponse = await oauth1.accessToken({
125
+ accessUrl: provider.access_url,
126
+ consumerKey: provider.key,
127
+ clientCredential: provider.secret,
128
+ oauthToken,
129
+ oauthVerifier,
130
+ oauthTokenCredential: requestToken.oauth_token_secret
131
+ });
132
+ const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);
133
+ ctx.session.grant = {};
134
+ return redirectWithPayload(ctx, callbackUrl, payload);
135
+ };
136
+ const handleOAuth2Callback = async (ctx, provider, callbackUrl, redirectUri)=>{
137
+ const session = ctx.session.grant || {};
138
+ const { code, state: queryState, error, error_description: errorDescription } = ctx.query;
139
+ if (error) {
140
+ ctx.session.grant = {};
141
+ return redirectWithPayload(ctx, callbackUrl, {
142
+ error,
143
+ error_description: errorDescription
144
+ });
145
+ }
146
+ if (!code) {
147
+ throw new Error('OAuth2 missing code parameter');
148
+ }
149
+ // Reject when session state is missing (not only on mismatch) to close login-CSRF.
150
+ if (!session.state || queryState !== session.state) {
151
+ throw new Error('OAuth2 state mismatch');
152
+ }
153
+ const tokenResponse = await oauth2.exchangeAuthorizationCode(provider, {
154
+ key: provider.key,
155
+ secret: provider.secret,
156
+ redirectUri,
157
+ code,
158
+ subdomain: provider.subdomain
159
+ });
160
+ const payload = oauth2.tokensToQueryPayload(provider, tokenResponse);
161
+ ctx.session.grant = {};
162
+ return redirectWithPayload(ctx, callbackUrl, payload);
163
+ };
164
+ const createOAuthConnectMiddleware = ()=>{
165
+ return async (ctx, next)=>{
166
+ const apiPrefix = strapi.config.get('api.rest.prefix');
167
+ const [requestPath] = ctx.request.url.split('?');
168
+ const parsed = parseConnectPath(requestPath, apiPrefix);
169
+ if (!parsed) {
170
+ return next();
171
+ }
172
+ if (!ctx.session) {
173
+ ctx.throw(400, 'OAuth connect requires session middleware');
174
+ }
175
+ const storedProviders = await strapi.store({
176
+ type: 'plugin',
177
+ name: 'users-permissions',
178
+ key: 'grant'
179
+ }).get();
180
+ const storedConfig = storedProviders?.[parsed.provider];
181
+ if (!storedConfig?.enabled) {
182
+ throw new errors.ApplicationError('This provider is disabled');
183
+ }
184
+ const { getService } = requireUtils();
185
+ const redirectUri = getService('providers').buildRedirectUri(parsed.provider);
186
+ const callbackOverride = ctx.state.oauthConnect?.callback ?? ctx.session.grant?.dynamic?.callback;
187
+ const effectiveConfig = callbackOverride ? {
188
+ ...storedConfig,
189
+ callback: callbackOverride
190
+ } : storedConfig;
191
+ const provider = buildProviderConfig(parsed.provider, effectiveConfig, redirectUri);
192
+ if (!provider) {
193
+ throw new errors.ApplicationError('Unknown OAuth provider');
194
+ }
195
+ ctx.session.grant = ctx.session.grant || {};
196
+ if (!parsed.isCallback) {
197
+ if (provider.oauth === 1) {
198
+ return startOAuth1Flow(ctx, provider, parsed, redirectUri);
199
+ }
200
+ return startOAuth2Flow(ctx, provider, parsed, redirectUri);
201
+ }
202
+ const callbackUrl = effectiveConfig.callback;
203
+ if (!callbackUrl) {
204
+ throw new errors.ApplicationError('Provider callback URL is not configured');
205
+ }
206
+ try {
207
+ if (provider.oauth === 1) {
208
+ return await handleOAuth1Callback(ctx, provider, callbackUrl);
209
+ }
210
+ return await handleOAuth2Callback(ctx, provider, callbackUrl, redirectUri);
211
+ } catch (err) {
212
+ ctx.session.grant = {};
213
+ return redirectWithPayload(ctx, callbackUrl, {
214
+ error: 'oauth_error',
215
+ error_description: err.message
216
+ });
217
+ }
218
+ };
219
+ };
220
+ oauthConnect = {
221
+ createOAuthConnectMiddleware,
222
+ parseConnectPath,
223
+ buildProviderConfig,
224
+ redirectWithPayload
225
+ };
226
+ return oauthConnect;
227
+ }
228
+
229
+ export { requireOauthConnect as __require };
230
+ //# sourceMappingURL=index.mjs.map