签署令牌如何工作? (无效签名错误)
Posted
技术标签:
【中文标题】签署令牌如何工作? (无效签名错误)【英文标题】:How does signing a token work? (Invalid Signature Error) 【发布时间】:2020-06-21 04:30:20 【问题描述】:背景:我正在使用 Auth0 对我的端点进行授权的 .NET Core Web API 中运行集成测试。当我将 Auth0 返回的令牌粘贴到 JWT.io 验证程序中时,它们包含“无效签名”。
在我的授权流程中,我无法理解我的令牌是在什么时候被签名的、谁签名的以及它是如何签名的。
我在 Auth0(“我的开发 API”)中启动了一个新的开发 API,它使用 HS256 签名算法来签署我的令牌。据我了解,对于 HS256,有一个密钥用于签名令牌(签名密钥),机器到机器的流程如下所示:
我将一些凭据发布到 Auth0,如下所示:
clientID: exampleID
clientSecret: exampleSecret
audience: https://myaudience.com
grant_type: client_credentials
Auth0 将访问令牌发回给我:
access_token: exampleToken1234
当我将此令牌粘贴到 JWT.io 时,我被告知该令牌的签名无效。
在我的 .NET 应用程序中,我进行了一些设置并进行了某种配置:
static void AddAuthentication(IServiceCollection services)
services.AddAuthentication(options =>
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
).AddJwtBearer(options =>
options.TokenValidationParameters = new TokenValidationParameters
ValidIssuer = auth0Config.Domain,
ValidAudience = auth0Config.Audience,
IssuerSigningKey = new
SymmetricSecurityKey(Encoding.UTF8.GetBytes(auth0Config.SigningSecret))
;
);
谁能解释我是否应该添加代码来签署这个令牌,如果它已经签署(如果是这样,为什么 JWT.io 告诉我有一个无效的签名)以及上面的配置实际上在做什么?
另外,是否有必要创建一个独立的开发 API 或者我可以向预构建的管理 API 发送授权请求?
提前致谢!
【问题讨论】:
jwt.io 无法验证签名,除非您将用于签署令牌的秘密粘贴到“验证签名”下右列的字段中。所以先把秘密粘贴在那里,然后将令牌粘贴到左列。 【参考方案1】:当我将 Auth0 返回的令牌粘贴到 JWT.io 验证程序中时,它们包含“无效签名”。
https://jwt.io 无法验证签名,除非您将密钥(用于签署令牌)粘贴到“验证签名”下右列的字段中。所以首先将秘密粘贴到那里,然后将令牌粘贴到左栏中。顺序很重要!
在我的授权流程中,我无法理解我的令牌是在什么时候被签名的、谁签名的以及它是如何签名的。
当用户根据提供的凭据进行身份验证时,AuthO 会为您创建一个签名令牌。要创建令牌,首先创建标头和有效负载,然后将签名计算为标头和有效负载和机密的哈希。阅读基础知识here
谁能解释我是否应该添加代码来签署这个令牌,如果它到达已经签名(如果是这样,为什么 JWT.io 告诉我有一个无效的签名)
您不需要任何额外的签名,您会从 AuthO 获得签名令牌。
上面的配置实际上在做什么?
上面的配置告诉您的 API 使用了基于 JWT 的身份验证,并且应该根据配置的参数(根据 auth0Config 中的值验证颁发者、受众和签名)检查传入请求的有效 JWT
【讨论】:
谢谢,说得好,通俗易懂! 很高兴为您提供帮助 :)以上是关于签署令牌如何工作? (无效签名错误)的主要内容,如果未能解决你的问题,请参考以下文章
“AADSTS5002730:无效的 JWT 令牌。 Azure Signal R 服务令牌的代表方案中出现“签名算法的密钥不受支持”错误