JWT实现原理
用户登录,上传用户名和密码的时候用RSA加密,不然会有抓包泄露的风险,服务端拿到之后先解密,然后将密码使用盐值MD5加密,将用户名,加密的密码,盐值存入数据库
生成Token值 ——- 将用户的用户名放在内容中
{
“alg”: “HS256”,
“typ”: “JWT”
}使用BASE64URL加密
{
“sub”:”Token”,
“exp”:”当前时间戳+30天”,
“nbf”:”当前时间戳”
“userName”:”username”
}使用BASE64URL加密
先指定一个密钥,然后用上面指定的加密算法加密以下数据
HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
secret)
得到签名之后将三个部分用”.”拼接返回给用户
用户拿到token之后在接口请求的时候带上token,如果不带那么提示接口失败。客户端提交了token之后,服务端根据拿到的token验证签名(只要HMACSHA256加密使用的secret没有泄露,根据算法的特性,token值不会有篡改的可能),如果一致那么解密token的第二部分获取到用户名,过期时间,如果一致并且未过期,那么根据token中的用户名来查找到对应的用户,如果过期提示token已失效。如果有另一个设备登录,那么token值会不同,也就是会登录失效,需要重新登录。
这里HMACSHA256也可以改成加盐MD5,或者AES加密。另外如果不想token中的用户名之类的信息暴露出去的话,可以考虑使用RSA加密或者AES加密再将原始token加密一次,这样服务端重新拿到token的时候可以经过解密再验证