我们在我们的 Android 应用程序中使用 Retrofit 来与 OAuth2 安全服务器进行通信。一切正常,我们使用 RequestInterceptor 在每次调用中包含访问令牌。但是有时访问令牌将过期,并且需要刷新令牌。当令牌过期时,下一次调用将返回未经授权的 HTTP 代码,因此很容易监控。我们可以通过以下方式修改每个 Retrofit 调用:在失败回调中,检查错误代码,如果等于 Unauthorized,则刷新 OAuth 令牌,然后重复 Retrofit 调用。但是,为此,应该修改所有调用,这不是一个易于维护且良好的解决方案。有没有办法在不修改所有改造调用的情况下做到这一点?
请不要Interceptors用于处理身份验证。
Interceptors
目前,处理身份验证的最佳方法是使用Authenticator专门为此目的设计的新 API 。
Authenticator
当响应 重试上次失败的请求 时,OkHttp 将 自动询问 凭据。Authenticator``401 Not Authorised
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 附加Authenticator到OkHttpClient``Interceptors
OkHttpClient``Interceptors
OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setAuthenticator(authAuthenticator);
创建您的时使用此客户端Retrofit RestAdapter
Retrofit
RestAdapter
RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(ENDPOINT) .setClient(new OkClient(okHttpClient)) .build(); return restAdapter.create(API.class);