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

时间:2018-01-08 11:25:48

标签: 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;
        }
    }
}

3 个答案:

答案 0 :(得分:3)

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

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

中使用的值

答案 1 :(得分:2)

有时我会得到同样的错误。由于服务器和客户端之间的时差,更有可能发生这种情况。当我收到此错误时,我强制用户注销。

但我从不尝试刷新令牌。在您的代码中,您想要refresh_token,但是您使用access_token发送请求。也许这可能是你的错。

 var newToken = await refreshTokneService.RefreshAccessToken(Priority.Background).ConfigureAwait(false);

我认为,这个方法存在问题。

答案 2 :(得分:1)

检查您的刷新令牌服务是否在http正文帖子上发送了正确的标题和参数。

接头:

  • 接受:application / json

体:

  • grant_type:refresh_token
  • client_id:您的客户ID(如适用)
  • client_secret:您的客户密码(如适用)
  • refresh_token:获取访问令牌时返回的刷新令牌属性(refresh_token)

确保您在正文标头请求(https://stackoverflow.com/a/5665663/4738253)内传递正确的Content-Type(application / x-www-form-urlencoded)或使用FormUrlEncodedContent创建和编码内容。 / p>