JWT中token的理解
今天我们来聊一聊关于JWT授权的事情。
JWT:Json Web Token。顾名思义,它是一种在Web中,使用Json来进行Token授权的方案。
既然没有找好密码,token是如何解决信任问题的呢?
解决信任问题,只需要解决两个问题即可:
token是不是来自我信任的机构颁发
token中的信息是否被篡改
对于第一个问题而言,确认token确实是由被信任的第三方颁发的,一般都是通过加密算法来建立信任,颁发时使用密钥进行加密,如果能够对加密内容进行正常解密说明token来自信任方。常用的加密算法分为:
对称可逆加密:使用同一个秘钥来加密解密,如果token能解密就能证明来源,秘钥不对外公开
非对称可逆加密:使用一组秘钥对(私钥加密+公钥解密),如果token能使用公钥进行解密就能证明来源,公钥与私钥之间互相不可推算
优缺点:
对称可逆加密效率高,速度快,但是由于对称可逆加密使用的是同一个秘钥,所以必须向解密的应用提供秘钥,相对而言不安全,所以一般只用于内部应用之间。
非对称可逆加密速度相对慢一些,但是加密时通过私钥加密而解密时只需要提供公钥即可,所以用于对外提供加密机制更加安全可靠,所以多用于向第三方提供加密服务时使用。
算法举例:
HS256
HS256 (带有 SHA-256 的 HMAC 是一种对称算法, 双方之间仅共享一个 密钥。由于使用相同的密钥生成签名和验证签名, 因此必须注意确保密钥不被泄密。
2 RS256
RS256 (采用SHA-256 的 RSA 签名) 是一种非对称算法, 它使用公共/私钥对: 标识提供方采用私钥生成签名, JWT 的使用方获取公钥以验证签名。由于公钥 (与私钥相比) 不需要保护, 因此大多数标识提供方使其易于使用方获取和使用 (通常通过一个元数据URL)。
JWT格式说明
| JWT令牌格式 | 作用 | |
| Header | 头 | { "alg": "HS256", "typ": "JWT"} |
| Payload | 有效载荷 | 使用base64进行序列化,任何人都可以读到,所以不要包含敏感信息 |
| Signature | 签名 |
防止抵赖-防止篡改,一旦头和有效载荷有内容被篡改,则生成签名部分必将与原内容不同 =HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) |
JWT如何解决信任问题的呢?
将签名部分使用秘钥进行解密,如果可以正常解开,说明令牌来自信任方颁发,将解密后的内容与JWT的头部和有效载荷的base64编码内容对比是否一致,如果一致,说明令牌未被篡改。也就解决了token信任的第二个问题。
算法实现:
下面是使用上述的两种加密算法生成的jwt
HS256算法实现
1 public string GetToken(UserInfoDTO userInfo)
2 {
3 string secretKey = _configuration["SercetKey"];
4 var signingCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)), SecurityAlgorithms.HmacSha256);
5
6 var claims = new Claim[] {
7 new Claim("id",userInfo.Id.ToString()),
8 new Claim("age",userInfo.Age.ToString()),
9 new Claim("name",userInfo.Name),
10 new Claim("mobile",userInfo.Mobile),
11 new Claim("email",userInfo.EMail),
12 new Claim("role",userInfo.Role),
13 };
14
15 var token = new JwtSecurityToken(
16 issuer: _configuration["Issuer"], //发行人
17 audience: _configuration["Audience"], //受众人
18 claims: claims,
19 expires: DateTime.UtcNow.AddMinutes(2),//60分钟有效期
20 notBefore: DateTime.UtcNow.AddMinutes(1),//1分钟后有效
21 signingCredentials: signingCredentials);
22 string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
23 return returnToken;
24 }
RSA256算法实现
1 public string GetToken(UserInfoDTO userInfo)
2 {
3 string filepath = Directory.GetCurrentDirectory();
4 RSAParameters rSAParameter = default(RSAParameters);
5 //没有生成过私钥文件,就创建,否则读取私钥
6 if (!File.Exists(Path.Combine(filepath, "key.private.json")))
7 {
8 rSAParameter = GenerateAndSaveKey(filepath);
9 }
10 else
11 {
12 rSAParameter = JsonConvert.DeserializeObject<RSAParameters>(File.ReadAllText(Path.Combine(filepath, "key.private.json")));
13 }
14
15 var signingCredentials = new SigningCredentials(new RsaSecurityKey(rSAParameter), SecurityAlgorithms.RsaSha256);
16 var claims = new Claim[] {
17 new Claim("id",userInfo.Id.ToString()),
18 new Claim("age",userInfo.Age.ToString()),
19 new Claim("name",userInfo.Name),
20 new Claim("mobile",userInfo.Mobile),
21 new Claim("email",userInfo.EMail),
22 new Claim("role",userInfo.Role),
23 };
24
25 var token = new JwtSecurityToken(
26 issuer: _configuration["Issuer"], //发行人
27 audience: _configuration["Audience"], //受众人
28 claims: claims,
29 expires: DateTime.UtcNow.AddMinutes(60),//60分钟有效期
30 notBefore: DateTime.UtcNow.AddMinutes(1),//1分钟后有效
31 signingCredentials: signingCredentials);
32 string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
33 return returnToken;
34 }
在postman中请求:

将返回的jwt拿到jwt官网解析即可看到已经包含了我们需要传递的内容。因为jwt中传递的内容可以被看到,所以一定不要传递类似密码这类敏感信息

创建一个webapi项目,作为受保护的资源,开启权限认证,并使用jwt作为鉴权方式
1 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
2 .AddJwtBearer(configureOptions =>
3 {
4 configureOptions.TokenValidationParameters = new TokenValidationParameters
5 {
6 ValidAudience = Configuration["Audience"],
7 ValidateAudience = true,
8 ValidIssuer = Configuration["Issuer"],
9 ValidateIssuer = true,
10 ValidateLifetime = false,
11 LifetimeValidator = (notBefore, expires, securityToken, validationParameters) => {
12 DateTime now = DateTime.UtcNow;
13 if (now.CompareTo(notBefore) < 0 || now.CompareTo(expires) > 0)
14 return false;
15 return true;
16 },
17 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SercetKey"])), //对称加密方式,获取密钥
18 //IssuerSigningKey = new RsaSecurityKey(GetPulicKey()), //非对称加密方式,获取第三方提供的公钥
19 ValidateIssuerSigningKey = true,
20
21 };
22 });
不传递token请求受保护的api,则会返回401

加上获取的token,则可以正常请求

项目源码链接: https://pan.baidu.com/s/1u9Lu7rLq7swSXOdV_sNh-g?pwd=mxfg
JWT中token的理解的更多相关文章
- Jwt 中 token应该存储到哪里?
关于 token 的存储问题 JWT: csrf 攻击无法获取第三方的 cookie,而是直接使用 cookie进行查询的时候会自动携带 cookie. xss攻击通过代码注入可以获取 cookie. ...
- jwt的token如何使用
JWT简介: JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式).它是在Web环境下 ...
- ASP.NET WebApi 基于JWT实现Token签名认证
一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...
- SpringBoot集成JWT实现token验证
原文:https://www.jianshu.com/p/e88d3f8151db JWT官网: https://jwt.io/ JWT(Java版)的github地址:https://github. ...
- 基于JWT的Token开发案例
代码地址如下:http://www.demodashi.com/demo/12531.html 0.准备工作 0-1运行环境 jdk1.8 maven 一个能支持以上两者的代码编辑器,作者使用的是ID ...
- 利用jwt生成token,用于http请求身份验证
前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...
- cookie,session,token的理解
Get POST 区别异同点 淘宝token的 理解 过程算法 防止伪造请求 伪造相对难 简单发展史 登录的操作: 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个 ...
- tp5使用jwt生成token,做api的用户认证
首先 composer 安装 firebase/php-jwt github:https://github.com/firebase/php-jwt composer require firebas ...
随机推荐
- MySQL-报错:Error when bootstrapping CMake:
在进行MySQL的源码安装的时候,系统上找不到合适的C编译器,GCC忘了装,莫慌,直接 yum命令装上gcc,还有gcc-C++没装的话后面也会提示错误,一起装上,,, [root@localhos ...
- 【java】学习路径23-拆箱与装箱
拿Integer类型和int类型来举例子. 装箱,基本给引用.下面的代码相当于Integer i_test = Integer.valueOf("100"); 注意!过程是自动的. ...
- CF-1675D. Vertical Paths
题意:每次可以选择一条路径,要求这条路径中每个点都是上一个点的子节点,求最少需要几条路径将所有点走完 思路:将每个点有没有子节点判断出来,因为只有没有子节点的点需要新增一条路,所以需要路径的最小数目就 ...
- grub2配置文件丢失如何修复
实验操作准备 此步骤因实验需要所做,系统开机属grub界面无需此步! lsblk命令为了查看根分区挂载在什么位置 rm -rf /boot/grub2/grub.cfg命令为删除grub2配置文件到达 ...
- UE4自动打包工具编写
在UE的开发中,有些项目需要针对不同版本出不同的包,并有一个对应的GUI界面,供大家使用. 1.插件编写 先使用UE4自己的插件模板创建插件,做成插件形式 然后注册Slate UI,编写打开逻辑.并在 ...
- Grafana Mimir:支持乱序的指标采集
Grafana Mimir:支持乱序的指标采集 译自:New in Grafana Mimir: Introducing out-of-order sample ingestion 很早之前在使用th ...
- 输入法词库解析(四)百度分类词库.bdict(.bcd)
前言 .bdict 是百度的分类词库格式,可以在 https://shurufa.baidu.com/dict 下载. 手机百度的分类词库格式 .bcd 是一样的,可以在 https://mime.b ...
- C#非托管泄漏中HEAP_ENTRY的Size对不上是怎么回事?
一:背景 1. 讲故事 前段时间有位朋友在分析他的非托管泄漏时,发现NT堆的_HEAP_ENTRY 的 Size 和 !heap 命令中的 Size 对不上,来咨询是怎么回事? 比如下面这段输出: 0 ...
- Coprime
Coprime 前置芝士 莫比乌斯反演 正文 首先,我们来分析题意. 题目中给出 \(n\) 个人,每个人有一个编号 \(k\) ,要求我们从中选出 \(3\) 个人,三人编号分别为 \(k_a\) ...
- Kubernetes的kubectl常用命令速记
文章转载自:https://mp.weixin.qq.com/s/0kqQzeA-MzCOhPMkmiR4_A kubectl是用来管理Kubernetes集群的命令行工具. kubectl默认在&q ...