Как подробно описано в моем вопросе к команде Google API, я хотел бы найти способ избежать перенаправлений.
Теоретически это должно быть возможно, поскольку код аутентификации от одного клиента (JavaScript) должен быть независимым от клиента и, следовательно, он должен работать, если передан клиенту PHP для получения маркеров доступа и обновления.
Теоретические шаги: 1. Клиент получает код авторизации 2. Клиент обменивает код авторизации для доступа и обновления токенов
Как я пытаюсь это сделать?
- Запустите клиент 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 Library
$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?