Google+: Получите access_token для уже авторизованных учетных записей через клиентскую библиотеку PHP

Я реализую гибридный процесс входа в систему с помощью Google+. Чего я хочу добиться, так это:

Если пользователь авторизовал приложение, в следующий раз, когда он вернется на веб-сайт, я хочу, чтобы он автоматически входил в систему.

В гибридном потоке Google автоматически регистрирует пользователя и отображает приветственное сообщение (javascript sdk) вместе с возвращаемым токеном доступа. Но для этого процесса требуется один вызов ajax для отправки в gogole api.

Я хочу сделать этот вызов через сам бэкэнд, используя клиентскую библиотеку Google PHP. Поскольку приложение уже авторизовано, оно должно просто вернуть токен доступа, как при использовании javascript sdk. Но я не могу понять, как этого добиться с помощью клиентской библиотеки. Кто-нибудь может мне помочь?


person shikhar.ja    schedule 24.04.2014    source источник


Ответы (1)


В параметрах вызова установите access_type: 'offline', затем необходимо получить новый токен, используя refresh_token, который предоставляется ОДИН РАЗ в ПЕРВЫЙ момент авторизации. Вам нужно будет сохранить этот refresh_token где-нибудь в вашей базе данных и соединить его с уже истекшим идентификатором токена доступа пользователя или каким-то образом и сделать еще один вызов для действительного токена доступа.

В настоящее время вы можете установить approval_prompt: 'force', но это просто уловка разработчиков, а не реальное решение.

Подробнее объяснено здесь обновить токен с помощью клиента Google API php

person Klemen Tusar    schedule 24.04.2014
comment
Этого я успешно добился, используя клиентскую библиотеку JS и PHP. Чего я не могу добиться, так это: установить approval_prompt = 'auto' или immediate = true, а затем выполнить $client->getAccessToken(), который в идеале должен возвращать токен доступа, если приложение уже авторизовано, или возвращать ошибку в противном случае. - person shikhar.ja; 24.04.2014
comment
Это не сработает так. Читайте ответ по ссылке выше. Вам нужно if($client->isAccessTokenExpired()) $client->refreshToken($refresh_token_from_db); - person Klemen Tusar; 24.04.2014
comment
Означает ли это, что я не могу автоматически войти в систему пользователя после того, как он авторизовал мое приложение без перенаправления или без показа подсказки, если он уже вошел в Google? Вся моя цель - войти в систему невидимо после авторизации приложения. - person shikhar.ja; 24.04.2014
comment
Ну конечно можете. Сохраните этот токен аутентификации в сеансе пользователя и войдите в свою систему. Если все в порядке, им не нужно повторно аутентифицировать токен, поскольку ваш сайт уже принимает их как зарегистрированных, не так ли? - person Klemen Tusar; 24.04.2014
comment
Таким образом, как только пользователь закрывает свой браузер, значения сеансов стираются. В следующий раз, когда он вернется, когда он нажмет кнопку входа в систему с помощью кнопки Google, он получит подсказку, которая мигает на секунду и исчезает, поскольку он авторизовал приложение задолго до этого. Это узкое место здесь. Я понимаю вашу точку зрения, но я не могу найти способ переместить это в бэкэнд без каких-либо перенаправлений. - person shikhar.ja; 24.04.2014
comment
Ну, вы можете использовать cookie или localStorage, если хотите. В противном случае окно подсказки не требуется. Видите ли, gapi.signin.render('myButton', additionalParams); уже вызывает API, и если вы сделаете быстрый AJAX для установки сеанса, пользователь даже не узнает :) - person Klemen Tusar; 24.04.2014
comment
Это именно то, что я делаю прямо сейчас. :) Но когда он находится на главной странице, он вызывает автоматическое перенаправление, что просто странно. На остальных страницах работает нормально. - person shikhar.ja; 24.04.2014