小编典典

使用 Retrofit 刷新 OAuth 令牌而不修改所有调用

all

我们在我们的 Android 应用程序中使用 Retrofit 来与 OAuth2 安全服务器进行通信。一切正常,我们使用
RequestInterceptor 在每次调用中包含访问令牌。但是有时访问令牌将过期,并且需要刷新令牌。当令牌过期时,下一次调用将返回未经授权的 HTTP
代码,因此很容易监控。我们可以通过以下方式修改每个 Retrofit 调用:在失败回调中,检查错误代码,如果等于 Unauthorized,则刷新
OAuth 令牌,然后重复 Retrofit
调用。但是,为此,应该修改所有调用,这不是一个易于维护且良好的解决方案。有没有办法在不修改所有改造调用的情况下做到这一点?


阅读 168

收藏
2022-07-02

共1个答案

小编典典

请不要Interceptors用于处理身份验证。

目前,处理身份验证的最佳方法是使用Authenticator专门为此目的设计的新 API 。

当响应 重试上次失败的请求 时,OkHttp 将 自动询问 凭据。Authenticator``401 Not Authorised


public class TokenAuthenticator implements Authenticator {
    @Override
    public Request authenticate(Proxy proxy, Response response) throws IOException {
        // Refresh your access_token using a synchronous api request
        newAccessToken = service.refreshToken();

        // Add new header to rejected request and retry it
        return response.request().newBuilder()
                .header(AUTHORIZATION, newAccessToken)
                .build();
    }

    @Override
    public Request authenticateProxy(Proxy proxy, Response response) throws IOException {
        // Null indicates no attempt to authenticate.
        return null;
    }

以与您相同的方式将 an 附加AuthenticatorOkHttpClient``Interceptors

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setAuthenticator(authAuthenticator);

创建您的时使用此客户端Retrofit RestAdapter

RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(ENDPOINT)
                .setClient(new OkClient(okHttpClient))
                .build();
return restAdapter.create(API.class);
2022-07-02