JSON Web Token(JWT)是一个很是轻巧的类型。这个类型答允我们利用JWT在用户和处事器之间通报安详靠得住的信息。
让我们来假想一下一个场景。在A用户存眷了B用户的时候,系统发邮件给B用户,而且附有一个链接“点此存眷A用户”。链接的地点可以是这样的
https://your.awesome-app.com/make-friend/?from_user=B&target_user=A
上面的URL主要通过URL来描写这个虽然这样做有一个漏洞,那就是要求用户B用户是必然要先登录的。可不行以简化这个流程,让B用户不消登录就可以完成这个操纵。JWT就答允我们做到这点。
JWT的构成
一个JWT实际上就是一个字符串,它由三部门构成,头部、载荷与签名。
载荷(Payload)
我们先将上面的添加挚友的操纵描写成一个JSON工具。个中添加了一些其他的信息,辅佐此后收到这个JWT的处事器领略这个JWT。
{ "iss": "John Wu JWT", "iat": 1441593502, "exp": 1441594722, "aud": "www.example.com", "sub": "jrocket@example.com", "from_user": "B", "target_user": "A" }
这内里的前五个字段都是由JWT的尺度所界说的。
这些界说都可以在尺度中找到。
将上面的JSON工具举办[base64编码]可以获得下面的字符串。这个字符串我们将它称作JWT的Payload(载荷)。
eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9
假如你利用Node.js,可以用Node.js的包base64url来获得这个字符串。
var base64url = require('base64url') var header = { "from_user": "B", "target_user": "A" } console.log(base64url(JSON.stringify(header))) // 输出:eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9
小常识:Base64是一种编码,也就是说,它是可以被翻译回本来的样子来的。它并不是一种加密进程。
头部(Header)
JWT还需要一个头部,头部用于描写关于该JWT的最根基的信息,譬喻其范例以及签名所用的算法等。这也可以被暗示成一个JSON工具。
{ "typ": "JWT", "alg": "HS256" }
在这里,我们说明白这是一个JWT,而且我们所用的签名算法(后头会提到)是HS256算法。
对它也要举办Base64编码,之后的字符串就成了JWT的Header(头部)。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
签名(签名)
将上面的两个编码后的字符串都用句号.毗连在一起(头部在前),就形成了
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0
这一部门的进程在node-jws的源码中有浮现
最后,我们将上面拼接完的字符串用HS256算法举办加密。在加密的时候,软件开发,我们还需要提供一个密钥(secret)。假如我们用mystar作为密钥的话,那么就可以获得我们加密后的内容
rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
这一部门又叫做签名。
最后将这一部门签名也拼接在被签名的字符串后头,我们就获得了完整的JWT
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
于是,我们就可以将邮件中的URL改成
https://your.awesome-app.com/make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
这样就可以安详地完成添加挚友的操纵了!
且慢,我们必然会有一些问题:
让我逐一为你说明。
签名的目标