PHP实现JWT的Token登录认证_php技巧_脚本之家


本站和网页 https://www.jb51.net/article/230891.htm 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

PHP实现JWT的Token登录认证_php技巧_脚本之家
脚本之家
服务器常用软件
手机版
投稿中心
关注微信
快捷导航
软件下载
android
MAC
驱动下载
字体下载
DLL
源码下载
PHP
ASP.NET
ASP
JSP
软件编程
C#
JAVA
C 语言
Delphi
Android
网络编程
PHP
ASP.NET
ASP
JavaScript
在线工具
CSS格式化
JS格式化
Html转化为Js
数据库
MYSQL
MSSQL
oracle
DB2
MARIADB
CMS
PHPCMS
DEDECMS
帝国CMS
WordPress
常用工具
PHP开发工具
python
Photoshop
必备软件
网站首页
网页制作
网络编程
脚本专栏
脚本下载
数据库
服务器
电子书籍
操作系统
网站运营
平面设计
其它
媒体动画
电脑基础
硬件教程
网络安全
php基础
php技巧
php实例
php文摘
php模板
您的位置:首页 → 网络编程 → PHP编程 → php技巧 → PHP实现Token登录认证
PHP实现JWT的Token登录认证
更新时间:2021年12月01日 17:23:48 作者:我却醉的像条狗
这篇文章通过实例代码介绍了PHP实现JWT的Token登录认证的方式,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
1、JWT简介
JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案。
session登录认证方案:用户从客户端传递用户名、密码等信息,服务端认证后将信息存储在session中,将session_id放到cookie中。
以后访问其他页面,自动从cookie中取到session_id,再从session中取认证信息。
另一类解决方案,将认证信息,返回给客户端,存储到客户端。下次访问其他页面,需要从客户端传递认证信息回服务端。
JWT就是这类方案的代表,将认证信息保存在客户端。
2、JWT 的原理
JWT 的原理是,服务器认证以后,生成一个 JSON格式的 对象,发回给客户端,就像下面这样。
"用户名": "admin",
"角色": "超级管理员",
"到期时间": "2019-07-13 00:00:00"
以后,客户端与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。
为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。
服务器不再保存任何 session 数据,也就是服务器变成无状态了,从而比较容易实现扩展。
3、JWT 的使用方式
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
Authorization: Bearer <token>
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
4、JWT 的几个特点
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
5、功能实现
JWT功能组件
使用composer安装 JWT 功能组件
composer require lcobucci/jwt 3.3
封装JWT工具类 (参考 https://github.com/lcobucci/jwt/tree/3.3)
extend/tools/jwt/Token.php
<&#63;php
namespace tools\jwt;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\ValidationData;
/**
* Created by PhpStorm.
* User: asus
* Date: 2019/4/5
* Time: 13:02
*/
class Token
private static $_config = [
'audience' => 'http://www.pyg.com',//接收人
'id' => '3f2g57a92aa',//token的唯一标识,这里只是一个简单示例
'sign' => 'pinyougou',//签名密钥
'issuer' => 'http://adminapi.pyg.com',//签发人
'expire' => 3600*24 //有效期
];
//生成token
public static function getToken($user_id){
//签名对象
$signer = new Sha256();
//获取当前时间戳
$time = time();
//设置签发人、接收人、唯一标识、签发时间、立即生效、过期时间、用户id、签名
$token = (new Builder())->issuedBy(self::$_config['issuer'])
->canOnlyBeUsedBy(self::$_config['audience'])
->identifiedBy(self::$_config['id'], true)
->issuedAt($time)
->canOnlyBeUsedAfter($time-1)
->expiresAt($time + self::$_config['expire'])
->with('user_id', $user_id)
->sign($signer, self::$_config['sign'])
->getToken();
return (string)$token;
//从请求信息中获取token令牌
public static function getRequestToken()
if (empty($_SERVER['HTTP_AUTHORIZATION'])) {
return false;
$header = $_SERVER['HTTP_AUTHORIZATION'];
$method = 'bearer';
//去除token中可能存在的bearer标识
return trim(str_ireplace($method, '', $header));
//从token中获取用户id (包含token的校验)
public static function getUserId($token = null)
$user_id = null;
$token = empty($token)&#63;self::getRequestToken():$token;
if (!empty($token)) {
//为了注销token 加以下if判断代码
$delete_token = cache('delete_token') &#63;: [];
if(in_array($token, $delete_token)){
//token已被删除(注销)
return $user_id;
$token = (new Parser())->parse((string) $token);
//验证token
$data = new ValidationData();
$data->setIssuer(self::$_config['issuer']);//验证的签发人
$data->setAudience(self::$_config['audience']);//验证的接收人
$data->setId(self::$_config['id']);//验证token标识
if (!$token->validate($data)) {
//token验证失败
return $user_id;
//验证签名
$signer = new Sha256();
if (!$token->verify($signer, self::$_config['sign'])) {
//签名验证失败
return $user_id;
//从token中获取用户id
$user_id = $token->getClaim('user_id');
return $user_id;
修改public/.htaccess文件,通过apache重写,处理HTTP请求中的Authorization字段
(不处理,php中接收不到HTTP_AUTHORAZATION字段信息)
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
测试: application/adminapi/controller/Index.php中index方法
静态调用封装的\tools\jwt\Token类的getToken方法,传递一个用户id值,生成token
静态调用封装的\tools\jwt\Token类的getUserId方法,传递一个token,获取用户id值
访问结果
到此这篇关于PHP实现JWT的Token登录认证的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:PHP中token的生成案例PHP token验证生成原理实例分析php token使用与验证示例【测试可用】PHP解析RuoYi框架实现Token解密详解
PHP
Token
登录认证
相关文章
PHP生成指定随机字符串的简单实现方法这篇文章主要介绍了PHP生成指定随机字符串的简单实现方法,涉及php操作数组与字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 2015-04-04
php动态绑定变量的用法这篇文章主要介绍了php动态绑定变量的用法,涉及php变量的判定与动态定义的相关技巧,需要的朋友可以参考下 2015-06-06
PHP 编程请选择正确的文本编辑软件PHP 编程请选择正确的文本编辑软件... 2006-12-12
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法这篇文章主要介绍了ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法,需要的朋友可以参考下 2014-08-08
php str_getcsv把字符串解析为数组的实现方法下面小编就为大家带来一篇php str_getcsv把字符串解析为数组的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2017-04-04
PDO版本问题 Invalid parameter number: no parameters were bound发现在客户的某个PHP版本下,执行某类操作的时候,总是会报如下错误 Invalid parameter number: no parameters were bound,经google,发现是php版本过低导致 2013-01-01
PHP输出XML到页面的3种方法详解本篇文章是对PHP输出XML到页面的3种方法进行了详细的分析介绍,需要的朋友参考下 2013-06-06
PHP细数实现提高并发能力的方法这篇文章主要介绍了PHP提高并发能力有哪些方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2022-08-08
php中的动态调用实例分析这篇文章主要介绍了php中的动态调用的使用技巧,实例分析了动态调用的具体用法与注意事项,需要的朋友可以参考下 2015-01-01
Thinkphp无限级分类代码这篇文章主要介绍了Thinkphp无限级分类代码,无限级分类真的很重要了,我不会写怎么办?本篇就一步步告诉大家如何制作无限级分类,感兴趣的小伙伴们可以参考一下 2015-11-11
最新评论
大家感兴趣的内容
1php中json_decode()和json_encode(2PHP 数组和字符串互相转换实现方法3php 字符串中是否包含指定字符串的多种方法4PHP中使用cURL实现Get和Post请求的方法5php中iconv函数使用方法6php日期转时间戳,指定日期转换成时间戳7PHP 页面跳转到另一个页面的多种方法方法总结8PHP中文处理 中文字符串截取(mb_substr)和获取中9php下intval()和(int)转换使用与区别10利用phpExcel实现Excel数据的导入导出(全步骤详细
最近更新的内容
php读取图片内容并输出到浏览器的实现代码关于shopex同步ucenter的redirect问题,导致script不页面乱码问题的根源及其分析PHP 500报错的快速解决方法gearman中任务的优先级和返回状态实例分析探讨如何在PHP开启gzip页面压缩实例PHP字符串和十六进制如何实现互相转换php URL验证正则表达式php生成随机数/生成随机字符串的方法小结【5种方法】PHP垃圾回收机制超详细介绍
常用在线小工具
微信
投稿
脚本任务
在线工具
关注微信公众号
关于我们 -
广告合作 -
联系我们 -
免责声明 -
网站地图 -
投诉建议 -
在线投稿
CopyRight 2006-2022 JB51.Net Inc All Rights Reserved. 脚本之家 版权所有