首页 > 其他分享 >JWT中token的理解

JWT中token的理解

时间:2022-10-30 15:12:26浏览次数:88  
标签:Claim 加密 JWT token 理解 userInfo new

今天我们来聊一聊关于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

 

标签:Claim,加密,JWT,token,理解,userInfo,new
From: https://www.cnblogs.com/XFlyMan/p/16482674.html

相关文章

  • 11.校验token和解析token获取数据代码优化
    校验token和解析token获取数据代码优化解决方案基于ThreadLocal+拦截器的形式统一处理一、使用拦截器进行统一身份鉴权1.1定义拦截器packagecom.tanhua.server.i......
  • 4.JWT入门案例
    JWT入门案例一、简介JSONWebtoken简称JWT,是用于对应用程序上的用户进行身份验证的标记。也就是说,使用JWTS的应用程序不再需要保存有关其用户的cookie或其他sess......
  • 如何理解e.preventDefault();e.stopPropagation();?
    如何理解e.preventDefault();e.stopPropagation();?​​e.preventDefault();​​//阻止默认行为​​e.stopPropagation();​​//阻止冒泡行为在jQuery事件中returnfalse等......
  • C# 开发微信小程序 系列(1) 接入服务器 验证token
    目前官方小程序验证只有PHP的,暂未发现C#版本的 ,本人研究后贴出来大家分享下。有不懂的请留言,本人会尽快回复的:  废话不多说直接上代码:   ///<summary>//......
  • 持续交付知易行难,想做成这事你要理解这几个关键点
    前面几篇文章,我们介绍了非常基础的运维建设环节。如果我们想要这些运维基础建设发挥出更大的作用和价值,就需要针对运维场景进行场景化设计和自动化,让效率和稳定性真正提升......
  • remote: HTTP Basic: Access denied. The provided password or token is incorrect o
    具体错误:$gitpush--set-upstreamoriginquantum6remote:HTTPBasic:Accessdenied.Theprovidedpasswordortokenisincorrectoryouraccounthas2FAenabled......
  • JWT 的使用方式
     django中使用JWT https://blog.csdn.net/wolflxiaolu/article/details/124381344 中间件进行jwt校验middlewares/jwt.pyrestframework与pyJWT结合pipinstal......
  • 【线性代数】 抽丝剥茧系列之从投影的角度理解最小二乘
    承接上文【线性代数】抽丝剥茧系列之矩阵投影,本篇利用投影矩阵的原理实现最小二乘现在要求根据三个点(1,1)、(2,2)、(3,2)拟合出一条直线,根据待定系数设满足条件的直线......
  • 命名空间理解
    转自:https://bbs.csdn.net/topics/300176441,https://blog.csdn.net/qq_41230365/article/details/801919641.头文件不能使用using 在一段代码的开头引入命名空间的原因......
  • JWT认证
    参考文章:7.2.2.5JWT登录认证......