Доступ к Google MyBusiness с веб-серверов без перенаправлений
Как подробно описано в моем вопросе к команде 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();
возвращает ноль или ложь.
Это работает в полной версии на основе PHP, но версия PHP основана на создании ссылки, по которой пользователь должен перейти, затем пользователь находится на сервере Google и может утвердить приложение, после чего пользователь перенаправляется обратно в приложение. Затем приложение получает код аутентификации.
Я просто хотел бы избежать перенаправлений из-за архитектуры одностраничных приложений или просто предпочтений. Единственная альтернатива, о которой я могу подумать, - это открыть всплывающее окно и уведомить исходное окно, когда коды доступа и обновления будут возвращены, чтобы PHP-клиент мог продолжать запрашивать API, но это уродливое решение IMHO.
Есть ли другой способ получить код авторизации, который работает на PHP, но получен из JavaScript?