Google api php客户端代码不返回刷新令牌

时间:2017-11-09 15:50:18

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

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

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

虽然我使用google playground中的相同代码,但我也得到了带有刷新令牌的响应,但是我没有从我自己的服务器上获取它。 这是代码

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"

1 个答案:

答案 0 :(得分:7)

你的PHP代码对我来说很好看。我怀疑你的前端javascript,特别是谷歌建立的链接,可能是罪魁祸首。授权代码在兑换时是否生成刷新令牌部分取决于Google初始链接中包含的参数。

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 =离线&安培; CLIENT_ID = 7xxxxxxxxxx-hxxxxxxxxxxxxxxxx.apps.googleusercontent.com&安培; REDIRECT_URI = HTTP%3A%2F%2Flocalhost%3A8080%2Foauth2callback.php&安培;状态&安培;范围=简档&安培;的 approval_prompt =力

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

请注意添加access_type=offineapproval_prompt=force。验证成功后,此案例中的重定向包含code 在兑换时提供刷新令牌。

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

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