一个单点登录的实现我们需要知道什么?
我们首先应该知道的是什么是单点登录,单点登录是如何实现的,使用了什么技术,技术的选型、优缺点,应用和实现的步骤过程中的难点有哪些怎么解决的等。
技术的话:token与JWT的区别、JWT和redis的区别应用、是否使用到了消息中间件有的话kafka和其他MQ的比较、实现过程中的相关协议等。从其中总结对这些问题点进行总结。
一、结论:
最直观的:token需要查库验证token 是否有效,而JWT不用查库或者少查库,直接在服务端进行校验,并且不用查库。因为用户的信息及加密信息在第二部分payload和第三部分签证中已经生成,只要在服务端进行校验就行,并且校验也是JWT自己实现的。
二、TOKEN
概念:令牌, 是访问资源的凭证。
Token的认证流程:
1. 用户输入用户名和密码,发送给服务器。
2. 服务器验证用户名和密码,正确的话就返回一个签名过的token(token 可以认为就是个长长的字符串),浏览器客户端拿到这个token。
3. 后续每次请求中,浏览器会把token作为http header发送给服务器,服务器验证签名是否有效,如果有效那么认证就成功,可以返回客户端需要的数据。
特点:
这种方式的特点就是客户端的token中自己保留有大量信息,服务器没有存储这些信息。
三、JWT
概念:
JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
组成:
WT包含三个部分:Header头部,Payload负载和Signature签名。由三部分生成token,三部分之间用“.”号做分割。列如 :eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. Header 在Header中通常包含了两部分:type:代表token的类型,这里使用的是JWT类型。alg:使用的Hash算法,例如HMAC SHA256或RSA.
{ "alg": "HS256", "typ": "JWT" } 这会被经过base64Url编码形成第一部分
2. Payload token的第二个部分是荷载信息,它包含一些声明Claim(实体的描述,通常是一个User信息,还包括一些其他的元数据) 声明分三类: 1)Reserved Claims,这是一套预定义的声明,并不是必须的,这是一套易于使用、操作性强的声明。包括:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等 2)Plubic Claims, 3)Private Claims,交换信息的双方自定义的声明 { "sub": "1234567890", "name": "John Doe", "admin": true } 同样经过Base64Url编码后形成第二部分
3. signature 使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密。例如使用的是HMAC SHA256算法,大致流程类似于: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 这个signature字段被用来确认JWT信息的发送者是谁,并保证信息没有被修改 。
四、举例:
现在有一个接口/viptest只能是vip用户访问,我们看看服务端如何根据Token判断用户是否有效。
普通token版:
1. 查库判断是否过期
2. 查库判断时候是VIP
JWT 版本:
假如payload部分如下:
{
"exp": 1518624000,
"isVip": true,
"uid":1
}
1. 解析JWT
2. 判断签名是否正确,根据生成签名时使用的密钥和加密算法,只要这一步过了就说明是payload是可信的
3. 判断JWT token是否过期,根据exp,判断是否是VIP,根据isVip
JWT版是没有查库的,他所需要的基础信息可以直接放到JWT里,服务端只要判断签名是否正确就可以判断出该用户是否可以访问该接口,当然JWT里的内容也不是无限多的,其他更多的信息我们就可以通过id去查数据库。