forked from WeihanLi/SamplesInPractice
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1AuthHandlerSample.cs
More file actions
57 lines (53 loc) · 2.29 KB
/
1AuthHandlerSample.cs
File metadata and controls
57 lines (53 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using AngleSharp.Io;
using System.Net;
namespace HttpClientTest;
public class AuthHandlerSample
{
public static async Task MainTest()
{
var services = new ServiceCollection();
services.AddTransient<QueryAuthHandler>();
services.AddTransient<DynamicTokenHandler>();
services.AddHttpClient("auth", client =>
{
client.BaseAddress = new Uri("https://reservation.weihanli.xyz/");
client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "HttpClientFactory-Sample");
client.DefaultRequestHeaders.TryAddWithoutValidation("ApiKey", "apiKey token-here");
})
.ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler
{
Proxy = new WebProxy("http://localhost:8888")
})
.AddHttpMessageHandler<QueryAuthHandler>()
.AddHttpMessageHandler<DynamicTokenHandler>();
await using var provider = services.BuildServiceProvider();
var httpClient = provider.GetRequiredService<IHttpClientFactory>()
.CreateClient("auth");
var responseText = await httpClient.GetStringAsync("health");
Console.WriteLine(responseText);
}
}
file sealed class QueryAuthHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var hasQuestionMark = !string.IsNullOrEmpty(request.RequestUri.Query);
request.RequestUri = new Uri($"{request.RequestUri.OriginalString}{(hasQuestionMark ? "&" : "?")}apiKey=test");
return base.SendAsync(request, cancellationToken);
}
}
file sealed class DynamicTokenHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var token = GetToken();
request.Headers.TryAddWithoutValidation(HeaderNames.Authorization, $"Bearer {token}");
return base.SendAsync(request, cancellationToken);
}
private string GetToken()
{
// In a real application, this method would retrieve a token from a secure source.
// memoryCache.GetOrCreateAsync
return $"dynamic-token-{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}";
}
}