一直没有好好看过jwt,直到前两天要做web验证,朋友给我推荐了jwt。才发现jwt已经被大家广泛的应用了。看来我有点out了。哈哈,趁着这个世界来好好看看这个。

JWT(JSON Web Token), 顾名思义就是可以在Web上传输的token,这种token是用JSON格式进行format的。它是一个开源标准(RFC 7519),定义了一个紧凑的自包含的方式在不同实体之间安全的用JSON格式传输信息。

由于现在很多项目都是前后端分离,restful api模式。所以传统的session模式就没有办法满足认证需求,这个时候jwt的作用就来了。可以说 restful api认证是jwt的一个很好的应用场景。

参数解释

名称

解释

iss (issuer)

issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者

sub (Subject)

设置主题,类似于发邮件时的主题

aud (audience)

接收jwt的一方

exp (expire)

token过期时间

nbf (not before)

当前时间在nbf设定时间之前,该token无法使用

iat (issued at)

token创建时间

jti (JWT ID)

对当前token设置唯一标示

下面是一个很小的demo

require_once 'src/JWT.php';

header('Content-type:application/json');

//定义Key

const KEY = 'dasjdkashdwqe1213dsfsn;p';

$user = [

'uid'=>'dadsa-12312-vsd1s1-fsds',

'account'=>'daisc',

'password'=>'123456'

];

$redis = redis();

$action = $_GET['action'];

switch ($action)

{

case 'login':

login();

break;

case 'info':

info();

break;

}

//登陆,写入验证token

function login()

{

global $user;

$account = $_GET['account'];

$pwd = $_GET['password'];

$res = [];

if($account==$user['account']&&$pwd==$user['password'])

{

unset($user['password']);

$time = time();

$token = [

'iss'=>'http://test.cc',//签发者

'iat'=>$time,

'exp'=>$time+60,

'data'=>$user

];

$jwt = FirebaseJWTJWT::encode($token,KEY);

$res['code'] = 200;

$res['message'] = '登录成功';

$res['jwt'] = $jwt;

}

else

{

$res['message']= '用户名或密码错误';

$res['code'] = 401;

}

exit(json_encode($res));

}

function info()

{

$jwt = $_SERVER['HTTP_AUTHORIZATION'] ?? false;

$res['code'] = 200;

if($jwt)

{

$jwt = str_replace('Bearer ','',$jwt);

if(empty($jwt))

{

$res['code'] = 401;

$res['msg'] = 'You do not have permission to access.';

exit(json_encode($res));

}

try{

$token = (array) FirebaseJWTJWT::decode($jwt,KEY, ['HS256']);

if($token['exp']

{

$res['code'] = 401;

$res['msg'] = '登录超时,请重新登录';

}

$res['data']= $token['data'];

}catch (Exception $E)

{

$res['code'] = 401;

$res['msg'] = '登录超时,请重新登录.';

}

}

else

{

$res['code'] = 401;

$res['msg'] = 'You do not have permission to access.';

}

exit(json_encode($res));

}

//连接redis

function redis()

{

$redis = new Redis();

$redis->connect('127.0.0.1');

return $redis;

}

这个dmeo里面用jwt做了一个简单的认证。 其中用到了一个php-jwt的加密包https://github.com/firebase/php-jwt

其中KEY为定义的私钥也就是jwt里面的 sign部分,这个一定要保存好。

而header部分php-jwt包里面已经帮我们完成了,加密代码如下

public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null)

{

$header = array('typ' => 'JWT', 'alg' => $alg);

if ($keyId !== null) {

$header['kid'] = $keyId;

}

if ( isset($head) && is_array($head) ) {

$header = array_merge($head, $header);

}

$segments = array();

$segments[] = static::urlsafeB64Encode(static::jsonEncode($header));

$segments[] = static::urlsafeB64Encode(static::jsonEncode($payload));

$signing_input = implode('.', $segments);

$signature = static::sign($signing_input, $key, $alg);

$segments[] = static::urlsafeB64Encode($signature);

return implode('.', $segments);

}

可以看出默认的加密的方式是HS256。这也是说jwt安全的原因。现阶段HS256加密还是很安全的。

这个包里面也支持证书加密。

加密解密的过程这个包已经帮我们完成了。所以我们只需要定义jwt中的 poyload部分就可以了。也就是demo里面的token部分。加密成功会得到一个加密的Jwt字符串,下次前端在请求api的时候需要携带这个jwt字符串作为认证。

在header头里面增加Authorization。在服务端验证的时候回通过取得这个值来验证回话的有效。

下面是poyload的一些常用配置

$token = [

#非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。

"iss" => "http://example.org",

#非必须。issued at。 token创建时间,unix时间戳格式

"iat" => $_SERVER['REQUEST_TIME'],

#非必须。expire 指定token的生命周期。unix时间戳格式

"exp" => $_SERVER['REQUEST_TIME'] + 7200,

#非必须。接收该JWT的一方。

"aud" => "http://example.com",

#非必须。该JWT所面向的用户

"sub" => "jrocket@example.com",

# 非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。

"nbf" => 1357000000,

# 非必须。JWT ID。针对当前token的唯一标识

"jti" => '222we',

# 自定义字段

"GivenName" => "Jonny",

# 自定义字段

"name" => "Rocket",

# 自定义字段

"Email" => "jrocket@example.com",

];

里面包含的配置可以自由配置,也可以自己添加一些其他的。这些都是网上大家常用的,可以说是一种约定吧。

注意事项

关于jwt的使用大概就是这些。上面的代码在你使用的时候可能会出现两个问题:

1、命名空间错误

解决:不使用命名空间的话,使用require引入文件。如果使用命名空间出现错误,请检查命名空间的路径。

2、生成的token是一个对象

解决:(string)$token 将token强转成string

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

php jwt使用案例,PHP JWT初识及其简单示例相关推荐

  1. php jwt使用案例,PHP JWT基础知识及其简单示例

    PHP JWT初识及示例 一直没有好好看过jwt,直到前两天要做web验证,朋友给我推荐了jwt.才发现jwt已经被大家广泛的应用了.看来我有点out了.哈哈,趁着这个世界来好好看看这个. JWT(J ...

  2. 通过一个案例理解 JWT

    原文出自:https://www.pandashen.com JWT 简述 JWT(json web token)是为了在网络应用环境之间传递声明而基于 json 的开放标准,JWT 的声明一般被采用 ...

  3. php jwt使用案例,PHP使用JWT创建Token的实例详解

    iss (issuer)issuer请求实体,可以是发起请求的用户的信息,也可是jwt的签发者 sub (Subject)设置主题,类似于发邮件时的主题 aud (audience)接收jwt的一方 ...

  4. php jwt使用案例,记一次PHP使用JWT

    从https://jwt.io/中找到目前github上目前star最多的jwt包: PHP-JWT A simple library to encode and decode JSON Web To ...

  5. jwt配置 restful_SpringBoot实现JWT保护前后端分离RESTful API

    本文将用不到100行Java代码, 教你如何在Spring Boot里面用JWT保护RESTful api. 登录前 登录之后即可得到正确结果 登陆后 1. 什么是JWT 了解JWT的同学可以跳过这一 ...

  6. 用户修改了信息jwt服务器怎么识别,jwt验证登录信息

    为什么要告别session?有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在其中一台服务器登录后,用session保存其登录信息,其他服务器怎么知道该用户登录了?(单点登录), ...

  7. php jwt payload,php实现jwt

    JWT是什么 JWT是json web token缩写.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证.基于token的身 ...

  8. 【JWT】什么是JWT?

    什么是JWT? json web Token,通过数字签名的方式,以json对象为载体,在不同的服务终端之间安全的传输信息. JWT有什么用? JWT最常见的场景就是授权认证,一旦用户登录,后续每个请 ...

  9. vue12Jwt详解+JWT组成+JWT的验证过程+JWT令牌刷新思路+代码

    目录 1. JWT是什么 2. 为什么使用JWT 3. JWT的工作原理: 4. JWT组成 JWT结构原理图: JWT实际结构: 4.1 Header 4.2 Payload(负荷) 4.3 sig ...

  10. 接口使用jwt返回token_基于JWT的token认证

    阿里云API网关在Json Web Toke(JWT)这种结构化令牌的基础上实现了一套基于用户体系对用户的API进行授权访问的机制,满足用户个性化安全设置的需求. 一.基于token的认证 1.1 简 ...

最新文章

  1. matplotlib绘制平滑的曲线
  2. 使用OpenCV检测图像中的矩形
  3. Link-Cut Tree动态树模板
  4. 大话数据结构:最短路径算法
  5. c# 正则获取html标签内容,c# – 使用正则表达式在多个HTML标记之间获取文本
  6. 客户端中转request请求乱码
  7. 车间调度建模系列8|扩展析取图之基于时间片段的赋时三维析取图模型
  8. 从知网或PDF复制英文单词间隔过大问题
  9. 中国锂电池设备行业投资价值评估及竞争策略建议报告2021-2027年
  10. 分享一个性价比极高的代理IP
  11. php开源微博框架,记事狗微博开源代码学习笔记:微博话题列表
  12. 外滩画报:揭秘全球电子垃圾坟墓
  13. 搭建京东客京推推CMS2.0导购网站部署教程,新手教程带视频
  14. 学习DNS,这一篇文章就够了
  15. 红外遥控智能小车 源码
  16. STM32系列微控制器入门介绍
  17. MybatisPlusException: can not find lambda cache for this entity[]异常解决
  18. 互联网未来7大猜想,互联网营销
  19. 英语流利说l4u1p2_L4-U1-P2-1Listening:ATriptoYosemitePark1 英语流利说 懂你英语
  20. css mix-blend,详解CSS3的mix-blend-mode属性

热门文章

  1. 2021 CVPR | 基于渐进感受局部区域推理的全方位监督点云分割
  2. 延迟退休板上钉钉,专家:男女延至同龄为好!如何延?35 岁“歧视线”又如何破?...
  3. CVPR2020 论文分类及全部下载!
  4. ZBrush中Tool工具的保存
  5. IAP测试购买失败,Error Domain=SKErrorDomain Code=0 无法连接到 iTunes Store
  6. Struts2学习笔记(OGNL表达式)
  7. 复杂作业车间调度-单机调度问题研究
  8. VC++如何计算一段代码的执行时间
  9. 速读-NFA的GPU加速器
  10. 【LeetCode】【字符串】题号:412. Fizz Buzz