文档章节

JWT - Json Web Token

麦拂沙
 麦拂沙
发布于 2017/06/17 14:37
字数 677
阅读 194
收藏 2
JWT

JWT是基于Json的开放标准,其定义了安全、紧凑、自包含的信息交换协议

优点

  • 跨平台、跨域、轻量级的传输
  • 可用于无状态的 身份认证、信息交换
  • JWT中的载荷信息是可信的(因为签名的存在)
  • 广泛用于分布式系统的SSO单点登录
  • OAUTH2中引入JWT能极大的简化认证流程
    • 授权服务器不需要维护Token存储
    • 资源服务器也不必要求Token检查
    • 减少了服务间的HTTP通信

缺点

  • JWT中存储信息如果过多很容易造成Token过大(可通过jti换取Redis集中存储中的用户信息 解决该问题)

组成

JWT由以下三部分Json数据的Base64Url密文,点号拼接而成

  1. Headers:包括ALGORITHM、TOKEN TYPE
  2. PAYLOAD:数据载荷,包括了三类claim信息
    • Reserved claims预定义信息(包括iss签发者exp过期时间sub请求者aud接收者nbf起效时间iat签发时间jti唯一标识
    • Public claims自定义信息
    • Private claims订阅方和接受方的协议信息
  3. Signature:签名(可选HS256(对称加密)RS256(非对称加密)两种签名算法)
	HMACSHA256(  #HS256签名算法
		base64UrlEncode(header) + "." + base64UrlEncode(payload),
		secret
	)

使用

HTTP头部带上Token信息

Authorization: Bearer jwt_token

Apache配置

Apache默认丢弃结构特殊、非base64编码的Authorization头部,所以需要额外配置下

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

Laravel JWT-Auth

## 安装 ##
composer require tymon/jwt-auth:0.5.*
#注册
Tymon\JWTAuth\Providers\JWTAuthServiceProvider
'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
#发布配置
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
#生成秘钥
php artisan jwt:generate

## 配置 ##
- secret  签名秘钥
- ttl  token生存时间/min
- refresh_ttl  token刷新生存时间/min
- algo  token签名算法(维持默认即可)
- user  User模型名字空间
- identifier  对应于token subject claim的User模型标识
- required_claims  token中必须携带的chaim
- blacklist_enabled  若为false则刷新令牌后老令牌还是不会失效

## 签发令牌 ##
# 1. 快捷签发 #
$customClaims = [...]  #尽量控制chaim信息量以防token过大
$token = JWTAuth::attempt($credentials [, $customClaims])  #尝试登陆并签发令牌
$token = JWTAuth::fromUser($user [, $customClaims])  #基于用户签发令牌
# 2. 底层自定义签发 #
$payload = JWTFactory::make($customClaims)
$payload = JWTFactory::sub(xxx)->aud(xxx)->foo($customClaims)->make()
$token = JWTAuth::encode($payload)

## 认证 ##
# 1. 客户端请求提供token #
- HTTP头部方式:Authorization: Bearer JWT_Token
- Query方式:?token=JWT_Token
# 2. 解析请求中的token #
$token = JWTAuth::getToken()
$user = JWTAuth::parseToken()->authenticate()
JWTAuth::setToken('xxx.yyy.zzz') #手动设置一个jwt

## 中间件 ##
protected $routeMiddleware = [
    ...
    'jwt.auth' => 'Tymon\JWTAuth\Middleware\GetUserFromToken',
    'jwt.refresh' => 'Tymon\JWTAuth\Middleware\RefreshToken',
];
1. GetUserFromToken中间件 检查并解析token,否则抛出异常
	- tymon.jwt.absent
	- tymon.jwt.expired
	- tymon.jwt.invalid
	- tymon.jwt.user_not_found
	- tymon.jwt.valid
2. RefreshToken中间件  每次请求刷新token

© 著作权归作者所有

共有 人打赏支持
上一篇: Laravel常用包整理
下一篇: Laravel Dingo API
麦拂沙
粉丝 22
博文 112
码字总数 100094
作品 1
海淀
高级程序员
私信 提问
[笔记] JWT Java Json Web Token (一)

jwt实现 JWT简单介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。J...

z201
2017/10/22
0
0
深入浅出JWT(JSON Web Token )

1. JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象安全传输信息。 这些信息可以通...

mantoudev
05/05
0
0
JSON Web Token jwt

文章转自:http://www.ruanyifeng.com/blog/2018/07/jsonweb_token-tutorial.html JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。 一、跨域认证的问题...

daos
08/29
0
0
JSON Web Token 入门教程

JSON Web Token 入门教程 作者: 阮一峰 日期: 2018年7月23日 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。 一、跨域认证的问题 互联网服务离不开...

祖冲之
07/24
0
0
什么是JWT(JSON WEB TOKEN)

转自于:http://www.jianshu.com/p/576dbf44b2ae 什么是JWT Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,...

莫问今朝乄
2017/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Nginx/Apache/PHP Hidden Version Number

nginx隐藏版本号的方法 在nginx配置文件nginx.conf中,加入以下代码: server_tokens off; apache隐藏版本号的方法 在apache配置文件httpd.conf中,加入以下代码: ServerTokens ProdServer...

Linux就该这么学
2分钟前
0
0
iOS 滚动视图 UIScrollView 代理方法 相关属性 状态栏 滚动条 回弹 弹簧效果

iOS 滚动视图 UIScrollView 代理方法 相关属性 状态栏 滚动条 回弹 弹簧效果 #import "ViewController.h"@interface ViewController () <span style="color:#ff0000;"><UIScrollViewDel......

壹峰
8分钟前
0
0
【转】Hive 工作原理详解

什么是Hive? Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。...

hnairdb
8分钟前
0
0
开源 java CMS - FreeCMS2.8 微信管理 公众号设置

项目地址:http://www.freeteam.cn/ 公众号设置 管理员可以在这里设置微信公众号的相关配置,每个站点都可设置自己的微信公众号。 其中接口URL需要配置在微信公众号中,如下图所示 App Key ...

freeteam
10分钟前
0
0
MySQL中 replace 函数应用

将以下字段中的【忻州】替换为【洛阳】 Sql语句如下 UPDATE sys_organization SET org_name = REPLACE(org_name,'忻州','洛阳'); 执行结果如下...

karma123
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部