11using System ;
2+ using System . Threading ;
23using System . Threading . Tasks ;
34
45using 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}
0 commit comments