官网 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() + ) //过期时间
->setNotBefore(time() + ) //当前时间在这个时间前,token不能使用
->set('uid', ); //自定义数据 //设置签名
$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=$

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

解决方案2:

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

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

解决方案3:

将token信息包含到URL中

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

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

JWT在PHP使用及问题处理的更多相关文章

  1. 看图理解JWT如何用于单点登录

    单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...

  2. JWT实现token-based会话管理

    上文<3种web会话管理的方式>介绍了3种会话管理的方式,其中token-based的方式有必要从实现层面了解一下.本文主要介绍这方面的内容.上文提到token-based的实现目前有一个 ...

  3. 用JWT来保护我们的ASP.NET Core Web API

    在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...

  4. Laravel-lumen 配置JWT

    具体步骤参照: [ JWT & Lumen ] 第一步 在项目根目录 执行命令 composer require tymon/jwt-auth第二步 在 bootstrap/app.php 的 ...

  5. .net core Jwt 添加

    Jwt 已经成为跨平台身份验证通用方案,如不了解请关注:https://jwt.io/. 为了和微软其他验证模块有个比较好的衔接,项目中采用了微软开发的jwt组件: System.IdentityMo ...

  6. 多说评论系统API调用和本地身份说明(JWT)

    多说评论系统是一个非常好用的第三方评论插件,聚合了大多数的SNS平台账号登录和分享功能,UI也很不错. 作为网站快速接入评论系统,多说是一个比较好的选择,其也提供了一些实用的API去满足定制化需求. ...

  7. 【JWT】JWT+HA256加密 Token验证

    目录 Token验证 传统的Token验证 JWT+HA256验证 回到顶部 Token验证 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twi ...

  8. 基于Token的身份验证——JWT

    初次了解JWT,很基础,高手勿喷. 基于Token的身份验证用来替代传统的cookie+session身份验证方法中的session. JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符 ...

  9. jwt refresh token

    $app->post('auth/refresh-token', ['middleware' => 'jwt.refresh', function() { try { $old_token ...

  10. JWT【JSON Web Token】 简述

    draft: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html http://tools.ietf.org/html/ ...

随机推荐

  1. [Hdu3555] Bomb(数位DP)

    Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...

  2. 教你如何在 Javascript 文件里使用 .Net MVC Razor 语法

    摘录 文章主要是介绍了通过一个第三方类库RazorJS,实现Javascript 文件里使用 .Net MVC Razor 语法,很巧妙,推荐给大家 相信大家都试过在一个 View 里嵌套使用 jav ...

  3. 使用chrome开发程序,自动刷新开发目录

    npm i livereload -g 在开发目录下: livereload 安装这个插件:https://chrome.google.com/webstore/detail/livereload/j ...

  4. WebApi 跨域

    http://www.cnblogs.com/lori/p/3557111.html http://bbs.csdn.net/topics/391020576

  5. STL学习笔记3--deque

    看这一节,是为了下一节的使用,在ogre3d里有些操作要使用到deque. C++ Deque(双向队列) 的使用 Deque结合了vector  和list  优缺点,是一种使用简单的容器. deq ...

  6. ogre3D学习基础5 -- 阴影与动画

    五.阴影 阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系. 启用阴影: 缺省情况下,阴影是关闭的,开启方式如下: 1.建立场 ...

  7. apizza导出为html后,从中提取api_name/api_path/api_method,保存到本地,方便根据接口名称得到接口路径与请求方法

    import re import os def open_file(file='c:/newcrm.html'): f=open(file,'r',encoding='utf-8') return f ...

  8. python-day3-之函数

    不使用函数的情况下只能遵循面向过程的编程,即,根据业务逻辑从上到下实现功能,往往重复的功能,使得代码出现重复. #最简单的函数调用 #由于python遵循从上到下读入内存的规律,所以函数要放到调用的前 ...

  9. 牛客多校第六场C

    一个数很大,并不能预处理,所以要进行公式变换,存前一个的值就好 #include <bits/stdc++.h> using namespace std; typedef long lon ...

  10. Hadoop入门第五篇:Hive简介以及部署

    标签(空格分隔): Hadoop Hive hwi 1.Hive简介   之前我一直在Maxcompute上进行大数据开发,所以对数仓这块还算比较了解,在接受Hive的时候基本上没什么大的障碍.所以, ...