欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

我们就可以将邮件中的URL改成 https://your.awesome-app.com/make-friend/?jw

点击: 次  来源:宝鼎软件 时间:2017-07-29

原文出处: John Wu

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就答允我们做到这点。

我们就可以将邮件中的URL改成 https://your.awesome-app.com/make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOi 劳务调派信息打点系统 JIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM 这样就可以安详地完成添加挚友的操纵了! 且慢

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的尺度所界说的。

  • iss: 该JWT的签发者
  • sub: 该JWT所面向的用户
  • aud: 吸收该JWT的一方
  • exp(expires): 什么时候逾期,这里是一个Unix时间戳
  • iat(issued at): 在什么时候签发的
  • 这些界说都可以在尺度中找到。

    将上面的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

    这一部门又叫做签名。

    我们就可以将邮件中的URL改成 https://your.awesome-app.com/make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOi 劳务调派信息打点系统 JIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM 这样就可以安详地完成添加挚友的操纵了! 且慢

    最后将这一部门签名也拼接在被签名的字符串后头,我们就获得了完整的JWT

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

    于是,我们就可以将邮件中的URL改成

    https://your.awesome-app.com/make-friend/?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

    这样就可以安详地完成添加挚友的操纵了!

    且慢,我们必然会有一些问题:

    1. 签名的目标是什么?
    2. Base64是一种编码,是可逆的,那么我的信息不就被袒露了吗?

    让我逐一为你说明。

    签名的目标