gpt4 book ai didi

api - AWS Cognito AccessToken 与 IdToken

转载 作者:行者123 更新时间:2023-12-03 17:00:56 28 4
gpt4 key购买 nike

我使用 AWS Cognito SDK 创建了一个 .net Core API,通过将凭证发布到我的 API 并将 JWT 返回到一个简单的客户端应用程序(纯 HTML/TypeScript)来对用户进行身份验证和授权。该请求包含用户名和密码。

...
var response = await cognito.AdminInitiateAuthAsync(request);

return Ok(response.AuthenticationResult.AccessToken);

对比
return Ok(response.AuthenticationResult.IdToken);

我遇到的问题是理解为什么有 ID token 和访问 token 。我能够使用 [Authorize] 属性保护 Controller 端点。客户端应用程序使用带有 Bearer {token} 的 Authorization header 。

在我的 Startup.cs 中,我可以 AddAuthentication并验证 ID Token 的签名、发行者、受众和生命周期。但是,我读到 ID token 包含有关用户身份的声明,但不包含有关用户授权组的声明。如果我将访问 token 发送给我的客户端并尝试将其发送回我的 API,我将获得未授权。也许我没有正确验证 token ,但我仍然不明白为什么有两种不同类型的 token 。访问 token 更适合用于根据 token 包含的声明创建不同的身份验证策略。

我理解 JWT 的工作方式是,一旦客户端获得 token ,它就会存储它并将其用于对 API 的所有请求。我不明白这应该如何与两个 token 一起使用。

这是我尝试验证访问 token 的方式:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>{
options.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKeyResolver = (s, securityToken, identifier, parameters) =>
{
// get JsonWebKeySet from AWS
var json = new WebClient().DownloadString(parameters.ValidIssuer + "/.well-known/jwks.json");
// serialize the result
var keys = JsonConvert.DeserializeObject<JsonWebKeySet>(json).Keys;

// cast the result to be the type expected by IssuerSigningKeyResolver
return (IEnumerable<SecurityKey>)keys;
},
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Authentication:Cognito:MetadataAddress"],
ValidateIssuer = true,
ValidAudience = Configuration["Authentication:Cognito:ClientId"],
ValidateAudience = true,
ValidateLifetime = true,
RequireSignedTokens = true
};
});

访问 token 中没有 aud 声明,因此我收到错误消息“无效 token ,受众 = '空' 无效。

即使我删除了 ValidateAudience,我仍然收到错误

最佳答案

ID token 作为 OpenID Connect 流的一部分发送到客户端应用程序,并由客户端用于对用户进行身份验证。访问 token 使客户端能够安全地调用受身份提供者保护的 API。

ID token 包含有关未用于访问 protected 资源的最终用户的信息,而访问 token 允许访问某些定义的服务器资源。

因此,在使用 OpenID Connect 时,它会将 ID token 和访问 token 返回给您的客户端,客户端应用程序将从 id token 中获取用户信息并登录用户,并使用访问 token 访问 protected 资源。

If I send the Access Token to my client and try to send this back to my API, I'm getting unauthorized.



ID token 将由您的客户端应用程序验证以获取用户声明,因此 audience token 中的声明是您的客户端应用程序的客户端 ID 。访问 token 传递给您的 protected 资源(web api) 并应由 protected 资源(web api) 验证,因此 audience是 web api 的名称。您应该检查验证选项,如 audience , issuer .

关于api - AWS Cognito AccessToken 与 IdToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60974779/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com