Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JSON Web Token 入门教程

JSON Web Token 入门教程

作者头像
兔云小新LM
发布于 2019-09-17 02:53:50
发布于 2019-09-17 02:53:50
3.8K01
代码可运行
举报
运行总次数:1
代码可运行

JWT是什么?

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。它是有三部分组成,示例如下,具体的讲解如下(jwt是不会有空行的,下面只是为了显示,便使用了换行看着比较方便)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjMfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

它是由一个"."号隔开、三部分组成。第一部分是header信息,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{  "alg": "HS256",// 加密的算法  "typ": "JWT"// 加密的方式,填写JWT}

第二部分是Payload,有固定的六个部分和自定义数据组成,自定义数据看自己的情况需要来定义,是可以省去的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'iss' => 'https://www.qqdeveloper.com',// 签发人'exp' => time() + 86400,// 过期时间(这里的有效期时间为1天)'sub' => '主题内容',// 主题'aud' => '受众内容',// 受众'nbf' => $time,// 生效时间'iat' => $time,// 签发时间'jti' => 123,// 编号

第三部分是Signature(是对前两部分加密得来的)。由于前两部分是公开透明的数据,因此防止数据的篡改和泄露,我们需要加密处理。首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
第一部分的加密方式(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

最终生成的就是上面很长的一段字符串了。

为什么会使用JWT

这就需要从我们传统的认证模式来说了,传统的认证模式是基于session和cookie来实现用户的认证和鉴权。具体的流程模式如下图

(图一)Session与Cookie认证与鉴权

1.客户端向服务端发送一个http请求。

2.服务端在收到客户端的请求时,生成一个唯一的sessionid,这里需要将该生成的session存储在服务端,这个sessionid存储具体的session内容,默认的是文件存储,当然我们可以修改具体的存储方式,例如数据库存储。3.客户端在接受到这个sessionid时,存在cookie里面,每次请求时携带该sessionid。4.服务端在接收到客户端的请求之后,根据客户端发送的sessionid来进行认证与授权。这里也推荐一下自己之前分享的一篇有关session于cookie的知识点。session与cookie详解

(图二)传统的token授权

1.客户端向服务端发送一个http请求。

2.服务端在收到客户端的请求之后,生成一个唯一token,这里需要将该生成的token存储在服务端,至于怎么存,可以和上面session与cookie的方式一致。也可以存在缓存数据库中,如redis,memcached。3.服务端将该token返回给客户端,客户端存在本地,可以存请求头header中,也可以存在cookie中,同时也可以存在localstorage中。4.向服务端发送请求时,携带该token,服务端进行认证或者授

(图三)JWT认证模式

1.客户端向服务端发送一个http请求。

2.服务端根据jwt的生成规则,生成一个token,并返回给客户端,这里服务端是不需要存储的。3.客户端在接受到该token时,存在客户端。4.客户端向服务端发送请求时,服务端对请求的token进行解析,如果发现解析出来的数据和生成的数据是一致的代表是一个合法的token,则进行相应的操作。

基于session和cookie的认证和鉴权模式有什么好与不好的地方呢?总结如下几点:

通过上面几张图,我们也大致可以看得出来,基于session都是需要服务端存储的,而JWT是不需要服务端来存储的。针对以上几点,总结如下:一、缺点 1.容易遇到跨域问题。不同域名下是无法通过session直接来做到认证和鉴权的。2.分布式部署的系统,需要使用共享session机制 3.容易出现csrf问题。

二、优点 1.方便灵活,服务器端直接创建一个sessionid,下发给客户端,客户端请求携带sessionid即可。2.session存储在服务端,更加安全。3.便于服务端清除session,让用户重新授权一次。

JWT与session有什么区别呢?

JWT是基于客户端存储的一种认证方式,然而session是基于服务端存储的一种认证方式。JWT虽然不用服务端存储了,也可以避免跨域、csrf等情况。但也存在如下几个不太好的地方。1.无法清除认证token。由于JWT生成的token都是存储在客户端的,不能有服务端去主动清除,只有直到失效时间到了才能清除。除非服务端的逻辑做了改变。2.存储在客户端,相对服务端,安全性更低一些。当JWT生成的token被破解,我们不便于清除该token。

如何使用JWT

这里推荐使用GitHub上面人家封装好的包,这里我使用的是firebase/php-jwt,在项目中直接使用即可安装成功。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
composer require firebase/php-jwt

接下来创建一个控制器,我这里使用的ThinkPHP5.1的框架

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use think\Controller;use Firebase\JWT\JWT;
class Test extends Controller{    private $key = 'jwtKey';
    // 生成JWT    public function createJwt()    {        $time  = time();        $key   = $this->key;        $token = [            'iss' => 'https://www.qqdeveloper.com',// 签发人            'exp' => $time + 86400,// 过期时间(这里的有效期时间为1天)            'sub' => '主题内容',// 主题            'aud' => '受众内容',// 受众            'nbf' => $time,// 生效时间            'iat' => $time,// 签发时间            'jti' => 123,// 编号            // 额外自定义的数据            'data' => [                'userName' => '编程浪子走四方'            ]];        // 调用生成加密方法('Payloadn内容','加密的键',['加密算法'],['加密的可以'],['JWT的header头'])        $jwt = JWT::encode($token, $key);        return json(['data' => $jwt]);    }
    // 解析JWT    public function analysisJwt()    {        try {            $key = $this->key;            $jwt = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlLm9yZyIsImV4cCI6MTU2ODA5NjE4MCwic3ViIjoiXHU0ZTNiXHU5ODk4XHU1MTg1XHU1YmI5IiwiYXVkIjoiXHU1M2Q3XHU0ZjE3XHU1MTg1XHU1YmI5IiwibmJmIjoxNTY4MDA5NzgwLCJpYXQiOjE1NjgwMDk3ODAsImp0aSI6MTIzLCJkYXRhIjp7InVzZXJOYW1lIjoiXHU3ZjE2XHU3YTBiXHU2ZDZhXHU1YjUwXHU4ZDcwXHU1NmRiXHU2NWI5In19.kHb_9Np0zjE25YE9czUEGvmFPYtqMJT9tuZzJTuMZl0';            // 调用解密方法('JWT内容','解密的键,和加密时的加密键一直','加密算法')            $decoded = JWT::decode($jwt, $key, array('HS256'));            return json(['message' => $decoded]);        } catch (\Exception $exception) {            return json(['message' => $exception->getMessage()]);        }
    }}

通过访问第一个方法,可以生成下图一段字符串

我们将上图中的字符串复制到第二图中的$jwt变量,访问第二个方法即可解析出具体的数据。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡二条的技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JSON Web Token跨域认证解决方案 使用详解
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。它是有三部分组成,示例如下,具体的讲解如下(jwt 是不会有空行的,下面只是为了显示,便使用了换行看着比较方便)。
OwenZhang
2021/12/08
1.8K0
JSON Web Token跨域认证解决方案 使用详解
​一起重新全面认识JWT-Json Web Token
在这里,我整理了一下网上资源。在文章最后,有一个使用Java实现JWT生成和验证的完整案例。
谙忆
2021/02/20
1.2K0
​一起重新全面认识JWT-Json Web Token
JSON Web Token 入门教程
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。
ruanyf
2018/07/30
7370
JSON Web Token 入门教程
JSON Web Token 入门教程
JSON Web Token(JWT)是一种可以在多方之间安全共享数据的开放标准,JWT 数据经过编码和数字签名生成,可以确保其真实性,也因此 JWT 通常用于身份认证。这篇文章会介绍什么是 JWT,JWT 的应用场景以及组成结构,最后分析它的优点及局限性。
未读代码
2024/03/25
4990
JSON Web Token 入门教程
token的使用及原理
说起JWT,我们应该来谈一谈基于token的认证和传统的session认证的区别。
IT云清
2019/01/22
5.2K0
Session、Cookie、Token 【浅谈三者之间的那点事】
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
IT茂茂
2020/09/24
22.6K1
Session、Cookie、Token 【浅谈三者之间的那点事】
JWT(JSON Web Token)
HTTP Basic Auth 一种最古老的安全认证方式,这种方式就是简单的访问API的时候,带上访问的username和password,由于信息会暴露出去,所以现在也越来越少用了。
Se7en258
2021/05/18
1.1K0
JWT(JSON Web Token)
更加优雅的Token认证方式JWT
通过上一篇你大体已经了解session和cookie认证了,session认证需要服务端做大量的工作来保证session信息的一致性以及session的存储,所以现代的web应用在认证的解决方案上更倾向于客户端方向,cookie认证是基于客户端方式的,但是cookie缺点也很明显,到底有哪些缺点可以跳转上一次的文章。那有没有一种比较折中的方案呢?有的
架构师修行之路
2019/09/09
1.3K0
JWT(JSON Web Token)
使用JWT来传输数据,实际上传输的是一个字符串,这个字符串就是所谓的 json web token 字符串。所以广义上,JWT是一个标准的名称;狭义上,JWT指的就是用来传递的那个token字符串。这个串有两个特点:
用户1212940
2022/04/13
5790
JWT(JSON Web Token)
浅谈json web token及应用
Json Web Token (JWT),是一个非常轻巧的规范,这个规范允许在网络应用环境间客户端和服务器间较安全的传递信息。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。
我的小碗汤
2018/08/22
4850
浅谈json web token及应用
基于 JWT + Refresh Token 的用户认证实践
HTTP 是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个 IP 不代表同一个用户),在 Web 应用中,用户的认证和鉴权是非常重要的一环,实践中有多种可用方案,并且各有千秋。
lyb-geek
2019/06/18
2K1
基于 JWT + Refresh Token 的用户认证实践
JSON Web Token 长文扫盲帖
本文要是讲 JWT(JSON Web Token) ,我刚接触这个这个知识点的时候,心路历程是这样的:
JSCON简时空
2020/04/27
1.7K0
五分钟带你了解Cookie、Session、Token 和 JWT
根据上图可以看到,从用户请求发起,到服务端完成操作,流程颇多,但是HTTP无状态,我们如何才能详细记录这些操作过程并加以严格的权限判断控制,接下来就开始今天的主题!
周三不加班
2019/09/03
1.2K0
五分钟带你了解Cookie、Session、Token 和 JWT
基于Token的身份验证---session、token、jwt
HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
躺平程序员老修
2023/09/05
4950
Jwt,Token,Cookie,Session之间的区别
认证是关于验证你的凭据,如用户名/邮箱和密码,以验证访问者的身份。系统确定你是否就是你所说的使用凭据。在公共和专用网络中,系统通过登录密码验证用户身份。身份认证通常通过用户名和密码完成,有时与认证可以不仅仅通过密码的形式,也可以通过手机验证码或者生物特征等其他因素。
程序员Leo
2023/11/17
1.1K0
Jwt,Token,Cookie,Session之间的区别
JWT 登录认证
✨ Token 认证流程 作为目前最流行的跨域认证解决方案,JWT(JSON Web Token) 深受开发者的喜爱,主要流程如下: 客户端发送账号和密码请求登录 服务端收到请求,验证账号密码是否通过 验证成功后,服务端会生成唯一的 token,并将其返回给客户端 客户端接受到 token,将其存储在 cookie 或者 localStroge 中 之后每一次客户端向服务端发送请求,都会通过 cookie 或者header 携带该 token 服务端验证 token 的有效性,通过才返回响应的数据 图片 ✨
江户川码农
2022/07/04
4.7K3
JWT 登录认证
什么是JWT(JSON WEB TOKEN)
转自于:http://www.jianshu.com/p/576dbf44b2ae
莫问今朝
2018/08/31
1.1K0
什么是JWT(JSON WEB TOKEN)
SpringBoot2.x+Shiro+JWT整合实现token认证(上)
正文开始前,先说一个自己的面试时被问的一个问题:说一下session+cookie认证和token认证的区别?
有来技术
2023/04/28
1.2K0
SpringBoot2.x+Shiro+JWT整合实现token认证(上)
浅谈一下前后端鉴权方式 ^.^
虽然本人现在从事前端开发,但是之前一直是 PHP 全栈,所以对前后端鉴权机制也有一定的了解,就找些资料简单记录一下吧。(瞎掰扯~)
老猫-Leo
2023/12/11
6490
浅谈一下前后端鉴权方式 ^.^
你们leader 可能都不知道的用户鉴权机制的原理
互联网年代,一个网站的用户数,就是这个网站的命脉,那么,这些用户的账户安全问题很成问题,于是行业大佬们,开始忧国忧民,研究出很多解决当下痛点的解决方案。从最开始的前后端不分离,研究出来的session-cookie,到后来基于前端存储的Token 验证 ,后来网站越来越多多了,为了不总是注册账号推出来的OAuth权限,以及一个公司项目太多了,为了防止重复登录开启的单点登录。
用户7413032
2022/03/09
1.4K0
你们leader 可能都不知道的用户鉴权机制的原理
相关推荐
JSON Web Token跨域认证解决方案 使用详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档