Skip to content

Commit 7b57429

Browse files
committed
完善TokenProviderBuilderExtensions
1 parent 536fb1b commit 7b57429

File tree

5 files changed

+109
-230
lines changed

5 files changed

+109
-230
lines changed

README.md

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public interface IUserApi : IHttpApi
6666
### 接口配置与选项
6767
每个接口的选项对应为`HttpApiOptions`,选项名称为接口的完整名称,也可以通过HttpApi.GetName()方法获取得到。
6868

69-
#### 从IHttpClientBuilder配置
69+
#### 在IHttpClientBuilder配置
7070
```
7171
services
7272
.AddHttpApi<IUserApi>()
@@ -93,20 +93,7 @@ services
9393
}
9494
```
9595

96-
#### 从IServiceCollection配置
97-
##### 使用OptionsBuilder
98-
```
99-
services
100-
.AddHttpApiOptions<IUserApi>()
101-
.Bind(Configuration.GetSection(nameof(IUserApi)))
102-
.Configure(o =>
103-
{
104-
// 符合国情的不标准时间格式,有些接口就是这么要求必须不标准
105-
o.JsonSerializeOptions.Converters.Add(new JsonLocalDateTimeConverter("yyyy-MM-dd HH:mm:ss"));
106-
});
107-
```
108-
109-
##### 使用ConfigureHttpApi
96+
#### 在IServiceCollection配置
11097
```
11198
services
11299
.ConfigureHttpApi<IUserApi>(Configuration.GetSection(nameof(IUserApi)))
@@ -954,7 +941,7 @@ OAuthTokenHandler | 属于http消息处理器,功能与OAuthTokenAttribute一
954941
##### 1 为接口注册tokenProvider
955942
```
956943
// 为接口注册与配置Client模式的tokenProvider
957-
services.AddClientCredentialsTokenProvider<IUserApi>().Configure(o =>
944+
services.AddClientCredentialsTokenProvider<IUserApi>(o =>
958945
{
959946
o.Endpoint = new Uri("http://localhost:6000/api/tokens");
960947
o.Credentials.Client_id = "clientId";
@@ -1000,11 +987,10 @@ public interface IUserApi
1000987
OAuthTokenHandler的强项是支持在一个请求内部里进行多次尝试,在服务器颁发token之后,如果服务器的token丢失了,OAuthTokenHandler在收到401状态码之后,会在本请求内部丢弃和重新请求token,并使用新token重试请求,从而表现为一次正常的请求。但OAuthTokenHandler不属于WebApiClientCore框架层的对象,在里面只能访问原始的HttpRequestMessage与HttpResponseMessage,如果需要将token追加到HttpRequestMessage的Content里,这是非常困难的,同理,如果不是根据http状态码(401等)作为token无效的依据,而是使用HttpResponseMessage的Content对应的业务模型的某个标记字段,也是非常棘手的活。
1001988

1002989
```
1003-
// 注册时添加OAuthTokenHandler
1004-
services.AddHttpApi<IUserApi>(o =>
1005-
{
1006-
...
1007-
}).AddOAuthTokenHandler();
990+
// 注册接口时添加OAuthTokenHandler
991+
services
992+
.AddHttpApi<IUserApi>()
993+
.AddOAuthTokenHandler();
1008994
```
1009995

1010996
OAuthTokenHandler默认实现将token放到Authorization请求头,如果你的接口需要请token放到其它地方比如uri的query,需要重写OAuthTokenHandler:
@@ -1035,11 +1021,10 @@ class UriQueryOAuthTokenHandler : OAuthTokenHandler
10351021
}
10361022
10371023
1038-
// 注册时添加UriQueryOAuthTokenHandler
1039-
services.AddHttpApi<IUserApi>(o =>
1040-
{
1041-
...
1042-
}).AddOAuthTokenHandler((s, tp) => new UriQueryOAuthTokenHandler(tp));
1024+
// 注册接口时添加UriQueryOAuthTokenHandler
1025+
services
1026+
.AddHttpApi<IUserApi>()
1027+
.AddOAuthTokenHandler((s, tp) => new UriQueryOAuthTokenHandler(tp));
10431028
```
10441029

10451030
#### 多接口共享的TokenProvider

WebApiClientCore.Extensions.OAuths/Microsoft.Extensions/DependencyInjection/TokenProviderBuilderExtensions.cs

Lines changed: 82 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
using Microsoft.Extensions.Options;
2-
using WebApiClientCore.Extensions.OAuths;
1+
using Microsoft.Extensions.Configuration;
2+
using Microsoft.Extensions.Options;
3+
using System;
34
using WebApiClientCore.Extensions.OAuths.TokenProviders;
45

56
namespace Microsoft.Extensions.DependencyInjection
@@ -10,34 +11,106 @@ namespace Microsoft.Extensions.DependencyInjection
1011
public static class TokenProviderBuilderExtensions
1112
{
1213
/// <summary>
13-
/// 配置Client模式的授权信息
14+
/// 配置ClientCredentialsOptions
1415
/// </summary>
1516
/// <param name="builder"></param>
17+
/// <param name="configureOptions">配置</param>
1618
/// <returns></returns>
17-
public static OptionsBuilder<ClientCredentialsOptions> AddClientCredentialsOptions(this ITokenProviderBuilder builder)
19+
public static ITokenProviderBuilder ConfigureClientCredentials(this ITokenProviderBuilder builder, Action<ClientCredentialsOptions, IServiceProvider> configureOptions)
1820
{
19-
return builder.AddOptions<ClientCredentialsOptions>();
21+
builder.AddClientCredentialsOptions().Configure(configureOptions);
22+
return builder;
2023
}
2124

25+
/// <summary>
26+
/// 配置ClientCredentialsOptions
27+
/// </summary>
28+
/// <param name="builder"></param>
29+
/// <param name="configureOptions">配置</param>
30+
/// <returns></returns>
31+
public static ITokenProviderBuilder ConfigureClientCredentials(this ITokenProviderBuilder builder, Action<ClientCredentialsOptions> configureOptions)
32+
{
33+
builder.AddClientCredentialsOptions().Configure(configureOptions);
34+
return builder;
35+
}
2236

2337
/// <summary>
24-
/// 配置Password模式的授权信息
38+
/// 配置ClientCredentialsOptions
2539
/// </summary>
2640
/// <param name="builder"></param>
41+
/// <param name="configuration">配置</param>
2742
/// <returns></returns>
28-
public static OptionsBuilder<PasswordCredentialsOptions> AddPasswordCredentialsOptions(this ITokenProviderBuilder builder)
43+
public static ITokenProviderBuilder ConfigureClientCredentials(this ITokenProviderBuilder builder, IConfiguration configuration)
2944
{
30-
return builder.AddOptions<PasswordCredentialsOptions>();
45+
builder.AddClientCredentialsOptions().Bind(configuration);
46+
return builder;
47+
}
48+
49+
50+
/// <summary>
51+
/// 配置PasswordCredentialsOptions
52+
/// </summary>
53+
/// <param name="builder"></param>
54+
/// <param name="configureOptions">配置</param>
55+
/// <returns></returns>
56+
public static ITokenProviderBuilder ConfigurePasswordCredentials(this ITokenProviderBuilder builder, Action<PasswordCredentialsOptions, IServiceProvider> configureOptions)
57+
{
58+
builder.AddPasswordCredentialsOptions().Configure(configureOptions);
59+
return builder;
60+
}
61+
62+
/// <summary>
63+
/// 配置PasswordCredentialsOptions
64+
/// </summary>
65+
/// <param name="builder"></param>
66+
/// <param name="configureOptions">配置</param>
67+
/// <returns></returns>
68+
public static ITokenProviderBuilder ConfigurePasswordCredentials(this ITokenProviderBuilder builder, Action<PasswordCredentialsOptions> configureOptions)
69+
{
70+
builder.AddPasswordCredentialsOptions().Configure(configureOptions);
71+
return builder;
3172
}
3273

74+
/// <summary>
75+
/// 配置PasswordCredentialsOptions
76+
/// </summary>
77+
/// <param name="builder"></param>
78+
/// <param name="configuration">配置</param>
79+
/// <returns></returns>
80+
public static ITokenProviderBuilder ConfigurePasswordCredentials(this ITokenProviderBuilder builder, IConfiguration configuration)
81+
{
82+
builder.AddPasswordCredentialsOptions().Bind(configuration);
83+
return builder;
84+
}
85+
86+
87+
/// <summary>
88+
/// 配置ClientCredentialsOptions
89+
/// </summary>
90+
/// <param name="builder"></param>
91+
/// <returns></returns>
92+
private static OptionsBuilder<ClientCredentialsOptions> AddClientCredentialsOptions(this ITokenProviderBuilder builder)
93+
{
94+
return builder.AddOptions<ClientCredentialsOptions>();
95+
}
96+
97+
/// <summary>
98+
/// 配置PasswordCredentialsOptions
99+
/// </summary>
100+
/// <param name="builder"></param>
101+
/// <returns></returns>
102+
private static OptionsBuilder<PasswordCredentialsOptions> AddPasswordCredentialsOptions(this ITokenProviderBuilder builder)
103+
{
104+
return builder.AddOptions<PasswordCredentialsOptions>();
105+
}
33106

34107
/// <summary>
35108
/// 使用token提供者的名称创建指定类型的OptionsBuilder
36109
/// </summary>
37110
/// <typeparam name="TOptions"></typeparam>
38111
/// <param name="builder"></param>
39112
/// <returns></returns>
40-
public static OptionsBuilder<TOptions> AddOptions<TOptions>(this ITokenProviderBuilder builder) where TOptions : class
113+
private static OptionsBuilder<TOptions> AddOptions<TOptions>(this ITokenProviderBuilder builder) where TOptions : class
41114
{
42115
return builder.Services.AddOptions<TOptions>(builder.Name);
43116
}
Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using Microsoft.Extensions.Options;
2-
using System;
3-
using WebApiClientCore.Extensions.OAuths;
1+
using System;
42
using WebApiClientCore.Extensions.OAuths.TokenProviders;
53

64
namespace Microsoft.Extensions.DependencyInjection
@@ -15,11 +13,10 @@ public static partial class TokenProviderExtensions
1513
/// </summary>
1614
/// <typeparam name="THttpApi">接口类型</typeparam>
1715
/// <param name="services"></param>
18-
/// <param name="configureOptions">配置</param>
19-
/// <returns></returns>
20-
public static IServiceCollection AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services, Action<ClientCredentialsOptions, IServiceProvider> configureOptions)
16+
/// <returns></returns>
17+
public static ITokenProviderBuilder AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services)
2118
{
22-
return services.AddClientCredentialsTokenProvider<THttpApi>().Configure(configureOptions).Services;
19+
return services.AddTokenProvider<THttpApi, ClientCredentialsTokenProvider>();
2320
}
2421

2522
/// <summary>
@@ -29,21 +26,11 @@ public static IServiceCollection AddClientCredentialsTokenProvider<THttpApi>(thi
2926
/// <param name="services"></param>
3027
/// <param name="configureOptions">配置</param>
3128
/// <returns></returns>
32-
public static IServiceCollection AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services, Action<ClientCredentialsOptions> configureOptions)
33-
{
34-
return services.AddClientCredentialsTokenProvider<THttpApi>().Configure(configureOptions).Services;
35-
}
36-
37-
/// <summary>
38-
/// 为指定接口添加Client模式的token提供者
39-
/// </summary>
40-
/// <typeparam name="THttpApi">接口类型</typeparam>
41-
/// <param name="services"></param>
42-
/// <returns></returns>
43-
public static OptionsBuilder<ClientCredentialsOptions> AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services)
29+
public static ITokenProviderBuilder AddClientCredentialsTokenProvider<THttpApi>(this IServiceCollection services, Action<ClientCredentialsOptions> configureOptions)
4430
{
45-
var builder = services.AddTokenProvider<THttpApi, ClientCredentialsTokenProvider>();
46-
return builder.AddClientCredentialsOptions();
31+
return services
32+
.AddClientCredentialsTokenProvider<THttpApi>()
33+
.ConfigureClientCredentials(configureOptions);
4734
}
4835
}
4936
}
Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using Microsoft.Extensions.Options;
2-
using System;
3-
using WebApiClientCore.Extensions.OAuths;
1+
using System;
42
using WebApiClientCore.Extensions.OAuths.TokenProviders;
53

64
namespace Microsoft.Extensions.DependencyInjection
@@ -15,11 +13,10 @@ public static partial class TokenProviderExtensions
1513
/// </summary>
1614
/// <typeparam name="THttpApi">接口类型</typeparam>
1715
/// <param name="services"></param>
18-
/// <param name="configureOptions">配置</param>
1916
/// <returns></returns>
20-
public static IServiceCollection AddPasswordCredentialsTokenProvider<THttpApi>(this IServiceCollection services, Action<PasswordCredentialsOptions, IServiceProvider> configureOptions)
17+
public static ITokenProviderBuilder AddPasswordCredentialsTokenProvider<THttpApi>(this IServiceCollection services)
2118
{
22-
return services.AddPasswordCredentialsTokenProvider<THttpApi>().Configure(configureOptions).Services;
19+
return services.AddTokenProvider<THttpApi, PasswordCredentialsTokenProvider>();
2320
}
2421

2522
/// <summary>
@@ -29,21 +26,11 @@ public static IServiceCollection AddPasswordCredentialsTokenProvider<THttpApi>(t
2926
/// <param name="services"></param>
3027
/// <param name="configureOptions">配置</param>
3128
/// <returns></returns>
32-
public static IServiceCollection AddPasswordCredentialsTokenProvider<THttpApi>(this IServiceCollection services, Action<PasswordCredentialsOptions> configureOptions)
33-
{
34-
return services.AddPasswordCredentialsTokenProvider<THttpApi>().Configure(configureOptions).Services;
35-
}
36-
37-
/// <summary>
38-
/// 为指定接口添加Password模式的token提供者
39-
/// </summary>
40-
/// <typeparam name="THttpApi">接口类型</typeparam>
41-
/// <param name="services"></param>
42-
/// <returns></returns>
43-
public static OptionsBuilder<PasswordCredentialsOptions> AddPasswordCredentialsTokenProvider<THttpApi>(this IServiceCollection services)
29+
public static ITokenProviderBuilder AddPasswordCredentialsTokenProvider<THttpApi>(this IServiceCollection services, Action<PasswordCredentialsOptions> configureOptions)
4430
{
45-
var builder = services.AddTokenProvider<THttpApi, PasswordCredentialsTokenProvider>();
46-
return builder.AddPasswordCredentialsOptions();
31+
return services
32+
.AddPasswordCredentialsTokenProvider<THttpApi>()
33+
.ConfigurePasswordCredentials(configureOptions);
4734
}
4835
}
4936
}

0 commit comments

Comments
 (0)