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

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

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

下面是一个很小的demo


<?php
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 = \Firebase\JWT\JWT::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) \Firebase\JWT\JWT::decode($jwt,KEY, ['HS256']);
if($token['exp']<time())
{
$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还有很多有疑问的地方,下来在慢慢研究,比如续期以及退出的问题

原文地址:https://segmentfault.com/a/1190000016633900

PHP JWT初识的更多相关文章

  1. JWT初识记录

    因为前一段时间做了一个系统持续操作期间自动刷新token有效性的需求,然后就想着找一个空闲时间总结一下JWT,所以今天就简单的记录一下自己了解的内容. JWT是什么 JWT全称是JSON Web To ...

  2. 初识SSO与JWT

    以前在学校做项目的时候,登录注销,权限验证这些事情,都是交给框架来做的,每次都是把这个架子拿到项目中去,也没有真正思考过它的过程,总觉的这些都是十分简单的逻辑. 然而来公司工作之后,慢慢觉得登录和权限 ...

  3. Spring Boot初识(4)- Spring Boot整合JWT

    一.本文介绍 上篇文章讲到Spring Boot整合Swagger的时候其实我就在思考关于接口安全的问题了,在这篇文章了我整合了JWT用来保证接口的安全性.我会先简单介绍一下JWT然后在上篇文章的基础 ...

  4. 初识单点登录及JWT实现

    单点登录 多系统,单一位置登录,实现多系统同时登录的一种技术 (三方登录:某系统使用其他系统的用户,实现本系统登录的方式.如微信登录.支付宝登录) 单点登录一般是用于互相授信的系统,实现单一位置登录, ...

  5. 初识JWT

    1.JWT是什么 官方网站 JWT是JSON Web Token的简称.是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式,以JSON对象的形式在各方之间安全地传输信息,因为他被数字签名 ...

  6. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    目录 为什么是 JWT Bearer 什么是 JWT JWT 的优缺点 在 WebAPI 中使用 JWT 认证 刷新 Token 使用授权 简单授权 基于固定角色的授权 基于策略的授权 自定义策略授权 ...

  7. drf框架 - JWT认证插件

    JWT认证 JWT认证方式与其他认证方式对比: 优点 1) 服务器不要存储token,token交给每一个客户端自己存储,服务器压力小 2)服务器存储的是 签发和校验token 两段算法,签发认证的效 ...

  8. ASP.NET Web API 2系列(四):基于JWT的token身份认证方案

    1.引言 通过前边的系列教程,我们可以掌握WebAPI的初步运用,但是此时的API接口任何人都可以访问,这显然不是我们想要的,这时就需要控制对它的访问,也就是WebAPI的权限验证.验证方式非常多,本 ...

  9. CAS单点登录(一)——初识SSO

    转载:https://blog.csdn.net/Anumbrella/article/details/80821486 一.初识CAS 首先我们来说一下CAS,CAS全称为Central Authe ...

随机推荐

  1. jupyter的安装

    3.6:\Lib\site-packages\pip\models\index.py # PyPI = Index('https://pypi.python.org/') # 替换成 PyPI = I ...

  2. 注解实战BeforeMethed和afterMethed

    package com.course.testng;import org.testng.annotations.AfterMethod;import org.testng.annotations.Be ...

  3. 池(Pool)

    #1 就是一个资源的集合,用的时候按照你的需要去取,用完了给人家放回去 #2 学编程的时候,老师给我们的解释过池的意思,大概是: 如果你喝水,你可以拿杯子去水龙头接.如果很多人喝水,那就只能排队去接. ...

  4. LAMP自动安装脚本

    #!/bin/bash # 功能描述:LAMP自动安装脚本 # 初始化 if [ "$(cat /etc/system-release | awk '{print $(NF-1)}' | a ...

  5. Virtual Box 新建一个虚拟机安装系统(补充:WIN7 64 bit 系统虚拟机无法安装 64 bit 系统问题)

    1.安装Virtual Box好后,点击新建 2.配置内存大小,这个根据自己需要配置就好 3.创建虚拟硬盘 这里选择固定分配.动态分配都可以,接下来就分配硬盘大小了 4.新建好后我们点击刚才建立的虚拟 ...

  6. 使用uglifyjs压缩JS

    一般vue项目完成打包以后需要优化,特别是首次打开加载速度们,webpack打包以后js文件体积很大等方法,可以用这个方法来压缩js文件 安装node.js 安装当前应用 -- uglifyjs 如何 ...

  7. tp框架 验证码的应用注意事项

    1如何点击更换二维码 二维码是img标签的src访问生成二维码的方法.绑定点击事件,ajax的get方式请求生成二维码的函数.在U函数后面加上任意不重复的参数 如  ?rand=’+math.rand ...

  8. 2015 Multi-University Training Contest 1 hdu 5296 Annoying problem

    Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. 电子签章盖章之jQuery插件jquery.zsign

           简介:  使用jquery.zsign可以实现电子签章盖章效果,使用方便,只需提供自己的章图片.效果图如下:        页面引用:        <link href=&quo ...

  10. 玩转oracle学习第六天

     1.上节回想 2.PL/SQL的介绍 3.PL/SQL的基础 理解oracle的pl/sql概念 掌握PL/SQL编程技术(包含编写过程,函数,触发器.包... ) PL/SQL是什么? PL/ ...