JWT在PHP使用及问题处理

Posted WidgetBox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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}

 

作者:旧旧的 <[email protected]> 解决问题的方式,就是解决它一次

以上是关于JWT在PHP使用及问题处理的主要内容,如果未能解决你的问题,请参考以下文章

laravel整合JWT遇到的问题及解决方案

NodeJS Crypto RS-SHA256 和 JWT 承载

Python 无法解码 PHP 创建的 JWT 代码

Spring cloud微服务安全实战-6-5jwt改造之日志及错误处理

JWT生成token及过期处理方案

JWT生成token及过期处理方案