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.8K00
代码可运行
举报
运行总次数:0
代码可运行

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​《世界争霸》聊天API迁移至Serverless过程中踩过的坑和趟平的路
本文整理自董文强在Techo开发者大会「Serverless Summit」专场的演讲,感兴趣的读者可以扫码关注文末ServerlessCloudNative公众号,回复PDF,下载讲师演讲完整PDF。 为什么要采用云函数? 云函数SCF是腾讯云为企业和开发者们提供的无服务器执行环境,能够在无需购买和管理服务器的情况下运行代码。 最初,公司的需求是在确保性能的前提下,实现又省事、又省钱。采用云函数,用户不需要关注服务器、不用运维,非常省事。同时,云函数采用按需计费,用多少花多少,省钱。开发者只需要管理
腾讯云serverless团队
2019/11/12
4.3K0
​《世界争霸》聊天API迁移至Serverless过程中踩过的坑和趟平的路
前端学serverless系列——WebApplication迁移实践
本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。 导语:说起当前最火的技术,除了最新的区块链,AI,还有一个不得不提的概念是Serverless。Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展,从AWS Lambda到各厂商争先推出Serverless服务框架,Serverless一路高歌。在这个风口,前端好像都要做点什么? 目录: 一、Serverless简介 二、一个轻量web Application迁移实践
用户1097444
2022/06/29
5150
前端学serverless系列——WebApplication迁移实践
前端学serverless系列——WebApplication迁移实践
导语:说起当前最火的技术,除了最新的区块链,AI,还有一个不得不提的概念是Serverless。Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展,从AWS Lambda到各厂商争先推出Serverless服务框架,Serverless一路高歌。在这个风口,前端好像都要做点什么?
腾讯云serverless团队
2019/08/06
9890
前端学serverless系列——WebApplication迁移实践
导语: 说起当前最火的技术,除了最新的区块链,AI,还有一个不得不提的概念是Serverless。Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展,从AWS Lambda到各厂商争先推出Serverless服务框架,Serverless一路高歌。在这个风口,前端好像都要做点什么?
IMWeb前端团队
2019/12/04
7240
发布更新|腾讯云 Serverless 产品动态 20200813
一、云函数 SCF + Ckafka 联合转储方案正式发布 发布时间: 2020-08-06 产品背景: SCF + Ckafka 联合转储方案可以帮忙用户节省使用与开发成本,用户可以将 Ckafka 消息转储同步转储至消息队列 Ckafka,用于 Ckafka 集群间的数据同步。 产品功能 高度可定制化支持自定义换行符、数据筛选等,帮助开发者快速实现 Ckafka 各种的场景转储服务。 转储消息队列 Ckafka 的方案将使用云函数 SCF 的 Ckafka 触发器进行,通过 Ckafka 触发器将消息
腾讯云serverless团队
2020/08/14
1.4K0
黄文俊:Serverless架构及场景介绍
大家好,自我介绍一下,目前我是腾讯云无服务器云函数产品负责人。我做了很多年后端开发。今天是从一个程序员角度讲解一下我们怎么样用Serverless架构。
腾讯云开发者社区技术沙龙
2018/08/29
1.9K0
Serverless 应用实践及典型案例解析
为什么我们投入这么大时间和精力来做 Serverless 呢?因为我们坚信云计算的未来趋势之一就是 Serverless。因为 Serverless 让云服务的应用变得更加简单、高效。比如用云主机部署应用的时候,不仅要搭建和维护环境,同时也要评估业务的资源用量,尤其是对于运营类的活动,如果一旦评估的不准确,要么会造成资源的巨大浪费,要么服务可能会被打爆,甚至停服下线。
腾讯云serverless团队
2020/07/13
2.4K0
腾讯云消息队列Ckafka和TDMQ选型问题
目前随着技术架构不断演进,特别是微服务分布式技术兴起,很多大型网站逐步采用分布式的消息队列,用于面对流量高峰和异步处理,基于云上的消息队列逐步成为主流,接下来给大家一起介绍下腾讯云消息队列Ckafka及新推出的TDMQ相关产品特性、使用场景,以及系统对接,帮助大家更好做好技术选型。
邓愉悦
2020/10/23
8.9K1
腾讯云中间件产品月报(2021年第6期)
腾讯云中间件 - 微服务团队产品2021年6月简报: 微服务平台 TSF 服务监控模块优化,新增微服务网关可扩展性;解决日志模块大索引与索引过多导致日志检索慢、超时问题。 消息队列 CKafka 支持partition级别的监控;七月发布预览。 消息队列 TDMQ 支持AMQP协议兼容;升级大规模延时消息架构;支持全资源级别的CAM鉴权。 微服务引擎 TSE 子账号授权流程优化,默认多可用区部署,默认数据持久化;公网开通,后台监控运维系统发布。 弹性微服务TEM 扩展各种场景下的部署管理能力;支持
腾讯云中间件团队
2021/06/30
1.8K0
腾讯云云函数快速入门实践
云函数 (Serverless Cloud Function,SCF) 是腾讯云为企业和开发者们提供的无服务器执行环境。无服务器并非真的没有服务器,而是说用户无需购买服务器,无需关心服务器 CPU、内存、网络配置、资源维护、代码部署、弹性伸缩、负载均衡、安全升级、资源运行情况监控等,也就是说不用专门安排人力做这些,只需专注于代码编写并上传即可。很大程度上降低了研发门槛,提升业务构建效率。 由于 Serverless 拥有近乎无限的扩容能力,核心的代码片段完全由事件或者请求触发,平台根据请求自动平行调整服务
腾讯云serverless团队
2020/06/01
3.7K0
周维跃:Serverless 云函数架构精解
5月25日,云+社区技术沙龙-互联网架构成功举办。本期沙龙特邀请腾讯的技术专家分享关于技术架构、落地实践案例、无服务器云函数架构、海量存储系统架构等话题,从技术角度看架构发展,为开发者们带来丰富的实践经验内容,深度揭秘技术架构。下面是周维跃老师关于云函数架构的解析和函数冷启动的优化经验的分享。
腾讯云开发者社区技术沙龙
2019/06/03
10.8K0
周维跃:Serverless 云函数架构精解
Serverless ETL —— 蘑菇街实战落地
背景 蘑菇街旨在做一家高科技轻时尚的互联网公司,公司的核心宗旨就是购物与社区的相互结合,为更多消费者提供更有效的购物决策建议。 蘑菇街上每天有几百万网友在这里交流时尚、购物的话题,相互分享,这些行为会产生大量的数据,当这些数据源产生数据后,需要有一个组件获取数据源的数据,将数据写到 kafka,蘑菇街研发团队以往的解决办法,一是通过 Logstash、Filebeat 等开源的数据存储方案处理,二是自己写代码实现这种逻辑。 开始数据量小的时候还可以,随着业务的不断扩张,数据越来越大,为了保障可用性、可
腾讯云serverless团队
2020/09/10
8440
腾讯云 Serverless 技术演进
注:本文整理自上周六举办的「Hello Serverless」技术沙龙深圳站演讲内容,讲师是腾讯云 Serverless 产品架构师孔令飞,文末提供了讲师演讲 PDF 的下载,回复「Serverless 深圳」免费可得。 本文将从产品层面来介绍腾讯云是如何落地 Serverless 技术以及 Serverless 的技术演进。 ---- 目录 Serverless 是一项新技术,可能有朋友不是很熟悉。所以我们先介绍下 Serverless 的概念和发展历史,接着介绍腾讯云 Serverless 从 1.0
腾讯云serverless团队
2019/08/26
7.8K2
腾讯云 Serverless 技术演进
11月腾讯云微服务&中间件产品动态
腾讯云中间件 - 微服务团队产品2021年11月简报: API网关:支持参数流控插件、支持自定义响应体插件;支持直通TKE Pod,可通过API网关享受认证鉴权、流量控制、灰度分流等能力。 微服务引擎 TSE 注册配置中心 :Nacos组件实现客户端与控制台访问内网方式与外网方式解耦,用户自主通过开关控制。 微服务引擎 TSE 服务治理中心:PolarisMesh(北极星)治理中心支持多语言服务注册与发现、支持K8s service注册至PolarisMesh(北极星),同时增强了可观测性能力。
腾讯云中间件团队
2021/12/03
1.8K0
腾讯云函数在开发中的实践
腾讯云函数在它的帮助文档里面有已经提到了它的几个具体实践,通过管中窥豹,我也来谈谈在具体业务中的几个实践。
槽痞
2020/09/20
3.1K0
Serverless无服务器架构详解
Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生架构的核心组成部分。
zhayujie
2020/08/03
4.9K0
Serverless无服务器架构详解
10月最新动态!
腾讯云中间件 - 微服务团队产品2021年10月简报: API网关:正式发布云原生网关 ,完美兼容开源 Kong 网关,为您幅度降低网关建设成本;支持条件路由插件,支持自定义认证/请求体插件。 微服务引擎 TSE :发布子产品服务注册中心、配置中心、治理中心。支持一键创建、免运维、高可用、开源增强的组件托管服务。 消息队列 TDMQ: 支持开源RabbitMQ备用交换机能力;支持客户端代码声明功能,原Spring内置客户端使用MQ的客户可以无缝迁移至TDMQ; 支持独占消费、支持集群维度的数据统计
腾讯云中间件团队
2021/11/09
8190
发布更新|腾讯云 Serverless 产品动态 20201222
一、云函数支持 MPS 触发器正式发布 发布时间: 2020-12-11 产品背景: 为了更好的满足对MPS 消息回调的诉求,支持回调通知、接收消息,消息处理等拓展能力,新增MPS触发器。 产品功能: 通过云函数(SCF)+ MPS 结合的方式,可帮助用户快速完成对 视频处理 MPS 产生的回调事件进行处理及操作。MPS 触发器 将事件推送到 SCF ,再通过 Serverless 无服务架构的函数计算提供回调事件的处理及响应,深度优化了 MPS 事件通知的解决方案。 典型场景:MPS 上传文件时转码结果
腾讯云serverless团队
2020/12/23
1.2K0
腾讯云 Serverless 云函数实现 CKafka 数据转存到 ES
背景介绍 腾讯云 Serverless 云函数是下一代通用计算平台,提供安全稳定、高效易用的低成本无服务器运行环境。随着 Kafka 社区的繁荣,越来越多的用户开始使用 Kafka 来做日志收集、大数据分析、流式数据处理等。而公有云上的产品 Ckafka 也借助了开源社区的力量,做了很多优化: 基于 ApacheKafka 的分布式、高可扩展、高吞吐 100% 兼容 Apache KafkaAPI(0.9 及 0.10) 无需部署,直接使用 Kafka 所有功能 ckafka 封装所有集群细节,无需用户运
腾讯云serverless团队
2020/08/10
1.1K0
【云原生|实践指北】5:真实业务场景下云原生项目落地实践学习
C站这么多大佬都讲了如何去实践Docker或者K8s简单实战,笔者也没有真实做过一些云原生实战项目,都是跟着B站大学学过一些简单概念与基本入门的命令。也就不多写这些知识了!
程序员洲洲
2024/06/07
1730
【云原生|实践指北】5:真实业务场景下云原生项目落地实践学习
相关推荐
​《世界争霸》聊天API迁移至Serverless过程中踩过的坑和趟平的路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验