官网 https://jwt.io/

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

安装

  1. composer require lcobucci/jwt

依赖

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

示例

  1. <?php
  2.  
  3. use \Lcobucci\JWT\Builder;
  4. use \Lcobucci\JWT\Signer\Hmac\Sha256;
  5.  
  6. include "../vendor/autoload.php";
  7.  
  8. $builder = new Builder();
  9. $signer = new Sha256();
  10.  
  11. $secret = "XXXXXXXXXXXXXXXXXXXXX";
  12.  
  13. //设置header和payload,以下的字段都可以自定义
  14. $builder->setIssuer("XXX.com") //发布者
  15. ->setAudience("XXX.com") //接收者
  16. ->setId("abc", true) //对当前token设置的标识
  17. ->setIssuedAt(time()) //token创建时间
  18. ->setExpiration(time() + ) //过期时间
  19. ->setNotBefore(time() + ) //当前时间在这个时间前,token不能使用
  20. ->set('uid', ); //自定义数据
  21.  
  22. //设置签名
  23. $builder->sign($signer, $secret);
  24. //获取加密后的token,转为字符串
  25. $token = (string)$builder->getToken();
  26. var_dump($token);

验证token

  1. <?php
  2.  
  3. use \Lcobucci\JWT\Parser;
  4. use \Lcobucci\JWT\Signer\Hmac\Sha256;
  5.  
  6. include "../vendor/autoload.php";
  7.  
  8. $signer = new Sha256();
  9.  
  10. $secret = "XXXXXXXXXXXXXXXXXXXXX";
  11.  
  12. //获取token
  13. $token = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : '';
  14.  
  15. if (!$token) {
  16. invalidToken('Invalid token');
  17. }
  18.  
  19. try {
  20. //解析token
  21. $parse = (new Parser())->parse($token);
  22. //验证token合法性
  23. if (!$parse->verify($signer, $secret)) {
  24. invalidToken('Invalid token');
  25. }
  26.  
  27. //验证是否已经过期
  28. if ($parse->isExpired()) {
  29. invalidToken('Already expired');
  30. }
  31.  
  32. //获取数据
  33. var_dump($parse->getClaims());
  34.  
  35. } catch (Exception $e) {
  36. //var_dump($e->getMessage());
  37. invalidToken('Invalid token');
  38. }
  39.  
  40. function invalidToken($msg) {
  41. header('HTTP/1.1 403 forbidden');
  42. exit($msg);
  43. }

问题

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

解决方案1:

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

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

解决方案2:

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

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

解决方案3:

将token信息包含到URL中

  1. 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. Python 信号处理 signal 模块

    Table of Contents 1. signal模块简介 1.1. signal简单示例 1.2. signal说明 1.2.1. 基本的信号名 1.2.2. 常用信号处理函数 2. signa ...

  2. datetime模块详解

    时间运算 >>> datetime.datetime.now() #当前年月 时间datetime.datetime(2018, 2, 13, 16, 12, 6, 850532)& ...

  3. MySQL之索引(二)

    高性能的索引策略 正确地创建和使用索引是实现高性能查询的基础.在MySQL之索引(一)这一章中我们介绍了各种类型的索引及其对应的优缺点.现在我们一起来看看如何真正地发挥这些索引的优势. 独立的列 我们 ...

  4. centos php环境搭建

    CentOS 6.5系统安装配置LAMP(Apache+PHP5+MySQL)服务器环境 准备篇: 1.配置防火墙,开启80端口.3306端口vi /etc/sysconfig/iptables-A ...

  5. Your branch is ahead of 'origin/master' by 21 commits.

    当切换到主分支后,准备 git pull 拉取远程 master 分支时,提示本地主分支显示有 21 个commits 问题原因: 因为你修改了 local master 本地的主分支,可以选择以下方 ...

  6. windows批处理 打开exe后关闭cmd

    start "" "程序路径.exe"    这样调用就OK啦.如: start "" "D:\123.exe" 如果下 ...

  7. Java的移位运算符

    1.左移运算符:<< 丢弃左边指定位数,右边补0. 注意: 当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作.也就是说左移32位相当于不进行移位操作 ...

  8. java之LinkedList.add

    LinkedList: public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { //last为当前集合的最 ...

  9. win7分盘(复制)

    1/10 右击“计算机”选择“管理” 2/10 打开管理之后点击“磁盘管理器”,在想要新建磁盘的分区上右击,点击“压缩卷” 3/10 在“输入压缩空间量”后面输入需要新建磁盘的大小,输入的单位为MB( ...

  10. structs2 对ActionContext valueStack stack context 的理解 图片实例

    structs2 对ActionContext valueStack stack context 的理解 ActionConext : The ActionContext is the context ...