Muh*_*man 249 gdata-api gdata access-token
我想从Google获取访问令牌. Google API说要获取访问令牌,请将代码和其他参数发送到令牌生成页面,响应将是一个JSON对象,如:
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
Run Code Online (Sandbox Code Playgroud)
但是,我没有收到刷新令牌.我的回答是:
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
Run Code Online (Sandbox Code Playgroud)
Ric*_*ton 633
在refresh_token只提供对来自用户的第一授权.后续授权(例如您在测试OAuth2集成时所使用的类型)将不会refresh_token再次返回.:)
refresh_token.或者,您可以将查询参数添加prompt=consent到OAuth重定向(请参阅Google的OAuth 2.0 for Web Server Applications页面).
这将提示用户再次授权应用程序并始终返回a refresh_token.
Gal*_*rad 57
为了得到刷新令牌,你必须同时添加approval_prompt=force和access_type="offline"
如果您正在使用谷歌提供的Java客户端,将是这样的:
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, getClientSecrets(), scopes)
.build();
AuthorizationCodeRequestUrl authorizationUrl =
flow.newAuthorizationUrl().setRedirectUri(callBackUrl)
.setApprovalPrompt("force")
.setAccessType("offline");
Run Code Online (Sandbox Code Playgroud)
Nor*_*ert 27
我搜索了一个漫长的夜晚,这就是诀窍:
从admin-sdk修改了user-example.php
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$authUrl = $client->createAuthUrl();
echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";
Run Code Online (Sandbox Code Playgroud)
然后,您将获得重定向URL处的代码以及使用代码进行身份验证并获取刷新令牌
$client()->authenticate($_GET['code']);
echo $client()->getRefreshToken();
Run Code Online (Sandbox Code Playgroud)
你现在应该存储它;)
当你的accesskey超时时就这样做了
$client->refreshToken($theRefreshTokenYouHadStored);
Run Code Online (Sandbox Code Playgroud)
jet*_*eon 16
这让我有些困惑,所以我想我会分享我学到的东西:
当您使用access_type=offline和approval_prompt=force参数请求访问时,您应该同时收到访问令牌和刷新令牌.在访问你收到它,你将需要刷新之后令牌即将到期.
您正确地发出了获取新访问令牌的请求,并收到了具有新访问令牌的响应.我也因为没有获得新的刷新令牌而感到困惑.但是,这就是它的意思,因为您可以一遍又一遍地使用相同的刷新令牌.
我认为其他一些答案假设您想出于某种原因让自己获得一个新的刷新令牌,并建议您重新授权用户,但事实上,您不需要因为您拥有的刷新令牌将一直有效被用户撤销.
Rich Sutton的答案终于为我工作了,之后我意识到access_type=offline在前端客户端对授权代码的请求进行了添加,而不是为access_token交换该代码的后端请求.我已经在Google上为他的回答和此链接添加了评论,以获取有关刷新令牌的更多信息.
PS如果您使用的是Satellizer,以下是如何将该选项添加到AngularJS中的$ authProvider.google.
我想为遇到此问题的那些沮丧的灵魂添加有关此主题的更多信息。获取离线应用程序刷新令牌的关键是确保您显示的是同意屏幕。该refresh_token只通过点击“允许”用户权限授予后立即返回。
在我在开发环境中进行了一些测试并因此已经在给定帐户上授权了我的应用程序之后,我(我怀疑还有很多其他人)出现了这个问题。然后我转到生产并尝试使用已经授权的帐户再次进行身份验证。在这种情况下,同意屏幕不会再次出现并且 api不会返回新的刷新令牌。要使此工作正常进行,您必须通过以下任一方式强制同意屏幕再次出现:
prompt=consent
Run Code Online (Sandbox Code Playgroud)
或者
approval_prompt=force
Run Code Online (Sandbox Code Playgroud)
任何一种都可以使用,但您不应同时使用两者。截至 2021 年,我建议使用,prompt=consent因为它替换了旧参数,approval_prompt并且在某些 api 版本中,后者实际上已损坏(https://github.com/googleapis/oauth2client/issues/453)。此外,prompt是一个以空格分隔的列表,因此您可以将其设置为prompt=select_account%20consent两者都想要。
当然你还需要:
access_type=offline
Run Code Online (Sandbox Code Playgroud)
补充阅读:
为了获得refresh_token您需要包含access_type=offline在 OAuth 请求 URL 中的信息。当用户第一次进行身份验证时,您将返回一个非零refresh_token和一个access_token过期的。
如果您遇到这样的情况,用户可能会重新验证您已经拥有身份验证令牌的帐户(如上面提到的 @SsjCosty),您需要从 Google 获取有关该令牌用于哪个帐户的信息。为此,请添加profile到您的范围。使用 OAuth2 Ruby gem,您的最终请求可能如下所示:
client = OAuth2::Client.new(
ENV["GOOGLE_CLIENT_ID"],
ENV["GOOGLE_CLIENT_SECRET"],
authorize_url: "https://accounts.google.com/o/oauth2/auth",
token_url: "https://accounts.google.com/o/oauth2/token"
)
# Configure authorization url
client.authorize_url(
scope: "https://www.googleapis.com/auth/analytics.readonly profile",
redirect_uri: callback_url,
access_type: "offline",
prompt: "select_account"
)
Run Code Online (Sandbox Code Playgroud)
请注意,范围有两个以空格分隔的条目,一个用于对 Google Analytics 的只读访问,另一个是 just profile,这是 OpenID Connect 标准。
这将导致 Googleid_token在get_token响应中提供一个额外的属性。要从 id_token 中获取信息,请查看Google 文档中的此页面。有一些 Google 提供的库可以为您验证和“解码”(我使用了 Ruby google-id-token gem)。解析后,该sub参数实际上就是唯一的 Google 帐户 ID。
值得注意的是,如果您更改范围,您将再次为已经使用原始范围进行身份验证的用户取回刷新令牌。例如,如果您已经有很多用户并且不想让他们都在 Google 中取消对应用程序的身份验证,这将非常有用。
哦,还有最后一点:你不需要 prompt=select_account,但如果您的用户可能想要使用多个 Google 帐户进行身份验证(即,您不使用它进行登录/身份验证),它会很有用.
| 归档时间: |
|
| 查看次数: |
104280 次 |
| 最近记录: |