Skip to content

Commit dcb9920

Browse files
committed
Attempt to refresh access token upon token validation
1 parent 31e8af0 commit dcb9920

File tree

5 files changed

+47
-13
lines changed

5 files changed

+47
-13
lines changed

src/Umbraco.Cms.Integrations.Crm.Hubspot/Api/Management/Controllers/ValidateAccessTokenController.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@ public class ValidateAccessTokenController : HubspotFormsControllerBase
1515
{
1616
private readonly IHttpClientFactory _httpClientFactory;
1717
private readonly ITokenService _tokenService;
18+
private readonly IHubspotAuthorizationService _authorizationService;
1819

1920
public ValidateAccessTokenController(
2021
IOptions<HubspotSettings> settingsOptions,
2122
IHttpClientFactory httpClientFactory,
22-
ITokenService tokenService)
23+
ITokenService tokenService,
24+
IHubspotAuthorizationService authorizationService)
2325
: base(settingsOptions)
2426
{
2527
_httpClientFactory = httpClientFactory;
2628
_tokenService = tokenService;
29+
_authorizationService = authorizationService;
2730
}
2831

2932
[HttpGet("validate", Name = Constants.OperationIdentifiers.ValidateAccessToken)]
@@ -41,14 +44,47 @@ public async Task<IActionResult> ValidateAccessToken()
4144
Error = Constants.ErrorMessages.OAuthInvalidToken
4245
});
4346

44-
var requestMessage = new HttpRequestMessage
47+
using var requestMessage = new HttpRequestMessage
4548
{
4649
Method = HttpMethod.Get,
4750
RequestUri = new Uri(HubspotFormsApiEndpoint)
4851
};
4952
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
5053

5154
var response = await client.SendAsync(requestMessage);
55+
if (response.StatusCode == HttpStatusCode.Unauthorized)
56+
{
57+
// Attempt to refresh the access token
58+
var refreshAccessTokenResponse = await _authorizationService.RefreshAccessTokenAsync();
59+
if (string.IsNullOrEmpty(refreshAccessTokenResponse)
60+
|| refreshAccessTokenResponse.StartsWith(BaseAuthorizationService.ErrorPrefix))
61+
{
62+
return Ok(new ResponseDto
63+
{
64+
IsValid = false,
65+
Error = Constants.ErrorMessages.OAuthInvalidToken
66+
});
67+
}
68+
69+
if (!_tokenService.TryGetParameters(Constants.AccessTokenDbKey, out string newAccessToken)
70+
|| string.IsNullOrEmpty(newAccessToken))
71+
{
72+
return Ok(new ResponseDto
73+
{
74+
IsValid = false,
75+
Error = Constants.ErrorMessages.OAuthInvalidToken
76+
});
77+
}
78+
79+
// Retry the request with the new access token
80+
using var newRequestMessage = new HttpRequestMessage
81+
{
82+
Method = HttpMethod.Get,
83+
RequestUri = new Uri(HubspotFormsApiEndpoint)
84+
};
85+
newRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", newAccessToken);
86+
response = await client.SendAsync(newRequestMessage);
87+
}
5288

5389
return Ok(new ResponseDto
5490
{

src/Umbraco.Cms.Integrations.Crm.Hubspot/Services/AuthorizationService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ public async Task<string> GetAccessTokenAsync(string code)
6161
var errorResult = await response.Content.ReadAsStringAsync();
6262
var errorDto = JsonSerializer.Deserialize<ErrorDto>(errorResult);
6363

64-
return "Error: " + errorDto.Message;
64+
return string.Format("{0}: {1}", ErrorPrefix, errorDto.Message);
6565
}
6666

67-
return "Error: An unexpected error occurred.";
67+
return string.Format("{0}: An unexpected error occurred.", ErrorPrefix);
6868
}
6969

7070
public string RefreshAccessToken() =>
@@ -102,7 +102,7 @@ public async Task<string> RefreshAccessTokenAsync()
102102
return result;
103103
}
104104

105-
return "error";
105+
return ErrorPrefix;
106106
}
107107
}
108108
}

src/Umbraco.Cms.Integrations.Crm.Hubspot/Services/BaseAuthorizationService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public class BaseAuthorizationService
1515

1616
protected readonly ITokenService TokenService;
1717

18+
public const string ErrorPrefix = "Error";
19+
1820
public BaseAuthorizationService(ITokenService tokenService)
1921
{
2022
TokenService = tokenService;

src/Umbraco.Cms.Integrations.Crm.Hubspot/Services/UmbracoAuthorizationService.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
using Microsoft.Extensions.Options;
2-
using System;
3-
using System.Collections.Generic;
42
using System.Net;
5-
using System.Net.Http;
63
using System.Text.Json;
7-
using System.Threading.Tasks;
84
using Umbraco.Cms.Integrations.Crm.Hubspot.Configuration;
95
using Umbraco.Cms.Integrations.Crm.Hubspot.Models.Dtos;
106

@@ -74,10 +70,10 @@ public async Task<string> GetAccessTokenAsync(string code)
7470
var errorResult = await response.Content.ReadAsStringAsync();
7571
var errorDto = JsonSerializer.Deserialize<ErrorDto>(errorResult);
7672

77-
return "Error: " + errorDto.Message;
73+
return string.Format("{0}: {1}", ErrorPrefix, errorDto.Message);
7874
}
7975

80-
return "Error: An unexpected error occurred.";
76+
return string.Format("{0}: An unexpected error occurred.", ErrorPrefix);
8177
}
8278

8379
public string RefreshAccessToken() =>
@@ -115,7 +111,7 @@ public async Task<string> RefreshAccessTokenAsync()
115111
return result;
116112
}
117113

118-
return "error";
114+
return ErrorPrefix;
119115
}
120116
}
121117
}

src/Umbraco.Cms.Integrations.Crm.Hubspot/Umbraco.Cms.Integrations.Crm.Hubspot.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<PackageIconUrl></PackageIconUrl>
1717
<PackageProjectUrl>https://github.com/umbraco/Umbraco.Cms.Integrations/blob/main-v16/src/Umbraco.Cms.Integrations.Crm.Hubspot</PackageProjectUrl>
1818
<RepositoryUrl>https://github.com/umbraco/Umbraco.Cms.Integrations</RepositoryUrl>
19-
<Version>7.0.0</Version>
19+
<Version>7.0.1</Version>
2020
<Authors>Umbraco HQ</Authors>
2121
<Company>Umbraco</Company>
2222
<PackageTags>Umbraco;Umbraco-Marketplace</PackageTags>

0 commit comments

Comments
 (0)