1
- using System ;
2
- using System . Net . Http . Headers ;
3
- using System . Threading ;
1
+ using System . Net . Http . Headers ;
4
2
using System . Threading . Tasks ;
5
3
using WebApiClient . Contexts ;
6
4
@@ -9,71 +7,18 @@ namespace WebApiClient.AuthTokens
9
7
/// <summary>
10
8
/// 表示OAuth授权的token过滤器抽象类
11
9
/// </summary>
12
- public abstract class AuthTokenFilter : IApiActionFilter , IDisposable
10
+ public abstract class AuthTokenFilter : IApiActionFilter
13
11
{
14
12
/// <summary>
15
13
/// 最近请求到的token
16
14
/// </summary>
17
- private TokenResult tokenResult ;
18
-
19
- /// <summary>
20
- /// token相关异常
21
- /// </summary>
22
- private Exception tokenException ;
23
-
24
- /// <summary>
25
- /// 计时器
26
- /// </summary>
27
- private readonly Timer tokenTimer ;
15
+ private TokenResult token ;
28
16
29
17
/// <summary>
30
18
/// 异步锁
31
19
/// </summary>
32
20
private readonly AsyncRoot asyncRoot = new AsyncRoot ( ) ;
33
21
34
- /// <summary>
35
- /// OAuth授权的token过滤器抽象类
36
- /// </summary>
37
- public AuthTokenFilter ( )
38
- {
39
- this . tokenTimer = new Timer ( async ( state ) =>
40
- {
41
- using ( await this . asyncRoot . LockAsync ( ) )
42
- {
43
- await this . RefreshTokenAsync ( ) ;
44
- }
45
-
46
- if ( this . tokenException == null )
47
- {
48
- var dueTime = this . GetDueTimeSpan ( this . tokenResult . ExpiresIn ) ;
49
- this . tokenTimer . Change ( dueTime , Timeout . InfiniteTimeSpan ) ;
50
- }
51
- } , null , Timeout . InfiniteTimeSpan , Timeout . InfiniteTimeSpan ) ;
52
- }
53
-
54
- /// <summary>
55
- /// 刷新token
56
- /// </summary>
57
- /// <returns></returns>
58
- private async Task RefreshTokenAsync ( )
59
- {
60
- try
61
- {
62
- if ( string . IsNullOrEmpty ( this . tokenResult . RefreshToken ) == true )
63
- {
64
- this . tokenResult = await this . RequestTokenResultAsync ( ) ;
65
- }
66
- else
67
- {
68
- this . tokenResult = await this . RequestRefreshTokenAsync ( this . tokenResult . RefreshToken ) ;
69
- }
70
- }
71
- catch ( Exception ex )
72
- {
73
- this . tokenException = ex ;
74
- }
75
- }
76
-
77
22
/// <summary>
78
23
/// 请求完成之后
79
24
/// </summary>
@@ -93,45 +38,34 @@ async Task IApiActionFilter.OnBeginRequestAsync(ApiActionContext context)
93
38
{
94
39
using ( await this . asyncRoot . LockAsync ( ) )
95
40
{
96
- await this . InitTokenIfNullTokenAsync ( ) ;
41
+ await this . InitOrRefreshTokenAsync ( ) ;
97
42
}
98
43
99
- if ( this . tokenException != null )
100
- {
101
- throw this . tokenException ;
102
- }
103
- this . AccessTokenResult ( context , this . tokenResult ) ;
44
+ this . AccessTokenResult ( context , this . token ) ;
104
45
}
105
46
106
47
/// <summary>
107
- /// 初始化Token
48
+ /// 初始化或刷新token
108
49
/// </summary>
109
50
/// <returns></returns>
110
- private async Task InitTokenIfNullTokenAsync ( )
51
+ private async Task InitOrRefreshTokenAsync ( )
111
52
{
112
- try
53
+ if ( this . token == null )
113
54
{
114
- if ( this . tokenResult == null )
115
- {
116
- this . tokenResult = await this . RequestTokenResultAsync ( ) ;
117
- var dueTime = this . GetDueTimeSpan ( this . tokenResult . ExpiresIn ) ;
118
- this . tokenTimer . Change ( dueTime , Timeout . InfiniteTimeSpan ) ;
119
- }
55
+ this . token = await this . RequestTokenResultAsync ( ) ;
120
56
}
121
- catch ( Exception ex )
57
+ else if ( this . token . IsExpired ( ) == true )
122
58
{
123
- this . tokenException = ex ;
59
+ if ( this . token . CanRefresh ( ) == true )
60
+ {
61
+ this . token = await this . RequestRefreshTokenAsync ( this . token . RefreshToken ) ;
62
+ }
63
+ else
64
+ {
65
+ this . token = await this . RequestTokenResultAsync ( ) ;
66
+ }
124
67
}
125
- }
126
-
127
- /// <summary>
128
- /// 返回Timer延时时间
129
- /// </summary>
130
- /// <param name="expiresIn"></param>
131
- /// <returns></returns>
132
- private TimeSpan GetDueTimeSpan ( long expiresIn )
133
- {
134
- return TimeSpan . FromSeconds ( ( double ) expiresIn * 0.9d ) ;
68
+ this . token . EnsureSuccess ( ) ;
135
69
}
136
70
137
71
/// <summary>
@@ -159,13 +93,5 @@ protected virtual void AccessTokenResult(ApiActionContext context, TokenResult t
159
93
/// <param name="refresh_token">获取token时返回的refresh_token</param>
160
94
/// <returns></returns>
161
95
protected abstract Task < TokenResult > RequestRefreshTokenAsync ( string refresh_token ) ;
162
-
163
- /// <summary>
164
- /// 释放资源
165
- /// </summary>
166
- public void Dispose ( )
167
- {
168
- this . tokenTimer . Dispose ( ) ;
169
- }
170
96
}
171
97
}
0 commit comments