我最近在自己写一个全站的小项目,对于登陆过程中的最佳实践有很多疑问:(以node react为例)
1.后端应该用什么库来生成access token, refresh token
2.返回给前段的session除了token还应该包括哪些明文信息?
3.access token/ refresh token是不是包含相同的信息,只是到期时间长短不同?
4.为什么我的token到期了,前端发送的请求还是能成功,后端是否要手动校验token到期时间,库不能自己自动验证并报错?
5.前段的axios interceptor应该如何优雅的设置来拦截并报错?
以上,求大佬帮忙推荐或者视频,或者文章教程,让我能够学习这套东西的最佳实践,非常感谢!!
现在主流的需要涉及这两个 Token 的的认证,主要是指 JWT(Json Web Token) ,如果你想自己研究,你可以查看官网对其的定义,自己实现一个自己的 JWT,如果你只是想使用,那直接去 NPM 搜索 JWT 随找一个就可以,如果你后端使用 Node 的一些 Web 框架,还可以搜为这些框架适配过的,加上一些关键字,比如
koa
、express
。虽然在广义上,Session 是指会话,在狭义上,Session 通常是指 Cookie + SessionID 的组合,这里的 SessionID 就可以看作是一个 Token,大部分时候,因为 SessionID 存在 Cookie 的时候,没有设置有效期,会在浏览器窗口关闭时自动丢弃掉 SessionID ,用户下次访问上没有 SessionID 也就定位不到具体的信息了。服务端对于 SessionID 的保存一般也会设置时效,大部分时候会自动刷新,其中保存的信息都是只服务端可见的,客户端只知道一个 SessionID。
对于现在的 JWT 而言,你不应该存放过多的明文信息在他的 Payload 部分,因为这部分信息将会是 Token 的一部分,其属于明文信息,且不利于更新,一般来说,你只需要存储一个用户的唯一标识,用来在服务端识别是哪一个用户即可。
这两者并不一样,
Access Token
是用来作为用户认证使用,Refresh Token
是用来获取新的Access Token
的。一般
Refresh Token
的有效期会更长。这取决于你所使用的库的实现,一般来说会有异常抛出,但是你也需要自己捕获异常进行返回,你也可以自己在中间件(Middleware) 里面进行验证,并且进行相应的处理,如:返回一个 401 响应。
判断对应的响应代码,做出对应的操作即可,比如,你可以选择重定向到登录页。
需要补充一下,标准的 JWT 是没有 Token 吊销的,即 Token 在到期前始终有效,比较常见的功能就是 “退出登录”,如果你需要 “真吊销” 就还要自己实现一下,不过大部分社区的实现都是有实现这个的。
而且,如果按照前文说的,你只存了用户ID,那你还需要考虑一个问题,就是用户修改密码后,旧 Token 还是会有效的问题。
这种情况下,你可能还需要在用户信息里面保存一下当前密码的哈希值,然后验证 Token 后再检查密码的哈希是否对应。