如何将基本身份验证或 JWT 用于 Node 中的同一路由?
How can I use Basic authentication or JWT to the same route in Node?
有没有什么方法可以使用 Koajs 在 Node 中使用基本身份验证或 JWT 到相同的路由?
我尝试了两种方法:
使用Koa中间件,调用next()
当它有Bearer token或者当有Basic authentication时,创建一个token并设置为ctx.headers,但它没有没用
使用 koa-jwt 的 getToken,但我无法return承诺加载用户信息以创建令牌。
我发现了错误。我在调用 next()
时忘记使用 await
感谢@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()
}
有没有什么方法可以使用 Koajs 在 Node 中使用基本身份验证或 JWT 到相同的路由?
我尝试了两种方法:
使用Koa中间件,调用
next()
当它有Bearer token或者当有Basic authentication时,创建一个token并设置为ctx.headers,但它没有没用使用 koa-jwt 的 getToken,但我无法return承诺加载用户信息以创建令牌。
我发现了错误。我在调用 next()
await
感谢@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()
}