如何验证生成的JWT Token有效性?jwt.io显示签名无效
JWT签名无效问题排查与验证方案
问题描述
生成的JWT Token在jwt.io显示"invalid signature":
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiVFRJRCI6IjEyMzQ1NiIsImV4cCI6MTY4Nzc2Mzg3MiwiaXNzIjoic2FtcGxlIiwiYXVkIjoic2FtcGxlIn0.SUHPiDut67KM6LcbzYEF2CCMKiQlB5JMdiqqgIurJHg
生成Token的C#代码如下:
private static string generateJwtToken(string username, string password, string TTid) { System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) => { return true; }; User user = new User(); user.Username = username; user.Password = password; user.TTID = '123456'; var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes("sample2023TTTTASASA"); var securityKey = new SymmetricSecurityKey(key); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var secToken = new JwtSecurityToken( signingCredentials: credentials, issuer: "sample", audience: "sample", claims: new Claim[] { new Claim("userName", user.Username.ToString()), new Claim("TTID", '123456'), }, expires: DateTime.UtcNow.AddDays(1)); var handler = new JwtSecurityTokenHandler(); return handler.WriteToken(secToken); }
签名无效的原因
- 密钥与算法不匹配:jwt.io验证时必须输入和生成代码完全一致的密钥
sample2023TTTTASASA,同时要确保选择的算法是HS256(对应代码中的SecurityAlgorithms.HmacSha256),二者任一错误都会导致签名验证失败。 - 编码差异:代码中用
Encoding.ASCII.GetBytes转换密钥,若在jwt.io输入密钥时存在全角字符、多余空格或编码选择错误,也会引发签名不匹配。 - 代码笔误:代码里
user.TTID = '123456'和new Claim("TTID", '123456')使用了单引号,C#中单引号仅用于单个字符,此处赋值6个字符的字符串会直接编译报错,若实际运行代码未修正此问题,Token生成逻辑本身就存在异常。
验证JWT有效性的方法
1. 正确使用jwt.io验证
- 将Token粘贴到jwt.io左侧"Encoded"输入框;
- 在右侧"Verify Signature"区域输入密钥
sample2023TTTTASASA,确认算法选择HS256; - 检查右侧"Payload"是否与生成的Claims一致,同时确认出现"Signature Verified"提示。
2. C#代码验证
通过JwtSecurityTokenHandler完成验证,示例代码:
private static bool ValidateJwtToken(string token) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes("sample2023TTTTASASA"); try { tokenHandler.ValidateToken(token, new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = true, ValidIssuer = "sample", ValidateAudience = true, ValidAudience = "sample", ValidateLifetime = true, ClockSkew = TimeSpan.Zero // 关闭时钟偏移容忍,严格验证过期时间 }, out SecurityToken validatedToken); return true; } catch { // 验证失败,可捕获具体异常定位原因 return false; } }
3. 精准排查验证失败原因
捕获具体异常类型,快速定位问题:
try { // 调用上述ValidateJwtToken方法 } catch (SecurityTokenSignatureKeyNotFoundException ex) { Console.WriteLine("签名密钥不匹配:" + ex.Message); } catch (SecurityTokenExpiredException ex) { Console.WriteLine("Token已过期:" + ex.Message); } catch (SecurityTokenInvalidIssuerException ex) { Console.WriteLine("Issuer不匹配:" + ex.Message); } catch (SecurityTokenInvalidAudienceException ex) { Console.WriteLine("Audience不匹配:" + ex.Message); } catch (Exception ex) { Console.WriteLine("验证失败:" + ex.Message); }
内容的提问来源于stack exchange,提问作者Android Guy
相关产品推荐
相关产品推荐

