Sye*_*zmi 9 javascript php google-authentication google-api-php-client google-oauth2
我一直试图从谷歌api使用谷歌客户端"代码"从谷歌客户端返回刷新令牌.它返回我发送到服务器端的代码.现在从服务器端我发送代码以使用google-api-php-client通过此调用获取刷新令牌和访问令牌:
https://www.googleapis.com/oauth2/v4/token
Run Code Online (Sandbox Code Playgroud)
虽然我使用谷歌操场上相同的代码我也得到了刷新令牌的响应,但我没有从我自己的服务器得到它..这是代码
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 ;
}
Run Code Online (Sandbox Code Playgroud)
我已经将访问类型设置为离线,如某些答案中所述,但我仍然使用刷新令牌获得响应.这是响应
access_token :"xxxxxxxxxxxxxxxxxxxxxx"
created:1510242052
expires_in:3598
id_token:"xxxxxxxx"
token_type:"Bearer"
Run Code Online (Sandbox Code Playgroud)
你的PHP代码对我来说很好.我怀疑你的前端javascript,特别是谷歌建立的链接,可能是罪魁祸首.授权代码在兑换时是否生成刷新令牌部分取决于Google初始链接中包含的参数.
如本答案所述,javascript客户端库使用"客户端流程".通常在您指定的前端应用程序中response_type=token,但如果您指定response_type=code,则会code返回.但是当兑换时,这code不会产生刷新令牌.
例如,前端javascript库构建的链接可能如下所示:
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
Run Code Online (Sandbox Code Playgroud)
您的后端可以兑换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 =力
这个玩具示例以这种方式构建链接并且确实接收刷新令牌.
注意添加access_type=offine和approval_prompt=force.认证成功后,在这种情况下,重定向包括code那不赎回时提供一个刷新令牌.
OAuth 2.0 playground构建了一个包含access_type=offline和的初始链接,prompt=consent它还创建了一个可兑换刷新令牌的代码.
如果这没有帮助,也许您可以使用google正在构建的链接更新问题?(当然,客户端ID被编辑)