说明

一. 基于Token的用户验证

基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

验证流程:

  • 用户提交用户名、密码到服务器后台
  • 后台验证用户信息的正确性
  • 若用户验证通过,服务器端生成Token,返回到客户端
  • 客户端保存Token,再下一次请求资源时,附带上Token信息
  • 服务器端(一般在拦截器中进行拦截)验证Token是否由服务器签发的
  • 若Token验证通过,则返回需要的资源

二. 加密方式:JWT

JWT是一种通用的规范,它定义了Token的生成方式。

2.1 JWT的格式:由“.”符号拼接,共有三部分信息组成。

JWT:{
    header:{ // 头部
        alg:'HS256' // 算法声明
    },
    payload:{ // 数据
        exp:'1532180906', // 过期时间
        userId:'xxxx',
        iss:'xxx'
    },
    signature:'' // 签名
}

2.2 Header(头部):承载两部分信息

  • 声明类型,这里是jwt;
  • 声明加密的算法 通常直接使用 HMAC SHA256

2.3 Payload(数据):包含了一些通用的信息,以及用户自定义的信息。(不强制全部使用)

  • ss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

2.4 Signature(签证):由算法进行加密,它由三部分信息组成

  • Header:base64编码后的字符串
  • Payload:base64编码后的字符串
  • Secret:秘钥 或者叫 盐,验证Token有效性的唯一标识
生成方式:
将编码后的Header、Payload由“.”符号进行拼接,将拼接后的字符串使用加密算法进行加密

2.5 Token的生成方式

// 将编码后的Header、编码后的Payload以及Signature由符号“.”进行拼接,形成最终的Token。
{base64Encode(Header)}.{base64Encode(Payload)}.{Signature}

参考地址:

// 说明参考地址
https://blog.csdn.net/swl979623074/article/details/81150184
// 实现参考地址
https://blog.csdn.net/kkkun_joe/article/details/81878231
https://blog.csdn.net/lvxiucai/article/details/114277992