Skip to content

Commit 4050199

Browse files
committed
Refactor to address review comments
1 parent 2af0fed commit 4050199

File tree

4 files changed

+54
-30
lines changed

4 files changed

+54
-30
lines changed

EXAMPLES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,8 @@ public async Task<IActionResult> InitiateLoginWithCiba(string returnUrl = "/")
518518
return RedirectToAction("Waiting");
519519
}
520520

521+
// You could use the built-in polling mechanism or could implement your own polling mechanism by
522+
// accessing the `GetTokenAsync` method using the AuthenticationApiClient as shown in the example before.
521523
[HttpGet]
522524
public async Task<IActionResult> CheckCibaStatus()
523525
{

src/Auth0.AspNetCore.Authentication/Auth0WebAppAuthenticationBuilder.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Auth0.AspNetCore.Authentication.BackchannelLogout;
88
using Auth0.AspNetCore.Authentication.ClientInitiatedBackChannelAuthentication;
99
using Auth0.AuthenticationApi;
10+
using Microsoft.Extensions.DependencyInjection.Extensions;
1011

1112
namespace Auth0.AspNetCore.Authentication
1213
{
@@ -81,7 +82,10 @@ public Auth0WebAppAuthenticationBuilder WithAuthenticationApiClient()
8182
/// <returns></returns>
8283
public Auth0WebAppAuthenticationBuilder WithClientInitiatedBackchannelAuthentication()
8384
{
84-
_services.AddScoped<IAuth0CibaService, Auth0CibaService>();
85+
_services.TryAddSingleton<IAuthenticationApiClient>(
86+
_ => new AuthenticationApiClient(new Uri($"https://{_options.Domain}")));
87+
_services.TryAddScoped<IAuth0CibaService, Auth0CibaService>();
88+
8589
return this;
8690
}
8791

src/Auth0.AspNetCore.Authentication/ClientInitiatedBackChannelAuthentication/Auth0CibaService.cs

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading;
23
using System.Threading.Tasks;
34

45
using Microsoft.Extensions.Logging;
@@ -16,6 +17,12 @@ internal class Auth0CibaService : IAuth0CibaService
1617
private readonly Auth0WebAppOptions _options;
1718
private readonly ILogger<Auth0CibaService> _logger;
1819

20+
/// <summary>
21+
/// Initiates an instance of Auth0CibaService which can be used to execute the CIBA workflow.
22+
/// </summary>
23+
/// <param name="authenticationApiClient">Instance of <see cref="Auth0.AuthenticationApi.IAuthenticationApiClient"/> </param>
24+
/// <param name="optionsAccessor"><see cref="Auth0WebAppOptions"/></param>
25+
/// <param name="logger"></param>
1926
public Auth0CibaService(
2027
IAuthenticationApiClient authenticationApiClient,
2128
IOptions<Auth0WebAppOptions> optionsAccessor,
@@ -26,7 +33,9 @@ public Auth0CibaService(
2633
_logger = logger;
2734
}
2835

29-
public async Task<CibaInitiationDetails> InitiateAuthenticationAsync(CibaInitiationRequest request)
36+
/// <inheritdoc cref="Auth0.AspNetCore.Authentication.ClientInitiatedBackChannelAuthentication.IAuth0CibaService.InitiateAuthenticationAsync"/>
37+
public async Task<CibaInitiationDetails> InitiateAuthenticationAsync(
38+
CibaInitiationRequest request)
3039
{
3140
try
3241
{
@@ -63,7 +72,9 @@ public async Task<CibaInitiationDetails> InitiateAuthenticationAsync(CibaInitiat
6372
}
6473
}
6574

66-
public async Task<CibaCompletionDetails> PollForTokensAsync(CibaInitiationDetails initDetails)
75+
/// <inheritdoc cref="Auth0.AspNetCore.Authentication.ClientInitiatedBackChannelAuthentication.IAuth0CibaService.PollForTokensAsync"/>
76+
public async Task<CibaCompletionDetails> PollForTokensAsync(
77+
CibaInitiationDetails initDetails, CancellationToken cancellationToken)
6778
{
6879
var request = new ClientInitiatedBackchannelAuthorizationTokenRequest()
6980
{
@@ -74,24 +85,27 @@ public async Task<CibaCompletionDetails> PollForTokensAsync(CibaInitiationDetail
7485
AuthRequestId = initDetails.AuthRequestId
7586
};
7687

77-
while (true)
88+
var completionDetails = new CibaCompletionDetails()
89+
{
90+
IsSuccessful = false,
91+
IsAuthenticationPending = true
92+
};
93+
94+
while (completionDetails is { IsAuthenticationPending: true, IsSuccessful: false })
7895
{
7996
_logger.LogDebug($"Polling CIBA token endpoint for auth_req_id: {initDetails.AuthRequestId} ");
8097
try
8198
{
82-
var response = await _authenticationApiClient.GetTokenAsync(request);
83-
84-
return new CibaCompletionDetails
85-
{
86-
AccessToken = response.AccessToken,
87-
IdToken = response.IdToken,
88-
TokenType = response.TokenType,
89-
Scope = response.Scope,
90-
ExpiresIn = response.ExpiresIn,
91-
RefreshToken = response.RefreshToken,
92-
IsSuccessful = true,
93-
IsAuthenticationPending = false,
94-
};
99+
var response = await _authenticationApiClient.GetTokenAsync(request, cancellationToken);
100+
101+
completionDetails.AccessToken = response.AccessToken;
102+
completionDetails.IdToken = response.IdToken;
103+
completionDetails.TokenType = response.TokenType;
104+
completionDetails.Scope = response.Scope;
105+
completionDetails.ExpiresIn = response.ExpiresIn;
106+
completionDetails.RefreshToken = response.RefreshToken;
107+
completionDetails.IsSuccessful = true;
108+
completionDetails.IsAuthenticationPending = false;
95109
}
96110
catch (ErrorApiException ex)
97111
{
@@ -102,18 +116,16 @@ public async Task<CibaCompletionDetails> PollForTokensAsync(CibaInitiationDetail
102116

103117
if (ex.ApiError.Error.Contains("authorization_pending", StringComparison.OrdinalIgnoreCase))
104118
{
105-
await Task.Delay(TimeSpan.FromSeconds(initDetails.Interval ?? 5));
119+
await Task.Delay(TimeSpan.FromSeconds(initDetails.Interval));
106120
continue;
107121
}
108122

109-
return new CibaCompletionDetails
110-
{
111-
IsAuthenticationPending = false,
112-
Error = ex.ApiError.Error,
113-
ErrorMessage = ex.ApiError.Message,
114-
IsSuccessful = false
115-
};
123+
completionDetails.IsAuthenticationPending = false;
124+
completionDetails.Error = ex.ApiError.Error;
125+
completionDetails.ErrorMessage = ex.ApiError.Message;
126+
completionDetails.IsSuccessful = false;
116127
}
117128
}
129+
return completionDetails;
118130
}
119131
}

src/Auth0.AspNetCore.Authentication/ClientInitiatedBackChannelAuthentication/IAuth0CibaService.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
using System.Collections.Generic;
2+
using System.Threading;
23
using System.Threading.Tasks;
34

45
using Auth0.AuthenticationApi.Models.Ciba;
56

67
namespace Auth0.AspNetCore.Authentication.ClientInitiatedBackChannelAuthentication;
78

8-
public class CibaInitiationDetails
9+
public class CibaInitiationDetails : ClientInitiatedBackchannelAuthorizationResponse
910
{
10-
public string? AuthRequestId { get; init; }
11-
public int ExpiresIn { get; init; }
12-
public int? Interval { get; init; }
11+
/// <summary>
12+
/// Indicates whether the polling was successful.
13+
/// </summary>
1314
public bool IsSuccessful { get; init; } = true;
15+
16+
/// <summary>
17+
/// Indicates any errors that occurred during the initiation of the CIBA request.
18+
/// </summary>
1419
public string? ErrorMessage { get; init; }
1520
}
1621

@@ -70,6 +75,7 @@ public interface IAuth0CibaService
7075
/// Polls the token endpoint to check the status of a CIBA request and retrieve tokens upon completion.
7176
/// </summary>
7277
/// <param name="cibaInitiationDetails">The information required to poll for the CIBA status.</param>
78+
/// <param name="cancellationToken"><see cref="CancellationToken"/></param>
7379
/// <returns>Details about the CIBA completion status or the retrieved tokens.</returns>
74-
Task<CibaCompletionDetails> PollForTokensAsync(CibaInitiationDetails cibaInitiationDetails);
80+
Task<CibaCompletionDetails> PollForTokensAsync(CibaInitiationDetails cibaInitiationDetails, CancellationToken cancellationToken = default);
7581
}

0 commit comments

Comments
 (0)