文章插图
- 用户输入登录信息(或者调用 Token 接口,传入用户信息),发送到身份认证服务进行认证(身份认证服务可以和服务端在一起,也可以分离,看微服务拆分情况了) 。
- 身份验证服务验证登录信息是否正确,返回接口(一般接口中会包含用户基础信息、权限范围、有效时间等信息),客户端存储接口,可以存储在 Session 或者数据库中 。
- 用户将 Token 放在 HTTP 请求头中,发起相关 API 调用 。
- 被调用的微服务,验证 Token 权限 。
- 服务端返回相关资源和数据 。
- 服务端无状态:Token 机制在服务端不需要存储 session 信息,因为 Token 自身包含了所有用户的相关信息 。
- 性能较好,因为在验证 Token 时不用再去访问数据库或者远程服务进行权限校验,自然可以提升不少性能 。支持移动设备 。
- 支持跨程序调用,Cookie 是不允许垮域访问的,而 Token 则不存在这个问题 。
JWT 认证流程
- 客户端调用登录接口(或者获取 token 接口),传入用户名密码 。
- 服务端请求身份认证中心,确认用户名密码正确 。
- 服务端创建 JWT,返回给客户端 。
- 客户端拿到 JWT,进行存储(可以存储在缓存中,也可以存储在数据库中,如果是浏览器,可以存储在 Cookie 中)在后续请求中,在 HTTP 请求头中加上 JWT 。
- 服务端校验 JWT,校验通过后,返回相关资源和数据 。
header.payload.signature
1. 头部(Header)头部用于描述关于该 JWT 的最基本的信息,例如其类型以及签名所用的算法等 。这也可以被表示成一个 JSON 对象 。{"type" :"JWT","ALG" :"HS256"}
在头部指明了签名算法是 HS256 算法 。2. 载荷(payload)载荷就是存放有效信息的地方 。有效信息包含三个部分:
- 标准中注册的声明
- 公共的声明
- 私有的声明
- iss:JWT 签发者
- sub:JWT 所面向的用户
- aud:接收 JWT 的一方
- exp:JWT 的过期时间,这个过期时间必须要大于签发时间
- nbf:定义在什么时间之前,该 JWT 都是不可用的
- iat:JWT 的签发时间
- jti:JWT 的唯一身份标识,主要用来作为一次性 token, 从而回避重放攻击 。
- 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息 。但不建议添加敏感信息,因为该部分在客户端可解密 。
- 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为 base64 是对称解密的,意味着该部分信息可以归类为明文信息 。
推荐阅读
- 阿里架构师教你处理高并发:2种方法,解决Redis和Mysql一致性
- 上虞婚庆策划哪家服务好
- 潮安供电部门服务给力凤凰青麻园茶农制茶用电
- 七彩云南茶管家服务模式探析
- 大米轻微发霉怎么处理
- 来凤县农业服务中心助力大河茶农及时除虫
- 微信怎么运营?微信生态下运营怎么做?
- PHP服务器Apache与Nginx的对比分析
- 微信公众号吸粉8大策略,实战运营指南
- 个人服务器基础设施架构简介