在刷新令牌下显示:
- 如有必要,刷新访问令牌。
访问令牌具有有限的生存期。如果您的应用程序需要在单个访问令牌的生存期之外访问Google API,则可以获取刷新令牌。刷新令牌使您的应用程序可以获得新的访问令牌。
我怎么知道此用例是否适用于我的应用?
我正在访问DCM / DFA数据,不确定是否需要担心刷新访问令牌。
编辑pinoyyid
pinoyyid提到刷新令牌。
在DCM示例应用中,此代码(com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp)
public Credential authorize(String userId) throws IOException {
try {
Credential credential = flow.loadCredential(userId);
if (credential != null
&& (credential.getRefreshToken() != null ||
credential.getExpiresInSeconds() == null ||
credential.getExpiresInSeconds() > 60)) {
return credential;
}
// open in browser
String redirectUri = receiver.getRedirectUri();
似乎要说,只要您拥有非null的刷新令牌,就可以通过身份验证。
我能够将我的刷新令牌替换为垃圾字符串,并且仍然可以访问。
这似乎是错的。有什么方法可以验证刷新令牌还是不必要?
对pinoyyid的最终编辑:
我想我明白了。我想确认这是对正在发生的事情的正确解释。
我的第一个线索是文档(https://developers.google.com/identity/protocols/OAuth2WebServer#offline)中所说的部分
“如果您使用Google API客户端库,则只要您将该对象配置为脱机访问,客户端对象就会根据需要刷新访问令牌。”
我正在使用以下内容:
google-oauth-client 1.24.1 google-oauth-client-java6 1.24.1 google-oauth-client-jetty 1.24.1
当我使用完全无效的访问令牌(“我不好”)和有效的刷新令牌运行时,执行 DCM API对com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient子类的调用,我观察到以下行为:
控制权通过方法:
传递给com.google.api.client.auth.oauth2.Credential public final boolean refreshToken() throws IOException {
lock.lock();
try {
try {
TokenResponse tokenResponse = executeRefreshToken();
if (tokenResponse != null) {
setFromTokenResponse(tokenResponse);
for (CredentialRefreshListener refreshListener : refreshListeners) {
refreshListener.onTokenResponse(this, tokenResponse);
}
return true;
}
} catch (TokenResponseException e) {
boolean statusCode4xx = 400 <= e.getStatusCode() && e.getStatusCode() < 500;
// check if it is a normal error response
if (e.getDetails() != null && statusCode4xx) {
// We were unable to get a new access token (e.g. it may have been revoked), we must now
// indicate that our current token is invalid.
setAccessToken(null);
setExpiresInSeconds(null);
}
for (CredentialRefreshListener refreshListener : refreshListeners) {
refreshListener.onTokenErrorResponse(this, e.getDetails());
}
if (statusCode4xx) {
throw e;
}
}
return false;
} finally {
lock.unlock();
}
}
只要刷新令牌有效,它就会消失并获得一个新的访问令牌(我尝试使用无效的刷新令牌并看到它失败了。)
成功获取新的访问令牌后,控制权传递给
refreshListener.onTokenErrorResponse(this, e.getDetails());
将令牌插入适当的对象中,然后继续访问。
如果运行刷新令牌错误,则上述方法将失败,并显示以下信息:
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "invalid_grant",
"error_description" : "Bad Request"
}