Node.js 如何对节点中的同一路由使用基本身份验证或JWT?

Node.js 如何对节点中的同一路由使用基本身份验证或JWT?,node.js,jwt,basic-authentication,koa,Node.js,Jwt,Basic Authentication,Koa,是否有任何方法可以使用基本身份验证或JWT来使用Koajs对节点中的同一路由进行验证 我尝试了两种方法: LI> < P>使用膝关节炎中间件、调用 NEXT()/>代码>当它有承载令牌或有基本身份验证时,创建令牌并设置为CTX.Head,但它不工作 使用来自koa jwt的getToken,但我不能返回加载用户信息以创建令牌的承诺 我发现了错误。调用next() 谢谢你的时间 以下是工作代码: route.js 'use strict' import Koa from 'koa' impor

是否有任何方法可以使用基本身份验证或JWT来使用Koajs对节点中的同一路由进行验证

我尝试了两种方法:

<> LI> < P>使用膝关节炎中间件、调用<代码> NEXT()/>代码>当它有承载令牌或有基本身份验证时,创建令牌并设置为CTX.Head,但它不工作

  • 使用来自koa jwt的getToken,但我不能返回加载用户信息以创建令牌的承诺


  • 我发现了错误。调用
    next()

    谢谢你的时间

    以下是工作代码:

    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()))
    
    '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()
    }
    
    basic auth.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()))
    
    '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()
    }
    

    您是否试图在运行时在单个路由中在jwt或基本身份验证之间切换身份验证策略?这是你的问题吗?是的,取决于授权标题。你能展示一些你所做的示例代码吗?我将创建一个checkAuth路由中间件,并测试令牌是有效的jwt还是有效的base64字符串,然后采取相应的行动。