如何在节点中使用基本身份验证或JWT到同一路由?

时间:2017-04-11 22:39:03

标签: node.js jwt basic-authentication koa

使用Koajs有没有办法在Node中使用基本身份验证或JWT到同一路由?

我尝试了两种方法:

  1. 使用Koa中间件,在拥有Bearer令牌或有基本身份验证时调用next(),创建令牌并设置为ctx.headers,但它没有工作< / p>

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

1 个答案:

答案 0 :(得分:0)

我发现了错误。致电await

时,我忘了使用next()

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