返回介绍

1.5 验证用户身份

发布于 2024-01-20 01:12:18 字数 1866 浏览 0 评论 0 收藏 0

前面提到,登录成功后,客户端需要将 token 保存下来,然后在接下来的请求中,都需要带上 token。通常会将 token 放在 HTTP 请求头中,格式通常为:

Authorization: Bearer token

这时假设我们要实现一个新的接口,获取当前登录用户信息,该接口也只能登录后才能使用。那么代码实现就是下面这样:

// 定义 /user 路由,获取当前登录的用户信息
app.get('/user', (req, res) => {
  // 从 HTTP 请求头中获取 token 信息
  const token = req
  .headers
  .authorization
  .split(' ')
  .pop();
  try {
  // 验证 token 并解析出用户信息
  const user = jwt.verify(token, SECRET);
  return res.json({
  success: true,
  data: user
  })
  } catch (error) {
  return res.json({
  success: false,
  data: '身份认证失败'
  })
  }
});

首先我们定义了 /user 路由,然后通过请求头拿到 token 信息,最后使用 jwt.verify() 对 token 进行解密,并从中得到用户信息,如果用户传入的 token 无法解析,则说明用户身份异常。

同样,我们可以将代码部署到函数计算并进行测试:

curl https://1457216987974698.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/serverless/auth-app/user \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiamFjayIsImFnZSI6IjE4IiwicGFzc3dvcmQiOiIqKioqKioiLCJpYXQiOjE2MTA5MDY5MTJ9.qzNZarWbpDUA8-SO6nLd4ffEUR1IVOWKGXiocHV7MkU"
{"success":true,"data":{"name":"jack","age":"18","password":"******","iat":1610905944}}
# 使用错误的 token 进行身份认证
$ curl https://1457216987974698.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/serverless/auth-app/user -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiamFjayIsImFnZSI6IjE4IiwicGFzc3dvcmQiOiIqKioqKioiLCJpYXQiOjE2MTA5MDY5MTJ9.qzNZarWbpDUA8-SO6nLd4ffEUR1IVOWKGXiocHV7Mk"
{"success":false,"data":"身份认证失败"}

到此为止,一个 Serverless 架构的登录注册功能就完成了,我们也基于 JWT 实现了 Serverless 中的身份认证。

强调这样几点:

  • Cookie-Session 的身份认证方式,是在服务端存储 Session 信息,客户端(浏览器)通过 cookie 存储 Session ID;
  • JWT 的身份认证方式,是在服务端根据用户信息生成 token,客户端保存 token;
  • Cookie-Session 的认证方案通常是有状态的,对于分布式、无状态的应用,需要将 Session 保存在共享存储中;
  • JWT 的认证方式通常是无状态的,所以比较适合 Serverless 应用。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文