{"version":3,"file":"index.mjs","sources":["../../../src/services/auth/index.ts"],"sourcesContent":["import assert from 'assert/strict';\nimport { has } from 'lodash/fp';\n\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport type { ParameterizedContext } from 'koa';\n\ninterface AuthenticationResponse {\n  authenticated?: boolean;\n  credentials?: unknown;\n  ability?: unknown;\n  error?: Error | null;\n}\n\ninterface AuthenticationInfo {\n  strategy: Strategy;\n  credentials: unknown;\n  ability: unknown;\n}\n\ninterface Strategy {\n  name: string;\n  authenticate: (ctx: ParameterizedContext) => Promise<AuthenticationResponse>;\n  verify?: (auth: AuthenticationInfo, config: Core.RouteConfig['auth']) => Promise<any>;\n}\n\ninterface Authentication {\n  register: (type: string, strategy: Strategy) => Authentication;\n  authenticate: Core.MiddlewareHandler;\n  verify: (auth: AuthenticationInfo, config?: Core.RouteConfig['auth']) => Promise<any>;\n}\n\nconst INVALID_STRATEGY_MSG =\n  'Invalid auth strategy. Expecting an object with properties {name: string, authenticate: function, verify: function}';\n\nconst validStrategy = (strategy: Strategy) => {\n  assert(has('authenticate', strategy), INVALID_STRATEGY_MSG);\n  assert(typeof strategy.authenticate === 'function', INVALID_STRATEGY_MSG);\n\n  if (has('verify', strategy)) {\n    assert(typeof strategy.verify === 'function', INVALID_STRATEGY_MSG);\n  }\n};\n\nconst createAuthentication = (): Authentication => {\n  const strategies: Record<string, Strategy[]> = {};\n\n  return {\n    register(type, strategy) {\n      validStrategy(strategy);\n\n      if (!strategies[type]) {\n        strategies[type] = [];\n      }\n\n      strategies[type].push(strategy);\n\n      return this;\n    },\n\n    async authenticate(ctx, next) {\n      const route: Core.Route = ctx.state.route;\n\n      // use route strategy\n      const config = route?.config?.auth;\n\n      if (config === false) {\n        return next();\n      }\n\n      const routeStrategies = route.info.type ? strategies[route.info.type] : [];\n      const configStrategies = (config?.strategies ?? routeStrategies ?? []) as Array<\n        string | Strategy\n      >;\n\n      const strategiesToUse: Strategy[] = configStrategies.reduce(\n        (acc, strategy: string | Strategy) => {\n          // Resolve by strategy name\n          if (typeof strategy === 'string') {\n            const routeStrategy = routeStrategies.find((rs) => rs.name === strategy);\n\n            if (routeStrategy) {\n              acc.push(routeStrategy);\n            }\n          }\n\n          // Use the given strategy as is\n          else if (typeof strategy === 'object') {\n            validStrategy(strategy);\n\n            acc.push(strategy);\n          }\n\n          return acc;\n        },\n        [] as Strategy[]\n      );\n\n      for (const strategy of strategiesToUse) {\n        const result = await strategy.authenticate(ctx);\n\n        const { authenticated = false, credentials, ability = null, error = null } = result || {};\n\n        if (error !== null) {\n          return ctx.unauthorized(error);\n        }\n\n        if (authenticated) {\n          ctx.state.isAuthenticated = true;\n          ctx.state.auth = {\n            strategy,\n            credentials,\n            ability,\n          };\n\n          return next();\n        }\n      }\n\n      return ctx.unauthorized('Missing or invalid credentials');\n    },\n\n    async verify(auth, config = {}) {\n      if (config === false) {\n        return;\n      }\n\n      if (!auth) {\n        throw new errors.UnauthorizedError();\n      }\n\n      if (typeof auth.strategy.verify === 'function') {\n        return auth.strategy.verify(auth, config);\n      }\n    },\n  };\n};\n\nexport default createAuthentication;\n"],"names":["INVALID_STRATEGY_MSG","validStrategy","strategy","assert","has","authenticate","verify","createAuthentication","strategies","register","type","push","ctx","next","route","state","config","auth","routeStrategies","info","configStrategies","strategiesToUse","reduce","acc","routeStrategy","find","rs","name","result","authenticated","credentials","ability","error","unauthorized","isAuthenticated","errors","UnauthorizedError"],"mappings":"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"}