2017-04-11 9 views
0

是否有任何方法使用基本认证或JWT到Node中的相同路由,使用Koajs?如何在Node中将基本身份验证或JWT用于相同的路由?

我试过2个技术途径:

  1. 使用兴亚中间件,称之为next()当它有一个承载令牌或时有一个基本身份验证,创建令牌,并设置为ctx.headers,但它没不工作

  2. 使用koa-jwt中的getToken,但我无法返回承诺以加载用户信息以创建令牌。

+0

你想切换JWT之间或您的身份验证策略运行时在单个路由中进行基本身份验证?这是你的问题吗? – shanks

+0

是的,取决于授权标头。 –

+0

你可以展示一些你已经完成的示例代码吗?我会创建一个checkAuth路由中间件,并测试令牌是否是有效的jwt或有效的base64字符串,然后相应地执行。 – shanks

回答

0

我发现了错误。当忘记使用awaitnext()

Thx @shanks为您的时间!

这里是工作代码:

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

基本-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() 
} 
相关问题