如何在请求标头上调用需要不记名令牌的 NSwag 客户端方法?

Posted

技术标签:

【中文标题】如何在请求标头上调用需要不记名令牌的 NSwag 客户端方法?【英文标题】:How to invoke a NSwag client method that needs bearer token on request header? 【发布时间】:2017-02-22 20:35:02 【问题描述】:

我没有完全了解 NSwag 如何与 IdentityServerX 不记名令牌交互并按常规方式添加它的请求标头?据我了解,我的主机 api 应用程序使用 LDAP 身份验证实现 IdentityServer3;如果任何主机需要令牌进行身份验证,那么任何客户端都必须在请求标头上发送它。那么在为 NSwag 客户工作时我该如何处理呢?

任何想法表示赞赏。 谢谢。

【问题讨论】:

【参考方案1】:

@oguzhan-soykan 和@peter 的答案都很好 - 这是@peter 的答案的扩展,展示了如何实现基类而不是为每个 API 客户端重复自己。

要求

NSwag.MSBuild 包 大摇大摆.JSON定义

创建一个公开您需要的功能的基本“客户端”类。可能是不记名令牌属性。

public abstract class MySwaggerClientBase

    public string BearerToken  get; private set; 

    public void SetBearerToken(string token)
    
        BearerToken = token;
    

    // Called by implementing swagger client classes
    protected Task<HttpRequestMessage> CreateHttpRequestMessageAsync(CancellationToken cancellationToken)
    
        var msg = new HttpRequestMessage();
        // SET THE BEARER AUTH TOKEN
        msg.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", BearerToken);
        return Task.FromResult(msg);
    


编辑您的 swagger 代码生成命令,为所有生成的客户端使用基类,并使用 UseHttpRequestMessageCreationMethod 选项。

<Project>
 ...
<Exec Command="$(NSwagExe) swagger2csclient /input:path-to-swagger-definition.json /output:$(ProjectDir)\Swagger.generated.cs /Namespace:MyNameSpace /ClientBaseClass:MySwaggerClientBase /UseHttpRequestMessageCreationMethod:true" />
 ...
</Project>

【讨论】:

显示在何处/如何调用SetBearerToken 方法可能很有用。由于它不是静态方法,因此不能随便在任何地方调用,而且由于 MySwaggerClientBase 是抽象的,因此您不能只实例化该类型的新对象。 @GeraldMurphy 我的回答现在显示这个抽象类成为所有消息类型的基类。请参阅修改 csproj 的最后部分。【参考方案2】:

我已经通过部分方法解决了这个问题。 我的例子是:

CampaignClient.cs

public partial class CampaignClient

    partial void PrepareRequest(HttpClient request, ref string url);

    partial void ProcessResponse(HttpClient request, HttpResponseMessage response);

    //some codes...

CampaignClient.Extensions.cs - 部分类:

public partial class CampaignClient

    private readonly IRequestContext _requestContext;
    private readonly IStartupConfiguration _startupConfiguration;

    public CampaignClient(IRequestContext requestContext, IStartupConfiguration startupConfiguration)
    
        _requestContext = requestContext;
        _startupConfiguration = startupConfiguration;
    

    partial void PrepareRequest(HttpClient request, ref string url)
    
        request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _requestContext.GetBearerTokenOrTriggerUnauthException());
    

方法覆盖救了我!

【讨论】:

如果您的 API 中有十几个类,这种方式将变得无用,您应该使用基类来处理请求中使用的 httpClient 对象。此外,您应该考虑到 401 状态的第一个收件人的自动令牌延长。我会尽快给出详细的答案【参考方案3】:

对于 c# 客户端,您可以指定 UseHttpClientCreationMethodUseHttpRequestMessageCreationMethod

(参见https://github.com/RicoSuter/NSwag/blob/master/src/NSwag.CodeGeneration.CSharp/SwaggerToCSharpClientGeneratorSettings.cs)

这样 NSwag 期望您实现创建 HttpClient 或 HttpRequest 的方法。你可以在没有任何魔法的情况下设置你的标题

【讨论】:

如何将它用于 SwaggerUi ? 这是 swagger 客户端生成器的一个选项。据我所知,swagger ui 是另一回事。可能是使用客户端生成器生成 swagger ui,但我不确定。也许让这个问题成为一个问题 ***.com/questions/46236152/…@Peter

以上是关于如何在请求标头上调用需要不记名令牌的 NSwag 客户端方法?的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何从Java Spring Boot中的请求标头获取不记名令牌?

如何让不记名令牌通过rails中的标头传递?

JavaScript AJAX 调用中的安全 REST API 令牌

如何更改 Moya 中的不记名令牌

如何传递不记名令牌以使用 URLSessoin 进行 Yelp API 调用

如何将承载令牌添加到 HTTP 请求的标头?