gpt4 book ai didi

oauth-2.0 - IdentityServerV4 引用 token 自省(introspection)

转载 作者:行者123 更新时间:2023-12-05 01:39:29 25 4
gpt4 key购买 nike

我已经使用授权代码 + PKCE 为客户端设置了 IdentityServerV4,并将访问 token 类型设置为引用。

new Client
{
ClientId = "app",
ClientName = "My Application",
AllowedGrantTypes = GrantTypes.Code,
RequireClientSecret = false,
RedirectUris = { "http://site.example.com:3000/callback" },
AllowedCorsOrigins = { "http://site.example.com:3000" },
AllowedScopes = { "openid", "profile", "email" },
AccessTokenType = AccessTokenType.Reference,
RequireConsent = false,
RequirePkce = true
}

我现在想在客户端应用程序和服务之间设置一个反向代理网关,该网关将在转发请求之前将引用 token 交换为常规签名的 JWT。在设置网关之前,我试图通过使用从登录中获得的引用 token 调用内省(introspection)端点来手动执行交换。

我向身份服务器添加了一个我称之为“网关”的 API as described here ,给了它一个 secret ,并使用带有 API 的 ID 和 secret 的 IntrospectionClient 成功地调用了这个端点,但我得到的响应是 active: false,并且身份服务器日志显示一个错误,表明 token 缺少预期的范围“网关” ”。日志中显示的 token 信息仅显示openid范围。

new ApiResource("gateway"){
ApiSecrets = { new Secret("test".Sha256()) }
}

这会导致来自 IdentityServer 的两条日志消息:

fail: IdentityServer4.ResponseHandling.IntrospectionResponseGenerator[0]
Expected scope gateway is missing in token
info: IdentityServer4.Endpoints.IntrospectionEndpoint[0]
Success token introspection. Token active: True, for API name: gateway

所以我从中得出的结论是,API 和颁发的 token 之间缺少一些链接,但我已经尝试了范围的每一种排列,并在我能想到的客户端和 ApiResource 定义之间允许了范围,但我似乎无法获得预期的结果。我已经阅读并重新阅读了文档数次,但在这种情况下我无法完全弄清楚 API 和客户端之间的关系。支持此类设置需要什么样的配置?

最佳答案

看起来你的代理正在使用 gateway 作用域作为内省(introspection)端点,问题是你的 token 没有这个 gateway 作用域,所以你总是会得到 active: false 作为响应。

这里有两个选择:

  1. gateway 作用域赋予您的客户端,并使其在授权请求中将网关作用域与其他作用域一起发送
new Client
{
ClientId = "app",
ClientName = "My Application",
AllowedGrantTypes = GrantTypes.Code,
RequireClientSecret = false,
RedirectUris = { "http://site.example.com:3000/callback" },
AllowedCorsOrigins = { "http://site.example.com:3000" },
AllowedScopes = { "openid", "profile", "email", "gateway" }, // add gateway here
AccessTokenType = AccessTokenType.Reference,
RequireConsent = false,
RequirePkce = true
}
  1. 编写自定义 IClaimService 并将网关范围添加到所有访问 token 。
public class CustomClaimService : IdentityServer4.Services.DefaultClaimsService
{
public CustomClaimService(IProfileService profile, ILogger<DefaultClaimsService> logger)
: base(profile, logger)
{

}

public override Task<IEnumerable<Claim>> GetAccessTokenClaimsAsync(ClaimsPrincipal subject, Resources resources, ValidatedRequest request)
{
resources.ApiResources.Add(new ApiResource("gateway"));
return base.GetAccessTokenClaimsAsync(subject, resources, request);
}
}

AddIdentityServer

之前还需要将 CustomClaimService注册到 IServiceCollection
public void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient<IClaimsService, CustomClaimService>();
services.AddIdentityServer();
...
}

关于oauth-2.0 - IdentityServerV4 引用 token 自省(introspection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58289706/

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