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 \Lcobucci\JWT\Builder;
use \Lcobucci\JWT\Signer\Hmac\Sha256;

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 \Lcobucci\JWT\Parser;
use \Lcobucci\JWT\Signer\Hmac\Sha256;

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> 解決問題的方式,就是解決它一次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM