为什么我的token总是报401 认证失败?

来源:7-8 用户列表接口实现&联调

慕粉3946981

2022-02-26

前端发送请求

  getUserList(params){ // 获取用户列表数据
    return request({
      url: '/users/list',
      method: 'get',
      data: params,
      mock: false,
    })
  },

后端处理请求

router.prefix('/users')
router.get('/list', async ctx => {
  console.log('请求数据库列表数据');
})

日志处理中间件

// 处理日志信息
app.use(async (ctx, next) => {
  let obj = ctx.request.body || ctx.request.query
  obj.method = ctx.request.method
  obj.url = ctx.request.url
  obj.userAgent = ctx.request.headers['user-agent']
  log4js.info(JSON.stringify(obj))
  console.log('中间件中查看token', ctx.request.headers.authorization); // 可以打印出 token
  await next().catch(err => {
    if (err.status == 401) {
      console.log('捕获到了 401 token 认证失败')
      ctx.status = 200
      ctx.body = utils.fail('Token认证失败', utils.CODE.AUTH_ERROR) // 处理token失败
    } else {
      throw err
    }
  })
})
  • 在日志中间件中可以通过 ctx.request.headers.authorization打印出 token
  • 但执行了 await next().catch(err => {}这个 catch 中的回调函数,我输出了 err 打印如下错误
UnauthorizedError: Bad Authorization header format. Format is "Authorization: Bearer <token>"

我不知道该怎么排查及解决这个错误,我明明已经从前端的请求头中拿到了 token 为什么验证失败了?

写回答

2回答

河畔一角

2022-03-01

主要是因为我们后端用的插件会拦截前端发送过来的请求头,必须包含Bearer

0
0

慕粉3946981

提问者

2022-02-26

搞定了,前端axios拦截这块关于token 必须这样设置

headers.authorization = `Bearer ${token}`


0
0

Vue3+ElementPlus+Koa2 全栈开发后台系统

从前端晋级到全栈,让你的未来发展有更多可能

1069 学习 · 580 问题

查看课程