zoukankan      html  css  js  c++  java
  • JWt的简单应用

    JWT 由三块组成,可以把用户名、用户 Id 等保存到 Payload 部分

     注意 Payload和 Header部分都是 Base64编码,可以轻松的 Base64解码回来。因此 Payload 部分约等于是明文的,因此不能在 Payload 中保存不能让别人看到的机密信息。虽然说 Payload 部分约等于是明文的,但是不用担心 Payload 被篡改,因为 Signature 部分是根据 header+payload+secretKey 进行加密算出来的,如果 Payload 被篡改,就可以根据 Signature 解密时候校验。

    1.加密

    Install-Package JWT  //需要.net 4.6.2,旧版要求低

    var payload = new Dictionary<string, object>
    
    {
    
             { "UserId", 123 },
    
             { "UserName", "admin" }
    
    };
    
    var secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";//不要泄露
    
     
    
    IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
    
    IJsonSerializer serializer = new JsonNetSerializer();
    
    IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
    
    IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
    
     
    
    var token = encoder.Encode(payload, secret);
    
    Console.WriteLine(token);

    2.解密

    var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.Qj w1epD5P6p4Yy2yju3-fkq28PddznqRj3ESfALQy_U"; 
    var secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";
    try {   IJsonSerializer serializer = new JsonNetSerializer();
      IDateTimeProvider provider
    = new UtcDateTimeProvider();   IJwtValidator validator = new JwtValidator(serializer, provider);   IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();   IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder); var json = decoder.Decode(token, secret, verify: true); Console.WriteLine(json); } catch (TokenExpiredException) {   Console.WriteLine("Token has expired"); } catch (SignatureVerificationException) {   Console.WriteLine("Token has invalid signature"); }

     试着篡改一下 Payload 部分。

    3.添加过期时间,过期时间即这个时间之后JWT不接受处理,时间的有效值为某一时刻和1970/1/1 00:00:00 相差的秒数

    下面的例子是当前时间到1970/1/1 00:00:00 的秒数,即过期时间为当前时间。如果设置为当前时间+10秒,可添加secondsSinceEpoch=secondsSinceEpoch+10

    IDateTimeProvider provider = new UtcDateTimeProvider();
    var now = provider.GetNow();
     
    var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // or use JwtValidator.UnixEpoch
    var secondsSinceEpoch = Math.Round((now - unixEpoch).TotalSeconds);
     
    var payload = new Dictionary<string, object>
    {
        { "exp", secondsSinceEpoch }
    };
    var secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";
    var token = encoder.Encode(payload, secret);
     
    var json = decoder.Decode(token, secret); // TokenExpiredException
  • 相关阅读:
    可变参数宏...和__VA_ARGS__
    gitolite
    CentOS 6.4 搭建git 服务器
    github简单使用教程
    【Github教程】史上最全github使用方法:github入门到精通
    redis安装与参数说明
    如何解决redis高并发客户端频繁time out?
    Redis配置文件参数说明
    Redis系列-存储篇hash主要操作函数小结
    Redis常用命令解析——INFO, MONITOR, SLOWLOG
  • 原文地址:https://www.cnblogs.com/shx666/p/7898492.html
Copyright © 2011-2022 走看看