gpt4 book ai didi

android - Android 中的 Oauth2 刷新 token 更新

转载 作者:行者123 更新时间:2023-11-30 00:53:05 25 4
gpt4 key购买 nike

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

当前场景

我有一个 NetUtils 类,它像一个单例一样使用安全的 rest 模板管理我的所有请求。该 rest 模板使用请求包装器为每个请求注入(inject)所需的 Authorization header 。 NetUtils 类处理 token 和超时,将它们保存在用户首选项中并在需要时刷新它们。

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

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;
}
}

其他选择

例如,其他选择是让刷新 token 长期存在并在每次应用启动时刷新它。我必须提到 client_idclient_secret 目前正在应用程序中进行硬编码(尽管客户端凭证授权并不意味着在生产中启用,因此仍然需要提供用于检索 token 的用户名和密码)。

这里的最佳做法是什么?

最佳答案

我想我不能建议你如何用 Java 编码,但我在用 PHP 创建应用程序时也遇到了一些关于 refresh_token 的问题,所以也许我的想法会对你有所帮助。

起初我一直在寻找永不过期的 refresh_token(就像在 Google API 中一样),因此我什至可以对其进行硬编码并在我想创建新的 access_token 时使用。无论如何,在 oAuth2 中真的很难做到。所以我在这里发现了一个关于这个问题的有趣的观点:

Why do access tokens expire?

它向我展示了使用 refresh_token 的其他方式。我已经在我的 oAuth 服务上设置它生成并返回一个新的 refresh_token 每次我使用 refresh_token 来获取一个新的 access_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,我觉得他应该重新给自己授权。

关于android - Android 中的 Oauth2 刷新 token 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40614382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com