首先简要介绍一下什么JWT(JSON Web Token)。
JWT是一种开放的,工业标准的规范,用于在两个应用之间安全地传输信息。
JWT由3个部分组成,分别是头部、载荷、签名。
头部部分
{
"alg": "HS256",
"typ": "JWT"
}
alg描述的是签名算法。
载荷部分
{
"iss": "发行者",
"sub": 主题",
"aud": “观众”,
"exp":"过期时间",
"iat":"签发时间"
以下可以添加自定义数据
"userid":"11111",
“realname":"真实姓名",
"email":"",
}
Base64算法是可逆的,不可以在载荷部分保存用户密码等敏感信息。如果业务需要,也可以采用对称密钥加密。
签名部分
HMACSHA256(Base64(Header) + "." + Base64(Payload), secret)
签名的目的是用来验证头部和载荷是否被非法篡改。
验签过程描述:读取Header部分并Base64解码,得到签名算法。根据以上方法算出签名,如果签名信息不一致,说明是非法的。
JWT的基本原理介绍完毕,接下来描述如何基于JWT设计单点登录系统。
假设现在有系统www.example.com, passport.example.com.
用户首先访问passport.example.com,在表单输入用户名和密码,通过HTTPS Post提交请求到后端认证服务,后端认证服务查询用户数据库完成用户认证。
用户 认证成功后,假设只在Payload部分保存userid,生成Token ( Base64(header) + "." + Base64(payload) + "." + Base64(sign) ),作为cookie返回给客户端,
cookie保存在根域example.com。
用户访问www.example.com,会自动带上Token cookie。
后端服务需要完成Token的验签,过期时间判断等操作。验证成功就可以读取Payload信息完成接下来的业务功能。
参考资料
https://jwt.io/