美文网首页使用composer构建自己的php框架(fizzday)
【Fizzday06】使用JWT前后端分离认证

【Fizzday06】使用JWT前后端分离认证

作者: fizzday | 来源:发表于2017-07-31 10:26 被阅读9773次

    先睹为快

    <?php
    use Fizzday\FizzJWT\FizzJWT;
    
    $key = 'secret str';
    $payload = [
           "iss"=>"fizzday.net",
           "exp": 1300819380,
           "name"=>"fizz",
           "admin"=>true 
        ];
    // 生成认证token
    $token = FizzJWT::encode($payload, $key);
    // 解析token
    $payload = FizzJWT::decode($token, $key);
    

    没错, 这是一个对称加密的token, 只需要通过token就知道用户信息了, 同时, 也不怕其他人伪造token, 因为, 私钥(key)是在服务器上的, 只要key不泄露出去, 就是安全的
    我们只需要通过token解析就知道用户的基本信息了, 从而完成无状态认证, 源代码在最后. 下边科普一下 JWT 的基本知识

    概念

    现在API越来越流行,如何安全保护这些API? JSON Web Tokens(JWT)能提供基于JSON格式的安全认证。它有以下特点:

    JWT是跨不同语言的,JWT可以在 .NET, Python, Node.js, Java, PHP, Ruby, Go, JavaScript和Haskell中使用
    JWT是自我包涵的,它们包含了必要的所有信息,这就意味着JWT能够传递关于它自己的基本信息,比如用户信息和签名等。
    JWT传递是容易的,因为JWT是自我包涵,它们能被完美用在HTTP头部中,当需要授权API时,你只要通过URL一起传送它既可。

    JWT易于辨识,是三段由小数点组成的字符串:

    aaaaaaaaaa.bbbbbbbbbbb.cccccccccccc

    这三部分含义分别是header,payload, signature

    1. Header

    头部包含了两个方面:类型和使用的哈希算法(如HMAC SHA256):

    {
    "typ": "JWT",
    "alg": "HS256" 
    }
    

    对这个JSON字符进行base64encode编码,我们就有了首个JWT:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    

    2. Payload

    JWT的第二部分是payload,也称为 JWT Claims,这里放置的是我们需要传输的信息,有多个项目如注册的claim名称,公共claim名称和私有claim名称。

    注册claim名称有下面几个部分:

    iss: token的发行者
    sub: token的题目
    aud: token的客户
    exp: 经常使用的,以数字时间定义失效期,也就是当前时间以后的某个时间本token失效。
    nbf: 定义在此时间之前,JWT不会接受处理。
    iat: JWT发布时间,能用于决定JWT年龄
    jti: JWT唯一标识. 能用于防止 JWT重复使用,一次只用一个token
    

    公共claim名称用于定义我们自己创造的信息,比如用户信息和其他重要信息。

    私有claim名称用于发布者和消费者都同意以私有的方式使用claim名称。

    下面是JWT的一个案例:

    {
    "iss": "scotch.io",
    "exp": 1300819380,
    "name": "Chris Sevilleja",
    "admin": true 
    }
    

    3. 签名

    JWT第三部分最后是签名,签名由以下组件组成:

    header
    payload
    密钥
    

    下面是我们如何得到JWT的第三部分:

    var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload); HMACSHA256(encodedString, 'secret');
    

    这里的secret是被服务器签名,我们服务器能够验证存在的token并签名新的token。

    php封装类

    FizzJWT源码: https://github.com/fizzday/FizzJWT

    同时可运用到任何地方, 不局限于本框架

    相关文章

      网友评论

        本文标题:【Fizzday06】使用JWT前后端分离认证

        本文链接:https://www.haomeiwen.com/subject/ooqjkxtx.html