#登录鉴权

#Session 存服务器 有状态

  • 用户登录,服务器校验账号密码,获得用户信息
  • 服务器把用户信息存为 Session,并生成一个 sessionId,配置到 set-cookie 响应头 上
  • 此后浏览器再请求业务接口,通过 cookie 携带 sessionId
  • 服务器查询 Session 校验 sessionId,进行正常业务接口处理

#Session 痛点

  • Session 需要存储,推荐是 Redis 存储
  • 分布式需要解决

#Token 存浏览器 无状态

解决 Session 的痛点,将用户信息存在浏览器 Cookie 或者 LocalStorage

对比来看,Token 就是 Session 与 sessionId 编码在一起,存放从服务器转移到浏览器

  • 用户登录,服务器校验账号密码,获得用户信息
  • 服务器把用户信息、过期时间等编码成 token,配置到 set-cookie 响应头上
  • 此后用户请求业务接口,通过 cookie 携带 token
  • 服务器校验 token 有效性,进行正常业务接口处理

#JWT

Token 的关键点在于编码防篡改,而不是防冒充,冒充靠的是短信验证码等方式

需要通过签名来防止篡改,只有服务器知道签名

成熟的规范就是 JWT

可以通过 JWT 库生成

node-jsonwebtoken

内容包含:

  • Header
  • Payload
  • Signature

#refresh Token

鉴权的 Token 叫 access Token

越是权限敏感的业务,我们越希望 access token 有效期足够短,以避免被盗用。

再来一个 refresh Token 用来获取 access token,有效期可以长一点,通过独立服务和严格的请求方式增加安全性,而每次访问也刷新这个 Token 有效期

比如 access Token 是 1 天,refresh Token 是 7 天

连续每天登录就每天刷新 refresh Token,可以一直登录

7 天后再登录就需要重新登陆

#refresh Token 更新内容

无感刷新我感觉是 c 端很必备的功能,用户体验很棒

实现方式就是双 token

正常登录的叫登录 token,刷新用的叫刷新 token 吧

没有无感刷新时,登录校验失败时用户就需要重新登录

有无感刷新时,登录校验失败先拦截结果,如果没有进行无感刷新,则尝试访问一次无感刷新接口,否则正常提示用户重新登陆

#Token 痛点

无法中途改变权限或者取消授权

#单点登录 SSO

如果主域名相同,直接利用 Cookie 可以跨域的特点,将 Domain 配置为主域名

主域名不同的登录就需要独立的认证服务

#单点登录 更新内容

首先区分一下域名级别,顶级域名一般是.com 这种,一级就是 baidu.com 这种,以此类推

三级域名例如https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

一级域名可以读写二级域名的 cookie,二级三级等等可以读写父级域名的 cookie

可以通过域名进行基础的单点登录,但是有三个问题

  • 域名难以区分业务
  • cookie 的安全性问题
  • 后端服务需要同语言

#Oauth

邮箱登录 微信扫码登录

#参考资料

掘金