索引:

  • 第一部分 基本概念
  • 第二部分 使用流程
  • 第三部分 实现代码

第一部分 基本概念

JWT就是一个字符串,经过加密处理与校验处理的字符串,由三个部分组成。基于token的身份验证可以替代传统的cookie+session身份验证方法。三个部分分别如下:

 header.payload.signature

header部分:

{
"typ":"JWT",
"alg":"HS256"
}

这就是一个json串,两个字段都是必须的,alg字段指定了生成signature的算法,默认值为 HS256,可以自己指定其他的加密算法,如RSA.经过base64encode就可以得到 header.
payload部分:

$payload=['iss' => $issuer, //签发者'iat' => $_SERVER['REQUEST_TIME'], //什么时候签发的'exp' => $_SERVER['REQUEST_TIME'] + 7200 //过期时间'uid'=>1111];

signature部分
将 header和 payload使用header中指定的加密算法加密,当然加密过程还需要自定秘钥,自己选一个字符串就可以了。

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

php实现代码:

<?phppublic static function encode(array $payload, string $key, string $alg = 'SHA256'){$key = md5($key);$jwt = self::urlsafeB64Encode(json_encode(['typ' => 'JWT', 'alg' => $alg])) . '.' . self::urlsafeB64Encode(json_encode($payload));return $jwt . '.' . self::signature($jwt, $key, $alg);}public static function signature(string $input, string $key, string $alg){return hash_hmac($alg, $input, $key);}

将以上三个部分连起来就是JWT了。

参数解释

Screen-Shot-2018-09-06-at-3.24.30-PM.png

第二部分 JWT使用流程

1.png

实现步骤:

  • 用户登录:输入用户名和密码
  • 服务器进行用户名和密码的校验,通过之后生成JWT返回给前端
  • 每次用户请求API的时候都带上JWT
  • 服务端收到JWT做校验

第三部分 实现代码

首先composer安装一个JWT库,这里使用的是firebase的库,

composer require firebase/php-jwt

服务端在生成token时,加入少量的用户信息,比如用户的id。服务端接收到token之后,可以解析出这些数据,从而将token和用户关联了起来。

使用很简单,传入秘钥,生成Token:

private function generateToken($key){vendor('JWT.JWT');$key = $user_key;$token = array("iss" => "https://feifei50.com", // Issued At Claim"aud" => "https://feifei50.com", // Audience Claim"iat" => $_SERVER['REQUEST_TIME'], // Issued At Claim"nbf" => $_SERVER['REQUEST_TIME']-300, // Not Before Claim"exp" => $_SERVER["REQUEST_TIME"]+3600 // Expire Time Claim);$jwt = JWT::encode($token, $key);return $jwt;}

返回的$jwt大概是这个样子:

//eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZmVpZmVpNTAuY29tIiwiYXVkIjoiaHR0cHM6XC9cL2ZlaWZlaTUwLmNvbSIsImlhdCI6MTUzNjI2OTM4NSwibmJmIjoxNTM2MjYxMDY1LCJleHAiOjE1MzYyNzk1NjV9.W19LwKH2eQbYs6YHKkbk7bOQK2dBfmV8jcNGIN4OGlY

key就是用来混淆的,自己随便定义好了,encode 需要key,decode 也需要key,这里用md5加密一下,会加入一个令牌混淆加密

在前端拿到这个token之后就将这个token放在LocalStroage中,每发送AJAX请求的时候都带上这个token给服务端,服务端解码这个token来做校验,如果校验没有通过,那么强制其跳回登录页面。

firebase的这个JWT会在解码的时候做部分的校验,比如key是否正确,token是否expired之类的,具体参考源码,很容易理解。以后后端每次拿到这组Token就要从Token中进行解码:

解码Token

private function decodeToken($jwt,$user_key){JWT::$leeway = 300; // $leeway in seconds$decoded = JWT::decode($jwt, $user_key, array('HS256'));return $decoded;
}

这样解码之后就拿到了之前定义的payload的信息

本文作者熊冰,个人网站Bing的天涯路,转载请注明出处。

深入浅出:JWT(JSON Web Token)鉴权相关推荐

  1. jwt token 过期刷新_如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  2. 关于JWT(Json Web Token)的思考及使用心得

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...

  3. 关于JWT(Json Web Token)的思考及使用心得 1

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(https://tools.ietf.org/html/r...,一般用来做轻量级的API鉴权.由于许 ...

  4. 什么是 JWT -- JSON WEB TOKEN

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  5. JWT(JSON Web Token)简介及实现

    JWT(JSON Web Token):是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为Json对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信 ...

  6. JWT (Json Web Token)教程

    JWT(Json Web Token)是实现token技术的一种解决方案,JWT由三部分组成: header(头).payload(载体).signature(签名). 头 JWT第一部分是heade ...

  7. JWT(JSON web token)

    1.什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contain ...

  8. sau交流学习社区-songEagle开发系列:Vue + Vuex + Koa 中使用JWT(JSON Web Token)认证

    一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...

  9. 登录令牌JWT — JSON WEB TOKEN

    登录令牌JWT - JSON WEB TOKEN 关于作者 作者介绍

最新文章

  1. Laravel:使用Migrations
  2. 英语美句-每日积累-02
  3. java无效的源发行版_无效的Java
  4. FreeRTOS互斥锁
  5. python-环境安装-pycharm安装-新手入门可使用社区版
  6. editplus 快捷键及设置tab空白符及删除空格空行
  7. 分布式共识算法 (Consensus Algorithm)
  8. mysql 主从延迟
  9. 这个图像工具箱,让我找得好苦
  10. 计算机一级ps怎么保存,2017年计算机等考一级PS辅导:PS图像格式详细解说
  11. Ray Dalio:经济机器是怎样运行的 (时长30分钟)
  12. animation动画及3D
  13. 短址(short URL)原理及其实现 来源:http://blog.csdn.net/beiyeqingteng
  14. NOIP模拟赛 队爷的讲学计划
  15. 前端面试题精编2020(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)持续更新
  16. Win10电脑开机之后屏幕一直闪动解决方法
  17. win10打开软件提示无法成功完成操作 因为文件包含病毒
  18. 聚合数据 自己定义接口 超简单demo
  19. QGC地面站中视频流配置及gstreamer安装
  20. 单片机c语言的define,单片机C语言中define的妙用

热门文章

  1. Laravel repository数据仓库使用 Star.hou红楼一梦
  2. java gui切换面板,Java GUI,根据actionListener更改面板
  3. LD链接脚本解析-STM32F4xx
  4. Android音乐App桌面图标制作以及启动页面开发(简易音乐 一)
  5. C语言单引号和双引号
  6. 2019年,做努力奔跑的追梦人
  7. 使用IPFS作为Java项目的文件系统
  8. 记录--Openlayers 高德腾讯、百度、天地图坐标相互转换
  9. 语音合成接口整理_各平台语音合成接口
  10. [AGC018F] Two Trees