【问题标题】:Google api php client code not return refresh tokenGoogle api php客户端代码不返回刷新令牌
【发布时间】:2018-04-22 16:47:00
【问题描述】:

我一直在尝试使用 google 从客户端返回的 javascript google 客户端“代码”从 google api 获取刷新令牌。它返回我发送到服务器端的代码。现在,我从服务器端发送代码以使用 using google-api-php-client 通过此调用获取刷新令牌和访问令牌:

https://www.googleapis.com/oauth2/v4/token

虽然我使用来自谷歌游乐场的相同代码,但我也得到了带有刷新令牌的响应,但我没有从我自己的服务器上得到它.. 这是代码

public function getRefreshToken($code)
{
    $client = new Google_Client();
    $client->setClientId(config('services.google.client_id'));
    $client->setClientSecret(config('services.google.client_secret'));
    $client->setRedirectUri('postmessage');
    $client->setScopes(config('services.google.scopes'));
    $client->setAccessType("offline");
    $client->setApprovalPrompt("force");
    dd($client->authenticate($code));
    dd($client->getRefreshToken());
    return ;
}

我已将访问类型设置为离线,如某些答案中所述,但我仍然收到带有刷新令牌的响应。这是响应

access_token :"xxxxxxxxxxxxxxxxxxxxxx"
created:1510242052
expires_in:3598
id_token:"xxxxxxxx"
token_type:"Bearer"

【问题讨论】:

    标签: javascript php google-api-php-client google-oauth google-authentication


    【解决方案1】:

    您的 php 代码对我来说看起来不错。我怀疑你的前端 javascript,特别是它构建的谷歌链接,可能是罪魁祸首。兑换时授权码是否生成刷新令牌部分取决于初始链接中包含哪些参数。

    this answer 中所述,javascript 客户端库使用“客户端流程”。通常在前端应用程序中你会指定response_type=token,但如果你指定response_type=code,相反,你会得到一个code。但在兑换时,code 不会产生刷新令牌。

    例如,a link built by a front end javascript library 可能如下所示:

    https://accounts.google.com/o/oauth2/v2/auth?client_id=7xxxxxxxxxxx-xxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:8080/oauth2callback.php&response_type=code&scope=profile
    

    您的后端可以兑换返回的code,但响应不会包含刷新令牌。这是设计使然。

    获取符合刷新令牌条件的code 的一种方法是使用后端 PHP 客户端库而不是 javascript 客户端库来构建链接。 $client->createAuthUrl() 会建立这样的链接:

    https://accounts.google.com/o/oauth2/auth?response_type=code&access_type=offline&client_id=7xxxxxxxxxx-hxxxxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2callback.php&state&scope=profile&approval_prompt=force

    This toy example 以这种方式构建链接并接收刷新令牌。

    注意添加了access_type=offineapproval_prompt=force。在成功验证后,这种情况下的重定向包括一个code确实在兑换时提供了一个刷新令牌。

    OAuth 2.0 Playground 会构建一个包含 access_type=offlineprompt=consent 的初始链接,该链接还会创建一个可兑换刷新令牌的代码。

    如果这没有帮助,也许您可​​以使用您的前端正在构建的 google 链接更新问题? (当然,客户 ID 已编辑)

    【讨论】:

    • 我尝试了你要求我做的事情,但我得到一个“ORIGIN PARAMETER REQUIRED”错误..
    • 您现在是否获得了刷新令牌?您何时收到此错误 - 当您第一次访问 Google 时?当你打电话给authenticate()?当您尝试实际使用 access_token 时?此错误听起来像是 Maps API 错误....这是您尝试使用的内容吗?
    • 这里有两件事要说。 1.首先,这里关于堆栈溢出的任何答案都没有提到这一点,那么为什么我必须在这个问题上给予赏金?它没有在任何地方得到回答,仍然没有人关注这个问题。 2. GOOGLE DOCUMENTS 中的任何地方都没有提到这样的内容。为什么会这样?
    • 该问题没有具体说明您在哪一步没有得到响应。答案中所说的代码很好。重要的是令牌。您要传递哪个令牌来刷新它。 stackoverflow.com/questions/9241213/… 链接有详细的已接受答案。如果您仍然没有成功,请告诉我您的测试数据。
    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 2021-09-09
    • 2012-12-27
    • 2013-02-03
    • 2012-03-03
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多