PHP JWT token实现

<?php
/**
* PHP实现jwt
*/
class
Jwt {
//头部
private
static
$header
=
array
(
'alg'
=>
'HS256'
,
//生成signature的算法
'typ'
=>
'JWT'
//类型
);
//使用HMAC生成信息摘要时所使用的密钥
private
static
$key
=
'123456'
;
/**
* 获取jwt token
* @param array $payload jwt载荷 格式如下非必须
* [
* 'iss'=>'jwt_admin', //该JWT的签发者
* 'iat'=>time(), //签发时间
* 'exp'=>time()+7200, //过期时间
* 'nbf'=>time()+60, //该时间之前不接收处理该Token
* 'sub'=>'www.admin.com', //面向的用户
* 'jti'=>md5(uniqid('JWT').time()) //该Token唯一标识
* ]
* @return bool|string
*/
public
static
function
getToken(
array
$payload
)
{
if
(
is_array
(
$payload
))
{
$base64header
=self::base64UrlEncode(json_encode(self::
$header
,JSON_UNESCAPED_UNICODE));
$base64payload
=self::base64UrlEncode(json_encode(
$payload
,JSON_UNESCAPED_UNICODE));
$token
=
$base64header
.
'.'
.
$base64payload
.
'.'
.self::signature(
$base64header
.
'.'
.
$base64payload
,self::
$key
,self::
$header
[
'alg'
]);
return
$token
;
}
else
{
return
false;
}
}
/**
* 验证token是否有效,默认验证exp,nbf,iat时间
* @param string $Token 需要验证的token
* @return bool|string
*/
public
static
function
verifyToken(string
$Token
)
{
$tokens
=
explode
(
'.'
,
$Token
);
if
(
count
(
$tokens
) != 3)
return
false;
list(
$base64header
,
$base64payload
,
$sign
) =
$tokens
;
//获取jwt算法
$base64decodeheader
= json_decode(self::base64UrlDecode(
$base64header
), JSON_OBJECT_AS_ARRAY);
if
(
empty
(
$base64decodeheader
[
'alg'
]))
return
false;
//签名验证
if
(self::signature(
$base64header
.
'.'
.
$base64payload
, self::
$key
,
$base64decodeheader
[
'alg'
]) !==
$sign
)
return
false;
$payload
= json_decode(self::base64UrlDecode(
$base64payload
), JSON_OBJECT_AS_ARRAY);
//签发时间大于当前服务器时间验证失败
if
(isset(
$payload
[
'iat'
]) &&
$payload
[
'iat'
] > time())
return
false;
//过期时间小宇当前服务器时间验证失败
if
(isset(
$payload
[
'exp'
]) &&
$payload
[
'exp'
] < time())
return
false;
//该nbf时间之前不接收处理该Token
if
(isset(
$payload
[
'nbf'
]) &&
$payload
[
'nbf'
] > time())
return
false;
return
$payload
;
}
/**
* base64UrlEncode https://jwt.io/ 中base64UrlEncode编码实现
* @param string $input 需要编码的字符串
* @return string
*/
private
static
function
base64UrlEncode(string
$input
)
{
return
str_replace
(
'='
,
''
,
strtr
(
base64_encode
(
$input
),
'+/'
,
'-_'
));
}
/**
* base64UrlEncode https://jwt.io/ 中base64UrlEncode解码实现
* @param string $input 需要解码的字符串
* @return bool|string
*/
private
static
function
base64UrlDecode(string
$input
)
{
$remainder
=
strlen
(
$input
) % 4;
if
(
$remainder
) {
$addlen
= 4 -
$remainder
;
$input
.=
str_repeat
(
'='
,
$addlen
);
}
return
base64_decode
(
strtr
(
$input
,
'-_'
,
'+/'
));
}
/**
* HMACSHA256签名 https://jwt.io/ 中HMACSHA256签名实现
* @param string $input 为base64UrlEncode(header).".".base64UrlEncode(payload)
* @param string $key
* @param string $alg 算法方式
* @return mixed
*/
private
static
function
signature(string
$input
, string
$key
, string
$alg
=
'HS256'
)
{
$alg_config
=
array
(
'HS256'
=>
'sha256'
);
return
self::base64UrlEncode(hash_hmac(
$alg_config
[
$alg
],
$input
,
$key
,true));
}
}
//测试和官网是否匹配begin
$payload
=
array
(
'sub'
=>
'1234567890'
,
'name'
=>
'John Doe'
,
'iat'
=>1516239022);
$jwt
=
new
Jwt;
$token
=
$jwt
->getToken(
$payload
);
echo
"<pre>"
;
echo
$token
;
//对token进行验证签名
$getPayload
=
$jwt
->verifyToken(
$token
);
echo
"<br><br>"
;
var_dump(
$getPayload
);
echo
"<br><br>"
;
//测试和官网是否匹配end
//自己使用测试begin
$payload_test
=
array
(
'iss'
=>
'admin'
,
'iat'
=>time(),
'exp'
=>time()+7200,
'nbf'
=>time(),
'sub'
=>
'www.admin.com'
,
'jti'
=>md5(uniqid(
'JWT'
).time()));;
$token_test
=Jwt::getToken(
$payload_test
);
echo
"<pre>"
;
echo
$token_test
;
//对token进行验证签名
$getPayload_test
=Jwt::verifyToken(
$token_test
);
echo
"<br><br>"
;
var_dump(
$getPayload_test
);
echo
"<br><br>"
;
//自己使用时候end
PHP JWT token实现的更多相关文章
- ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
一.前言 在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore ...
- 关于 IdentityServer4 中的 Jwt Token 与 Reference Token
OpenID Connect(Core),OAuth 2.0(RFC 6749),JSON Web Token (JWT)(RFC 7519) 之间有着密不可分联系,对比了不同语言的实现,还是觉得 I ...
- 如何在启用JWT Token授权的.NET Core WebApi项目中下载文件
背景 前几天,做项目的时候遇到一个文件下载的问题.当前系统是一个前后端分离的项目,前端是一个AngularJs项目, 后端是一个.NET Core WebApi项目.后端的Api项目使用了Jwt To ...
- 【ASP.NET Core快速入门】(十一)应用Jwtbearer Authentication、生成jwt token
准备工作 用VSCode新建webapi项目JwtAuthSample,并打开所在文件夹项目 dotnet new webapi --name JwtAuthSample 编辑JwtAuthSampl ...
- Django JWT Token RestfulAPI用户认证
一般情况下我们Django默认的用户系统是满足不了我们的需求的,那么我们会对他做一定的扩展 创建用户项目 python manage.py startapp users 添加项目apps INSTAL ...
- SpringSecurityOAuth使用JWT Token
⒈JWT? JWT(Json Web Token),是Json的一个开放的Token标准. 1,自包含,SpringSecurityOAuth的默认Token是UUID的一个随机的无意义的字符串,并不 ...
- 咏南中间件支持JWT TOKEN
咏南中间件支持JWT TOKEN
- Spring Cloud OAuth2.0 微服务中配置 Jwt Token 签名/验证
关于 Jwt Token 的签名与安全性前面已经做了几篇介绍,在 IdentityServer4 中定义了 Jwt Token 与 Reference Token 两种验证方式(https://www ...
- 菜鸟入门【ASP.NET Core】11:应用Jwtbearer Authentication、生成jwt token
准备工作 用VSCode新建webapi项目JwtAuthSample,并打开所在文件夹项目 dotnet new webapi --name JwtAuthSample 编辑JwtAuthSampl ...
- JWT token心得
token的组成 token串的生成流程. token在客户端与服务器端的交互流程 Token的优点和思考 参考代码:核心代码使用参考,不是全部代码 JWT token的组成 头部(Header),格 ...
随机推荐
- unittest---unittest中verbosity参数设置
我们在做自动化测试的时候,有时候想要很清楚的看到每条用例执行的详细信息,我们可以通过unittest中verbosity参数进行设置 verbosity参数设置 verbosity表示在只执行用例的过 ...
- 《HTTPS权威指南》读书笔记——SSL/TLS协议
记录协议(record protocol) 负责在传输连接上交换所有底层信息 每一条记录以短标头开始,标头包含记录内容的类型.协议版本和长度 握手协议(handshake protocol) 整个过程 ...
- ceph安装笔记
配置源 ceph版本为luminous [root@ceph-node1 ~]# yum install -y https://dl.fedoraproject.org/pub/epel/epel-r ...
- web攻击与防御技术--SQL注入
sql注入是WEB安全中比较重要而复杂的一个东西.而且危害性比较大. 一般来讲SQL注入的话首先要识别注入点.一个是看能不能注入另外一个是看是什么类型的注入比如说字符,数字,搜索(?)等等 GET.P ...
- 剑指Offer-39.把数组排成最小的数(C++/Java)
题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 将数组 ...
- nginx如何实现负载均衡以及实现方式
什么是ngnix? Nginx是一个http服务器.是一个使用c语言开发的高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.nginx能够支撑5万并发链接,并且cpu ...
- IT兄弟连 HTML5教程 CSS3揭秘 CSS3属性5
9 透明属性 元素透明也是我们常用的样式,在CSS2中使用滤镜属性opacity实现透明效果.现在有了CSS3的rgba属性,就不用这么麻烦了,当然这也得要浏览器支持才行.通常我们定义颜色都是用十六 ...
- linux命令--查找与帮助
一.搜寻命令 1.whereis命令 whereis是搜索系统命令的命令,也就是说,whereis 命令不能搜索普通文件, 而只能搜索系统命令. 命令名称:whereis 英文原意:locate th ...
- WebShell代码分析溯源(二)
WebShell代码分析溯源(二) 一.一句话变形马样本 <?php $POST['POST']='assert';$array[]=$POST;$array[0]['POST']($_POST ...
- 基于 Storyboard 多种方式的页面跳转、参数传递
原文 通过按钮关联跳转 选中 Button ,然后点击 action 右边拖拽到 第二个页面 选择 "Show"即可完成跳转关联. 定义页面间 segue Id,通过代码触发跳转 ...