我正在为Oauth使用Scribe,以获取auth_code的access_token和refresh_token。它对于第一次身份验证非常有效。
当我在我的应用程序中禁用凭据时,该应用程序的Gmail连接的应用程序仍然存在令牌。
当我重新启用oauth时,我只获得新的auth_code的有效新access_token。但是refresh_token为null。
我尝试用oauthplayground复制相同的内容,在那里我可以看到有效的刷新和访问令牌,而Google联网应用中仍然存在游乐场令牌。
这是我用scribe-1.3.0 API实现的代码
OAuthRequest oAuthRequest = new OAuthRequest(Verb.POST, "https://accounts.google.com/o/oauth2/token");
oAuthRequest.addBodyParameter("client_id", SMTP_OAUTH_CLIENT_ID);
oAuthRequest.addBodyParameter("client_secret", SMTP_OAUTH_CLIENT_SECRET);
oAuthRequest.addBodyParameter("scope", scope);
oAuthRequest.addBodyParameter("redirect_uri", GoogleApi.getRedirectURL());
oAuthRequest.addBodyParameter("code", authCode);
oAuthRequest.addBodyParameter("grant_type", "authorization_code");
Response response = oAuthRequest.send();
这是使用googleapi-client-1.20尝试的类似代码,结果仍然相同。
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
new NetHttpTransport(),
new JacksonFactory(),
SMTP_OAUTH_CLIENT_ID, SMTP_OAUTH_CLIENT_SECRET,
authCode,
GoogleApi.getRedirectURL())
.execute();
Credential gcredential = new GoogleCredential
.Builder()
.setTransport(new NetHttpTransport.Builder().build())
.setJsonFactory(new JacksonFactory())
.setClientSecrets(SMTP_OAUTH_CLIENT_ID, SMTP_OAUTH_CLIENT_SECRET)
.build()
.setFromTokenResponse(tokenResponse);
gcredential.refreshToken();
System.out.println(gcredential.getRefreshToken());
谁能帮我解决我的问题?
感谢您抽出宝贵的时间研究此问题。
最佳答案
重新认证时,您需要设置以下参数access_type=offline
和approval_prompt=force
那么您将收到refresh_token
以下是示例网址
https://accounts.google.com/o/oauth2/auth?client_id=CLIENT_ID&scope=SCOPE&redirect_uri=REDIRECT_URL&response_type=code&access_type=offline&approval_prompt=force
关于java - 重新验证Gmail API以使用Oauth发送电子邮件时,将refresh_token设置为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40974619/