当前位置: 首页 > 知识库问答 >
问题:

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

郗亦
2023-03-14

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

共有1个答案

彭阳朔
2023-03-14

请不要使用拦截器来处理身份验证。

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

当响应为401未授权时,OkHttp将自动向Authenticator询问凭据,以重试上次失败的请求。

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;
    }
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setAuthenticator(authAuthenticator);

在创建翻新RestAdapter时使用此客户端

RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(ENDPOINT)
                .setClient(new OkClient(okHttpClient))
                .build();
return restAdapter.create(API.class);
 类似资料:
  • 我是React Native的新手,我遇到的第一个障碍是在访问令牌到期时刷新我的访问令牌。基本实现是这样的,有一个访问令牌和一个刷新令牌。访问令牌到期,刷新令牌在授权标头中发送以刷新访问令牌。基于这篇SO帖子,我实现了一个中间件,它在每次API调用期间检查我们的访问令牌是否即将到期。如果是这样,它会启动一个动作创建者,该动作创建者会调用API来刷新和确认新的访问令牌。我在这里只展示了刷新调用,以免

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 我有一个基于web的应用程序,使用谷歌OAuth2.0作为登录框架。它以前一直工作得很好,直到昨天。访问令牌过期后,applcation无法获取刷新令牌。除此之外,“请求许可”页面已经改为“有离线访问”,而不是“知道你在谷歌上是谁”和“查看你的电子邮件”。 我试图寻找类似的问题,但我找不到一个。这是从昨天开始发生的。在此之前,我从来没有对代码做过任何改变。

  • null 很抱歉太啰嗦了。 提前谢了。

  • 我想从谷歌得到访问令牌。Google API表示,要获得访问令牌,将代码和其他参数发送到令牌生成页面,响应将是一个JSON对象,如下所示: 但是,我没有收到刷新令牌。我的答复是: