import { RequestHandler, Request, Response } from 'express' import { HookContext } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' import { authenticate as AuthenticateHook } from '@feathersjs/authentication' import { Application } from './declarations' const debug = createDebug('@feathersjs/express/authentication') const toHandler = ( func: (req: Request, res: Response, next: () => void) => Promise ): RequestHandler => { return (req, res, next) => func(req, res, next).catch((error) => next(error)) } export type AuthenticationSettings = { service?: string strategies?: string[] } export function parseAuthentication(settings: AuthenticationSettings = {}): RequestHandler { return toHandler(async (req, res, next) => { const app = req.app as any as Application const service = app.defaultAuthentication?.(settings.service) if (!service) { return next() } const config = service.configuration const authStrategies = settings.strategies || config.parseStrategies || config.authStrategies || [] if (authStrategies.length === 0) { debug('No `authStrategies` or `parseStrategies` found in authentication configuration') return next() } const authentication = await service.parse(req, res, ...authStrategies) if (authentication) { debug('Parsed authentication from HTTP header', authentication) req.feathers = { ...req.feathers, authentication } } return next() }) } export function authenticate( settings: string | AuthenticationSettings, ...strategies: string[] ): RequestHandler { const hook = AuthenticateHook(settings, ...strategies) return toHandler(async (req, _res, next) => { const app = req.app as any as Application const params = req.feathers const context = { app, params } as any as HookContext await hook(context) req.feathers = context.params return next() }) }