zoukankan      html  css  js  c++  java
  • JWT在PHP使用及问题处理

    官网 https://jwt.io/

    3.0版本 https://github.com/lcobucci/jwt

    安装

    composer require lcobucci/jwt

    依赖

    • PHP 5.5+ (v3.2) and PHP 7.1 (v4.x)
    • OpenSSL Extension

    示例

    <?php
    
    use LcobucciJWTBuilder;
    use LcobucciJWTSignerHmacSha256;
    
    include "../vendor/autoload.php";
    
    $builder = new Builder();
    $signer  = new Sha256();
    
    $secret = "XXXXXXXXXXXXXXXXXXXXX";
    
    //设置header和payload,以下的字段都可以自定义
    $builder->setIssuer("XXX.com") //发布者
            ->setAudience("XXX.com") //接收者
            ->setId("abc", true) //对当前token设置的标识
            ->setIssuedAt(time()) //token创建时间
            ->setExpiration(time() + 60) //过期时间
            ->setNotBefore(time() + 5) //当前时间在这个时间前,token不能使用
            ->set('uid', 30061); //自定义数据
    
    //设置签名
    $builder->sign($signer, $secret);
    //获取加密后的token,转为字符串
    $token = (string)$builder->getToken();
    var_dump($token);

    验证token

    <?php
    
    use LcobucciJWTParser;
    use LcobucciJWTSignerHmacSha256;
    
    include "../vendor/autoload.php";
    
    $signer  = new Sha256();
    
    $secret = "XXXXXXXXXXXXXXXXXXXXX";
    
    //获取token
    $token = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : '';
    
    if (!$token) {
        invalidToken('Invalid token');
    }
    
    try {
        //解析token
        $parse = (new Parser())->parse($token);
        //验证token合法性
        if (!$parse->verify($signer, $secret)) {
            invalidToken('Invalid token');
        }
    
        //验证是否已经过期
        if ($parse->isExpired()) {
            invalidToken('Already expired');
        }
    
        //获取数据
        var_dump($parse->getClaims());
    
    } catch (Exception $e) {
        //var_dump($e->getMessage());
        invalidToken('Invalid token');
    }
    
    function invalidToken($msg) {
        header('HTTP/1.1 403 forbidden');
        exit($msg);
    }

    问题

    在开发APP API的过程中发现,服务端无法进行OAuth2.0认证,具体表现为无法获取Authorization Header头信息

    解决方案1:

    SetEnvIf Authorization “(.*)” HTTP_AUTHORIZATION=$1

    这是apache文档对它的定义,mod_setenvif模块允许根据请求的不同方面匹配指定的正则表达式来设置环境变量。这些环境变量可由服务器的其他部分使用。

    解决方案2:

    Laravel文档中说如果用户名/密码没有进行base64编码那么Apache似乎会摒弃Authorization头,要修复这一问题可以添加如下代码到Apache配置文件,具体原理同方案1

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

    解决方案3:

    将token信息包含到URL中

    http://api.yoursite.com/?token={yourtokenhere}

    作者:旧旧的 <393210556@qq.com> 解决问题的方式,就是解决它一次

  • 相关阅读:
    严援朝座右铭
    王治郅 请让爱国走下神坛
    Java 事件处理实例
    SAP ERP 与 Oracle ERP 比较
    Gantt Component for Delphi Pure Pascal code(TsyGantt VCL)
    XMLRPC vs. SOAP
    Interfaces with Constants Only(java中通用常量定义)
    船舶设计软件简介
    DelphiARX 2000i 简介
    JAVA事件适配器用内部类,匿名类实现事件处理
  • 原文地址:https://www.cnblogs.com/widgetbox/p/9543678.html
Copyright © 2011-2022 走看看