2017-04-11 2 views
0

Y at-il un moyen d'utiliser l'authentification de base ou JWT à la même route dans le nœud, en utilisant Koajs?Comment utiliser l'authentification de base ou JWT sur le même itinéraire dans le nœud?

J'ai essayé 2: Approches

  1. Utilisation middleware Koa, appelez next() quand il a eu un jeton au porteur ou quand ont eu une authentification de base, créez un jeton et mis à ctx.headers, mais il didn 't fonctionne

  2. En utilisant getToken de koa-jwt, mais je ne peux pas retourner une promesse de charger des informations utilisateur afin de créer un jeton.

+0

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

+0

Oui, en fonction de l'en-tête Autorisation. –

+0

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

Répondre

0

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() 
}