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),格 ...
随机推荐
- Unity3D 使用Socket处理数据并将数据 在UGUI、NGUI上显示出来
Unity3d 不支持C#的线程直接调用Unity3D 主线程才能实现的功能.例如:给UGUI text 赋值.改变Color值等.怎样解决这个问题呢?使用一个Loom脚本. 按照惯例贴上代码. 首先 ...
- Ubuntu16.04VIM无法补全错误记录
先记录一下YouCompleteMe的安装过程. 按照教程进行安装 1. 安装 vundle # vundle是vim的包管理器,十分好用 cv@cv: ~$ git clone https://gi ...
- Asia Yokohama Regional Contest 2018 G题 What Goes Up Must Come Down
链接 G题 https://codeforces.com/gym/102082 使其成为单峰序列需要交换多少次相邻的数. 树状数组维护逆序对. 对于每个序列中的数,要么在单峰的左侧,要么在单峰的右侧, ...
- gitlab runner使用docker报错(x509: certificate signed by unknown authority)定位
如果gitlab runner使用docker,docker是普通配置,配置好后,runner就可以正常执行任务了. 另外一个环节Docker配置了tls加密连接,添加runner后,runner的配 ...
- SpringBoot的启动流程分析(2)
我们来分析SpringApplication启动流程中的run()方法,代码如下 public ConfigurableApplicationContext run(String... args) { ...
- C++ float vs double
精度 相比 float ,double 从其名字上已经展示出,它的精度是前者的两倍,他们的精度分别为: float: 7 位数字 double: 15 位数字 可通过如下的示例看出,在重复进行计算时, ...
- Selenium(七):选择框(radio框、checkbox框、select框)
1. 选择框 本章使用的html代码: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- JMeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决方法
一.问题原因 用JMeter压测,有时候当模拟并发请求较大或者脚本运行时间较长时,JMeter会停止,报OOM(内存溢出)错误. 原因是JMeter是一个纯Java开发的工具,内存由java虚拟机JV ...
- Add an Action that Displays a Pop-up Window 添加显示弹出窗口按钮
In this lesson, you will learn how to create an Action that shows a pop-up window. This type of Acti ...
- JS 语句
JS 语句 JavaScript 语句 JavaScript 语句向浏览器发出的命令.语句的作用是告诉浏览器该做什么. 下面的 JavaScript 语句向 id="demo" 的 ...