单点登录系统用 张漫画就解释.docx

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单点登录系统用 8 张漫画就解释 一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。 载荷(Payload) 我们先将上面的添加好友的操作描述成一个JSON对象。其中添加了一些其他的信息,挂念今后收到这个JWT的服务器理解这个JWT。 { ????"iss":?"John?Wu?JWT", ????"iat":?1441593502, ????"exp":?1441594722, ????"aud":?"", ????"sub":?"jrocket@", ????"from_user":?"B", ????"target_user":?"A" } 这里面的前五个字段都是由JWT的标准所定义的。 iss: 该JWT的签发者 sub: 该JWT所面对的用户 aud: 接收该JWT的一方 exp(expires): 什么时候过期,这里是一个Unix时间戳 iat(issued at): 在什么时候签发的 这些定义都可以在标准中找到。 将上面的JSON对象进行[base64编码]可以得到下面的字符串。这个字符串我们将它称作JWT的Payload(载荷)。 eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdW 假如你使用Node.js,可以用Node.js的包base64url来得到这个字符串。 小学问:Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一种加密过程。 var?base64url?=?require('base64url') var?header?=?{ ????"from_user":?"B", ????"target_user":?"A" } console.log(base64url(JSON.stringify(header))) //?输出:eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9 头部(Header) JWT还需要一个头部,头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。 { ??"typ":?"JWT", ??"alg":?"HS256" } 在这里,我们说明白这是一个JWT,并且我们所用的签名算法(后面会提到)是HS256算法。 对它也要进行Base64编码,之后的字符串就成了JWT的Header(头部)。 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 签名(签名) 将上面的两个编码后的字符串都用句号.连接在一起(头部在前),就构成了 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0 这一部分的过程在node-jws的源码中有体现 最终,我们将上面拼接完的字符串用HS256算法进行加密。在加密的时候,我们还需要供应一个密钥(secret)。假如我们用mystar作为密钥的话,那么就可以得到我们加密后的内容 rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM 这一部分又叫做签名。 最终将这一部分签名也拼接在被签名的字符串后面,我们就得到了完整的JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn 于是,我们就可以将邮件中的URL改成 /make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJm 这样就可以平安地完成添加好友的操作了! 且慢,我们肯定会有一些问题: 签名的目的是什么? Base64是一种编码,是可逆的,那么我的信息不就被暴露了吗? 让我逐一为你说明。 签名的目的 最终一步签名的过程,实际上是对头部以及载荷内容进行签名。一般而言,加密算法对于不同的输入产生的输出总是不一样的。对于两个不同的输入,产生同样的输出的概率极其地小(有可能比我成世界首富的概率还小)。所以,我们就把“不一样的输入产生不一样的输出”当做必定大事来看待吧。 所以,假如有人对头部以及载荷的内容解码之后进行修改,再进行编码的话,那么新的头部和载荷

文档评论(0)

bob157641554 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档