我正在使用我的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;
}
}
}
答案 0 :(得分:3)
我建议检查发送的原始请求,以查看刷新令牌后发送的请求是否已发送正确的标头。
您还有可能在第二次尝试时发送错误的令牌。确认newToken
中的值是Settings.AccessToken
答案 1 :(得分:2)
有时我会得到同样的错误。由于服务器和客户端之间的时差,更有可能发生这种情况。当我收到此错误时,我强制用户注销。
但我从不尝试刷新令牌。在您的代码中,您想要refresh_token,但是您使用access_token发送请求。也许这可能是你的错。
var newToken = await refreshTokneService.RefreshAccessToken(Priority.Background).ConfigureAwait(false);
我认为,这个方法存在问题。
答案 2 :(得分:1)
检查您的刷新令牌服务是否在http正文帖子上发送了正确的标题和参数。
接头:
体:
确保您在正文标头请求(https://stackoverflow.com/a/5665663/4738253)内传递正确的Content-Type(application / x-www-form-urlencoded)或使用FormUrlEncodedContent创建和编码内容。 / p>