You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6微服务GraphQL Schema Stitching认证及令牌传递实现

2. 在HotChocolate中传递认证令牌给微服务

方式一:全局HttpClient拦截器(推荐)

通过自定义IHttpMessageHandlerBuilderFilter,拦截所有拼接Schema的请求,自动将网关收到的令牌传递给微服务:

// 注册拦截器
builder.Services.AddTransient<IHttpMessageHandlerBuilderFilter, AuthHeaderHandlerFilter>();

// 自定义过滤器类
public class AuthHeaderHandlerFilter : IHttpMessageHandlerBuilderFilter
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public AuthHeaderHandlerFilter(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public Action<HttpMessageHandlerBuilder> Configure(Action<HttpMessageHandlerBuilder> next)
    {
        return builder =>
        {
            next(builder);
            builder.AdditionalHandlers.Add(new AuthHeaderHandler(_httpContextAccessor));
        };
    }
}

// 自定义消息处理器
public class AuthHeaderHandler : DelegatingHandler
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public AuthHeaderHandler(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var authHeader = _httpContextAccessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault();
        if (!string.IsNullOrEmpty(authHeader))
        {
            // 拆分Bearer令牌并添加到请求头
            var token = authHeader.Split(' ')[1];
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        }
        return await base.SendAsync(request, cancellationToken);
    }
}

方式二:针对单个服务配置

如果只需给特定微服务传递令牌,可在添加Schema时直接配置HttpClient:

builder.Services.AddStitchedSchema(builder => builder
    .AddSchemaFromHttp("ServiceA", new Uri("https://localhost:5001/graphql"), configureClient: client =>
    {
        var httpContext = builder.Services.BuildServiceProvider().GetRequiredService<IHttpContextAccessor>().HttpContext;
        var authHeader = httpContext?.Request.Headers["Authorization"].FirstOrDefault();
        if (!string.IsNullOrEmpty(authHeader))
        {
            var token = authHeader.Split(' ')[1];
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        }
    })
);

注意事项

  • 微服务端需配置与网关一致的JWT验证规则,确保能正确解析令牌。
  • 微服务的敏感GraphQL字段或类型需添加[Authorize]特性或HotChocolate的Authorize指令,实现细粒度授权。

内容的提问来源于stack exchange,提问作者Samad Kakkad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:15:21