我一直试图从谷歌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"
答案 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=offine
和approval_prompt=force
。验证成功后,此案例中的重定向包含code
, 在兑换时提供刷新令牌。
OAuth 2.0操场构建一个包含access_type=offline
和prompt=consent
的初始链接,该链接还会创建可兑换刷新令牌的代码。
如果这没有帮助,也许您可以使用google正在构建的google链接更新问题? (当然,编辑客户端ID)