Skip to content

Commit 21c72b2

Browse files
committed
Split methods for ensuring access token for cases where we have a refresh token, and an access token that needs to be exchanged.
1 parent b1bf3e4 commit 21c72b2

File tree

2 files changed

+35
-25
lines changed

2 files changed

+35
-25
lines changed

src/Umbraco.AuthorizedServices/Models/Token.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System;
2+
13
namespace Umbraco.AuthorizedServices.Models;
24

35
/// <summary>
@@ -40,12 +42,7 @@ public Token(string accessToken, string? refreshToken, DateTime? expiresOn)
4042
public DateTime? ExpiresOn { get; }
4143

4244
/// <summary>
43-
/// Checks to see if the token either has or is about to expire (in the next 30 seconds).
44-
/// </summary>
45-
public bool HasOrIsAboutToExpire => ExpiresOn.HasValue && DateTime.UtcNow.AddSeconds(30) > ExpiresOn;
46-
47-
/// <summary>
48-
/// Checks to see if the exchange token either has or is about to expire (in the next 30 days).
45+
/// Checks to see if the token will be expired after the provided period.
4946
/// </summary>
50-
public bool ExchangeTokenHasOrIsAboutToExpire => ExpiresOn.HasValue && DateTime.UtcNow.AddDays(30) > ExpiresOn;
47+
public bool WillBeExpiredAfter(TimeSpan period) => ExpiresOn.HasValue && DateTime.UtcNow.Add(period) > ExpiresOn;
5148
}

src/Umbraco.AuthorizedServices/Services/Implement/AuthorizedServiceCaller.cs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -144,57 +144,70 @@ public async Task<string> SendRequestRawAsync<TRequest>(string serviceAlias, str
144144

145145
private async Task<Token> EnsureAccessToken(string serviceAlias, Token token)
146146
{
147-
if (token.HasOrIsAboutToExpire)
147+
if (token.WillBeExpiredAfter(TimeSpan.FromSeconds(30)))
148148
{
149149
if (string.IsNullOrEmpty(token.RefreshToken))
150150
{
151151
ClearAccessToken(serviceAlias);
152152
throw new AuthorizedServiceException($"Cannot request service '{serviceAlias}' as the access token has expired and no refresh token is available to use. The expired token has been deleted.");
153153
}
154154

155-
Token? refreshedToken = await RefreshAccessToken(serviceAlias, token.RefreshToken) ?? throw new AuthorizedServiceException($"Cannot request service '{serviceAlias}' as the access token has expired and the refresh token could not be used to obtain a new access token.");
156-
157-
return refreshedToken;
155+
return await RefreshAccessToken(serviceAlias, token.RefreshToken) ?? throw new AuthorizedServiceException($"Cannot request service '{serviceAlias}' as the access token has expired and the refresh token could not be used to obtain a new access token.");
158156
}
159157

160158
return token;
161159
}
162160

163-
private async Task<Token> EnsureExchangeAccessToken(string serviceAlias, Token token)
161+
private async Task<Token?> RefreshAccessToken(string serviceAlias, string refreshToken)
164162
{
165-
if (token.ExchangeTokenHasOrIsAboutToExpire)
163+
ServiceDetail serviceDetail = GetServiceDetail(serviceAlias);
164+
165+
Dictionary<string, string> parameters = _refreshTokenParametersBuilder.BuildParameters(serviceDetail, refreshToken);
166+
167+
HttpResponseMessage response = await AuthorizationRequestSender.SendRequest(serviceDetail, parameters);
168+
if (response.IsSuccessStatusCode)
166169
{
167-
Token? refreshedToken = await RefreshAccessToken(serviceAlias, string.Empty) ?? throw new AuthorizedServiceException($"Cannot request service '{serviceAlias}' as the access token has expired and the refresh token could not be used to obtain a new access token.");
170+
Token token = await CreateTokenFromResponse(serviceDetail, response);
171+
StoreToken(serviceAlias, token);
172+
return token;
173+
}
174+
else
175+
{
176+
throw new AuthorizedServiceHttpException(
177+
$"Error response from refresh token request to '{serviceAlias}'.",
178+
response.StatusCode,
179+
response.ReasonPhrase,
180+
await response.Content.ReadAsStringAsync());
181+
}
182+
}
168183

169-
return refreshedToken;
184+
private async Task<Token> EnsureExchangeAccessToken(string serviceAlias, Token token)
185+
{
186+
if (token.WillBeExpiredAfter(TimeSpan.FromDays(30)))
187+
{
188+
return await RefreshExchangeAccessToken(serviceAlias, token.AccessToken) ?? throw new AuthorizedServiceException($"Cannot request service '{serviceAlias}' as the access token has expired and the refresh token could not be used to obtain a new access token.");
170189
}
171190

172191
return token;
173192
}
174193

175-
private async Task<Token?> RefreshAccessToken(string serviceAlias, string refreshToken)
194+
private async Task<Token?> RefreshExchangeAccessToken(string serviceAlias, string accessToken)
176195
{
177196
ServiceDetail serviceDetail = GetServiceDetail(serviceAlias);
178197

179-
Dictionary<string, string> parameters = serviceDetail.CanExchangeToken
180-
? _exchangeTokenParametersBuilder.BuildParameters(serviceDetail, refreshToken)
181-
: _refreshTokenParametersBuilder.BuildParameters(serviceDetail, refreshToken);
198+
Dictionary<string, string> parameters = _exchangeTokenParametersBuilder.BuildParameters(serviceDetail, accessToken);
182199

183-
HttpResponseMessage response = serviceDetail.CanExchangeToken
184-
? await AuthorizationRequestSender.SendExchangeRequest(serviceDetail, parameters)
185-
: await AuthorizationRequestSender.SendRequest(serviceDetail, parameters);
200+
HttpResponseMessage response = await AuthorizationRequestSender.SendExchangeRequest(serviceDetail, parameters);
186201
if (response.IsSuccessStatusCode)
187202
{
188203
Token token = await CreateTokenFromResponse(serviceDetail, response);
189-
190204
StoreToken(serviceAlias, token);
191-
192205
return token;
193206
}
194207
else
195208
{
196209
throw new AuthorizedServiceHttpException(
197-
$"Error response from refresh token request to '{serviceAlias}'.",
210+
$"Error response from exchange access token request to '{serviceAlias}'.",
198211
response.StatusCode,
199212
response.ReasonPhrase,
200213
await response.Content.ReadAsStringAsync());

0 commit comments

Comments
 (0)