如何在AdonisJS 5中为API接口添加Bearer Token授权验证?
AdonisJS 5 实现 Bearer Token 接口授权校验方案
AdonisJS 5 原生自带完整的 Bearer Token 授权校验能力,无需额外引入第三方依赖即可落地,具体实现步骤如下:
1. 初始化官方认证模块
首先在项目根目录执行命令,配置官方Auth模块:node ace configure @adonisjs/auth
执行命令时按照交互提示选择对应配置:
- 认证守卫类型选择
API tokens - 关联用户模型选择项目中使用的用户模型(默认选
User模型即可) - Token存储方式:本地开发可选内存存储,生产环境必须选数据库存储
命令执行完成后,会自动生成以下文件/配置:
config/auth.ts认证模块配置文件,默认守卫已设置为api token模式- User模型自动追加token关联关系
- 生成
api_tokens表的数据库迁移文件(选数据库存储时生成)
如果选择了数据库存储token,执行迁移命令生成token存储表:node ace migration:run
生成的api_tokens表会自动记录token值、关联用户ID、过期时间、吊销状态等信息。
2. 实现登录签发Token逻辑
在用户登录接口中,账号密码校验通过后,调用auth模块内置方法签发有效token即可,示例代码:
// app/Controllers/Http/AuthController.ts import Hash from '@ioc:Adonis/Core/Hash' import User from 'App/Models/User' export default class AuthController { public async login({ request, auth, response }) { const { email, password } = request.only(['email', 'password']) // 查询用户并校验密码 const user = await User.findBy('email', email) if (!user || !(await Hash.verify(user.password, password))) { return response.status(401).send({ message: '账号或密码错误' }) } // 签发有效期7天的Bearer Token const tokenResult = await auth.use('api').generate(user, { expiresIn: '7 days' }) // 返回给前端的token值,前端请求时拼接在Bearer 后即可 return { userInfo: { id: user.id, email: user.email }, accessToken: tokenResult.token } } }
3. 给需要授权的接口挂载校验中间件
Auth模块配置完成后会自动注册全局可用的auth中间件,直接在路由上挂载即可开启Bearer Token校验,支持两种挂载方式:
- 单个路由挂载:
// start/routes.ts import Route from '@ioc:Adonis/Core/Route' // 该接口必须携带有效Bearer Token才能访问 Route.get('user/profile', 'UserController.getProfile').middleware('auth')
- 路由组批量挂载:
// start/routes.ts Route.group(() => { Route.get('user/profile', 'UserController.getProfile') Route.put('user/info', 'UserController.updateInfo') Route.post('upload', 'FileController.upload') // 组内所有接口统一开启Bearer Token校验 }).middleware('auth')
挂载
auth中间件的接口,会自动解析请求头中的Authorization字段,校验Bearer前缀后的token是否存在、是否有效、是否过期,校验不通过会直接返回401未授权响应;校验通过后,控制器中可直接通过ctx.auth.user获取当前登录用户信息,无需额外查询。
4. 自定义扩展场景(可选)
如果需要对接外部签发的Bearer Token(比如统一身份平台签发的JWT),不需要使用Adonis自带的token签发能力,可以自定义认证守卫:
- 在
contracts/auth.ts中声明自定义守卫的类型 - 新建守卫类实现框架要求的
GuardContract接口,重写authenticate方法,自行实现从请求头提取token、验签、查询对应用户的逻辑 - 在
config/auth.ts中将默认守卫替换为自定义守卫即可,路由上的auth中间件无需修改。
内容的提问来源于stack exchange,提问作者Lehan Musthafa
相关产品推荐
相关产品推荐

