J'ai trouvé l'erreur. J'ai oublié d'utiliser await
lorsque l'appel next()
Thx @shanks pour votre temps!
Voici le code de travail:
route.js
'use strict'
import Koa from 'koa'
import mount from 'koa-mount'
import jwt from 'koa-jwt'
import basicAuth from './basic-auth'
import HomeRouter from './home/router'
import projectRouter from './v1/project/router'
export default new Koa().
use(mount('/', HomeRouter.routes())).
use(basicAuth).
use(jwt({ secret: process.env.JWT_SECRET })).
use(mount('/v1/projects', projectRouter.routes()))
base-auth.js
'use strict'
import { chain } from 'lodash'
import jwt from 'jsonwebtoken'
import User from 'app/v1/user/model'
function _createAccessToken(user) {
return jwt.sign({
id: user.id,
email: user.email
}, process.env.JWT_SECRET)
}
export default async function basicAuth(ctx, next) {
const header = ctx.headers.authorization
if (/basic/i.test(header)) {
const password = chain(header).
split(' ').
last().
value()
const user = await User.findOne({
where: {
apiPassword: Buffer.from(password, 'base64').toString()
}
})
if (!user) return ctx.throw(401)
const token = _createAccessToken(user)
ctx.headers.authorization = `Bearer ${token}`
}
await next()
}
essayez-vous de changer votre stratégie auth entre JWT ou authentification de base lors de l'exécution sur une seule route? est-ce votre question? – shanks
Oui, en fonction de l'en-tête Autorisation. –
Pouvez-vous montrer un exemple de code de ce que vous avez fait? Je voudrais créer un middleware de route checkAuth et tester si le jeton est un jwt valide ou une chaîne base64 valide, puis agir en conséquence. – shanks