请求新的访问令牌并重新提交api请求

Lib*_*eph 6 c# xamarin xamarin.forms refit

我正在使用我的Xamarin表单项目的Refit库来发送API请求.它工作得很好,但在访问令牌到期时会出现问题.

当访问令牌到期时,我从服务器收到401错误,如预期的那样.然后我打电话给Identity Server发出新的访问令牌,但我很难重新提交API请求.我仍然有未经授权的错误.感谢一些帮助.

我创建了一个AuthenticatedHttpClientHandler类来处理令牌.

public class AuthenticatedHttpClientHandler : HttpClientHandler
{
    private readonly string _token;

    public AuthenticatedHttpClientHandler(string token ) 
    {
        _token = token;       
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var auth = request.Headers.Authorization;
        if (auth != null && !string.IsNullOrWhiteSpace(_token))
        {
            request.Headers.Authorization = new AuthenticationHeaderValue(auth.Scheme, _token);
        }
        else
        {
            request.Headers.Remove("Authorization");
        }
        var result = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
        if (result.StatusCode == System.Net.HttpStatusCode.Unauthorized )
        {
            IdSrvApiService idsrvApiService = new IdSrvApiService();
            RefreshTokenService refreshTokneService = new RefreshTokenService(idsrvApiService);

            if( Settings.RefreshToken != ""){
                var newToken = await refreshTokneService.RefreshAccessToken(Priority.Background).ConfigureAwait(false);
                TokenHelper.CacheToken(newToken);
                request.Headers.Authorization = new AuthenticationHeaderValue(auth.Scheme, Settings.AccessToken);
                return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
            }
            else
            {
                return result;
            }
        }
        else
        {
            return result;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 3

我建议检查发送的原始请求,看看刷新令牌后发送的请求是否发送了正确的标头。

您也有可能在第二次尝试时发送错误的令牌。确认其中的值newToken是正在使用的值Settings.AccessToken