正如我向 Google API 团队提出的问题中所详述的那样,我想找到一种避免重定向的方法。
从理论上讲,这应该是可能的,因为来自一个客户端(JavaScript)的身份验证代码应该与客户端无关,因此如果传递给 PHP 客户端以获取访问和刷新令牌,它应该可以工作。
理论步骤:
我如何尝试这个?
- 运行 JavaScript 客户端以获取身份验证令牌
GoogleAuth = gapi.auth2.getAuthInstance()
GoogleAuth.grantOfflineAccess({
scope: 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/plus.business.manage https://www.googleapis.com/auth/plus.me openid email profile'
}).then(function (resp) {
var auth_code = resp.code;
console.log("AuthCode:" + auth_code)
})
此时我得到一个代码,不确定这是授权代码还是访问令牌,但我在 Javascript 库中看不到任何其他明确/特定于授权令牌的函数。
- 使用 PHP API 库中的身份验证令牌
$error = $request->get('error');
$code = $request->get('code');
if($error){
throw new Exception('Error from authenticating ' . $error);
}
$client = new \Google_Client();
$client->setAuthConfig(getcwd() . '/../client_secret.apps.googleusercontent.com.json');
$client->setAccessType("offline"); // offline access
$client->setIncludeGrantedScopes(true); // incremental auth
$client->addScope(
array(
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/plus.business.manage'
)
);
$client->setRedirectUri('http://myserver.com/code');
$client->setApprovalPrompt('force');
$client->fetchAccessTokenWithAuthCode($code);
$accessToken = $client->getAccessToken();
return new Response(
"<html><body>Authenticated with code : " . $code . "<br/>\n\n".
" Access Token is : ". var_export($accessToken, true) . "</body></html>"
);
- 访问令牌仍然为空。该行
$accessToken = $client->getAccessToken();
返回 null 或 false。
这适用于基于 PHP 的完整版本,但 PHP 版本基于创建用户需要遵循的链接,然后用户在 Google 服务器上并可以批准应用程序,当批准后,用户将被重定向回应用程序。然后应用程序收到验证码。
我只是想避免由于单页应用程序的架构或偏好而导致的重定向。我能想到的唯一选择是打开一个弹出窗口并在返回访问和刷新代码时通知原始窗口,以便 PHP 客户端可以继续查询 API,但恕我直言,这是一个丑陋的解决方案。
是否有另一种方法来获取适用于 PHP 但从 JavaScript 获得的授权代码?