基于JSON Web Tokens的单点登录(SSO)或通行证(Passport)系统方案,jsontokens


首先简要介绍一下什么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/


相关内容

    暂无相关文章