Skip to content

Commit c710c89

Browse files
authored
Merge pull request #275 from umbraco/bugfix/15.x/hubspot-refresh-token-attempt
Attempt token refresh when token is validated
2 parents 71877d8 + ba7e59a commit c710c89

File tree

5 files changed

+47
-9
lines changed

5 files changed

+47
-9
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
@@ -16,15 +16,18 @@ public class ValidateAccessTokenController : HubspotFormsControllerBase
1616
{
1717
private readonly IHttpClientFactory _httpClientFactory;
1818
private readonly ITokenService _tokenService;
19+
private readonly IHubspotAuthorizationService _authorizationService;
1920

2021
public ValidateAccessTokenController(
2122
IOptions<HubspotSettings> settingsOptions,
2223
IHttpClientFactory httpClientFactory,
23-
ITokenService tokenService)
24+
ITokenService tokenService,
25+
IHubspotAuthorizationService authorizationService)
2426
: base(settingsOptions)
2527
{
2628
_httpClientFactory = httpClientFactory;
2729
_tokenService = tokenService;
30+
_authorizationService = authorizationService;
2831
}
2932

3033
[HttpGet("validate")]
@@ -42,14 +45,47 @@ public async Task<IActionResult> ValidateAccessToken()
4245
Error = Constants.ErrorMessages.OAuthInvalidToken
4346
});
4447

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

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

5490
return Ok(new ResponseDto
5591
{

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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ public async Task<string> GetAccessTokenAsync(string code)
7474
var errorResult = await response.Content.ReadAsStringAsync();
7575
var errorDto = JsonSerializer.Deserialize<ErrorDto>(errorResult);
7676

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

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

8383
public string RefreshAccessToken() =>
@@ -115,7 +115,7 @@ public async Task<string> RefreshAccessTokenAsync()
115115
return result;
116116
}
117117

118-
return "error";
118+
return ErrorPrefix;
119119
}
120120
}
121121
}

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
@@ -15,7 +15,7 @@
1515
<PackageIconUrl></PackageIconUrl>
1616
<PackageProjectUrl>https://github.com/umbraco/Umbraco.Cms.Integrations/blob/main-v14/src/Umbraco.Cms.Integrations.Crm.Hubspot</PackageProjectUrl>
1717
<RepositoryUrl>https://github.com/umbraco/Umbraco.Cms.Integrations</RepositoryUrl>
18-
<Version>6.0.0</Version>
18+
<Version>6.0.1</Version>
1919
<Authors>Umbraco HQ</Authors>
2020
<Company>Umbraco</Company>
2121
<PackageTags>Umbraco;Umbraco-Marketplace</PackageTags>

0 commit comments

Comments
 (0)