如my question向Google API小组所述,我想出一种避免重定向的方法。
从理论上讲,这应该是可能的,因为来自一个客户端(JavaScript)的身份验证代码应该与客户端无关,因此,如果传递给PHP客户端以获取访问和刷新令牌,则该身份验证代码应该可以工作。
理论上的步骤: 1.客户得到authorization code 2.客户交换access和refresh令牌的授权代码
我该如何尝试?
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库中看不到其他任何明确/特定的授权令牌功能。
$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获取的授权代码?