Android中的Oauth2刷新令牌续订

Android中的Oauth2刷新令牌续订

问题描述:

我正在开发一个Android应用程序,它使用Oauth2令牌来获取授权以访问受保护的资源。我使用第三方平台作为身份验证服务器(使用OpenId Connect)。基本上我的问题是,我想处理过期的刷新令牌。Android中的Oauth2刷新令牌续订

目前的情况

我有一个NetUtils类的行为像一个单身和管理使用安全模板休息我所有的请求。该剩余模板使用请求包装为每个请求注入所需的授权标头。 NetUtils类处理whith令牌和超时,将它们保存在用户首选项中,并在需要时刷新它们。

但是,刷新令牌本身到期时会出现问题。在我使用授权码流时,我需要打开一个WebView并将用户重定向到登录页面,但是当NetUtils类确定刷新令牌已过期时,我会注意到它。理想情况下,应用程序将启动WebView,用户将再次登录并执行存储的请求。这是我的代码,以刷新访问令牌:

private AccessToken refreshToken(String idClient, String clientSecret, AccessToken accessToken) { 
    MultiValueMap<String, String> clientAuthenticationForm = new LinkedMultiValueMap<>(); 
    clientAuthenticationForm.add("grant_type", "refresh_token"); 
    clientAuthenticationForm.add("refresh_token", accessToken.getRefreshToken()); 
    clientAuthenticationForm.add("client_id", idClient); 
    clientAuthenticationForm.add("client_secret", clientSecret); 
    try { 
     long lastClientRefresh = mPrefs.getLong(Preferences.LAST_LOGIN_TIME, Long.MIN_VALUE); 
     boolean refreshTokenExpired = lastClientRefresh 
       + TimeUnit.SECONDS.toMillis(accessToken.getRefreshExpiresIn()) < System 
       .currentTimeMillis(); 
     if (!refreshTokenExpired) { 
      return regularRestTemplate 
        .postForEntity(tokenUrl(), clientAuthenticationForm, AccessToken.class) 
        .getBody(); 
     }else{ 
      //How to cope with this? 
      return null; 
     } 
    } catch (Exception ex) { 
     Log.e(TAG, ex.getMessage(), ex); 
     throw ex; 
    } 
} 

其他选择

其他的选择是让刷新令牌长期居住并刷新每个应用程序启动,例如时间。我不得不提及client_idclient_secret当前正在应用程序中进行硬编码(尽管客户端凭证授权并不打算在生产环境中启用,因此仍然需要提供用户名和密码来检索令牌)。

这里最好的做法是什么?

我想我不能建议你如何在Java中编写代码,但我也在使用PHP创建应用程序时遇到了一些refresh_token问题,所以也许我的想法可以帮助你解决某些问题。

起初我一直在寻找从未到期的refresh_token(就像在Google API中一样),所以我甚至可以对它进行硬编码并使用,只要我想创建一个新的access_token。无论如何,在oAuth2中确实很难做到。所以我发现在这个问题上一个有趣的外观在这里:

Why do access tokens expire?

这表明我有点其他的方式与refresh_token工作。我已经设置了它生成的oAuth服务,并且每次使用refresh_token获取新的access_token时都会返回一个新的refresh_token。这部分让我最:

https://bshaffer.github.io/oauth2-server-php-docs/grant-types/refresh-token/

还有我们得到的东西,如:

$server = new OAuth2\Server($storage, array(
    'always_issue_new_refresh_token' => true, // this part 
    'refresh_token_lifetime'   => 2419200, 
)); 

在这种情况下,我有很长的活refresh_token,我可以在一些地方保存,当我需要它,我会使用它来获得一个新的access_token,但是响应也会为我提供一个新的refresh_token,我可以再次存储它,并在稍后使用它来获得一个新的access_token。

因此,在您的情况下,我认为最好的方法是每次使用refresh_token要求access_token时继续生成refresh_token。如果用户不会长时间使用您的APP,我认为他应该再次授权。

+0

感谢您的回复!这或多或少是我最后实施的 –