相关疑难解决方法(0)

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

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

android oauth-2.0 retrofit

141
推荐指数
4
解决办法
6万
查看次数

当多个请求发送到服务器时,Okhttp刷新过期令牌

我同时加载了一个ViewPager和三个webservice调用ViewPager.

当第一个返回401时,Authenticator调用并刷新内部令牌Authenticator,但剩余的2个请求已经发送到具有旧刷新令牌的服务器,并且失败,498在Interceptor中捕获并且应用程序被注销.

这不是我期望的理想行为.我想将第二个和第三个请求保留在队列中,当刷新令牌时,重试排队的请求.

目前,我有一个变量来指示令牌刷新是否正在进行中Authenticator,在这种情况下,我取消了所有后续请求Interceptor,用户必须手动刷新页面,否则我可以注销用户并强制用户登录.

使用okhttp 3.x for Android的上述问题有什么好的解决方案或架构?

编辑:我想解决的问题一般,我不想对我的电话进行排序.即等待一个调用完成并刷新令牌,然后仅在活动和片段级别上发送其余请求.

代码被要求.这是一个标准代码Authenticator:

public class CustomAuthenticator implements Authenticator {

    @Inject AccountManager accountManager;
    @Inject @AccountType String accountType;
    @Inject @AuthTokenType String authTokenType;

    @Inject
    public ApiAuthenticator(@ForApplication Context context) {
    }

    @Override
    public Request authenticate(Route route, Response response) throws IOException {

        // Invaidate authToken
        String accessToken = accountManager.peekAuthToken(account, authTokenType);
        if (accessToken != null) {
            accountManager.invalidateAuthToken(accountType, accessToken);
        }
        try {
                // Get new refresh …
Run Code Online (Sandbox Code Playgroud)

java android http retrofit okhttp

31
推荐指数
3
解决办法
5564
查看次数

标签 统计

android ×2

retrofit ×2

http ×1

java ×1

oauth-2.0 ×1

okhttp ×1