Вход в Google+, Как получить электронную почту пользователя

Я использую кнопку «Войти через Google+» на веб-странице, и все работает нормально, за исключением того, что я не могу получить адрес электронной почты пользователя.

Вот мой HTML-код

<div id="signinButton">
<span class="g-signin"data-scope="https://www.googleapis.com/auth/plus.login"data-clientid="{{ google.cid }}"data-redirecturi="postmessage"data-accesstype="offline"data-cookiepolicy="single_host_origin"data-callback="signInCallback">
</span>
</div>

Когда пользователь нажимает на эту кнопку & принять, чтобы поделиться своими данными с моим приложением, код отправляется в ajax на сервер. Вот серверная часть, которая должна получать пользовательские данные.

$code = $request->getContent();

$client = new Google_Client();
$client->setClientId('Google_Api_Code');
$client->setClientSecret('Google_Api_Secret');
$client->setRedirectUri('postmessage');
$client->setScopes('email', 'profile');
$client->authenticate($code);
$oAuth = new Google_Service_Oauth2($client);
$oAttr = $oAuth->userinfo->get();

return new Response(var_dump($oAttr));

А вот var_dump пользовательской информации

объект(Google_Service_Oauth2_Userinfoplus) [268] защищенный ‘internal_gapi_mappings’ =>
массив (Размер = 3)
—‘familyName’ => строка ‘имя_фамилии’ (Длина = 11)
—‘GivenName’ => строка ‘имя_символа’ (Длина = 10)
—‘VerifiedEmail’ => строка ‘Verified_email’ (Длина = 14)
общественности ’email’ => ноль
общественности ‘familyName’ => string> ‘SomeFamilyName’ (Длина = 6)
общественности ‘пол’ => строка «мужской» (Длина = 4)
общественности ‘GivenName’ => строка ‘SomeFirstName’ (Длина = 4)
общественности ‘hd’ => ноль
общественности ‘id’ => строка ‘1021714674404 ********’ (Длина = 21)
общественности ‘ссылка’ => строка «https://plus.google.com/1021714674404********» (Длина = 45)
общественности ‘locale’ => строка ‘en’ (Длина = 2)
общественности ‘name’ => строка ‘SomeFirstName SomeFamilyName’ (Длина = 11)
общественности ‘picture’ => строка «https://lh6.googleusercontent.com/someUrl/» (Длина = 92)
общественности ‘VerifiedEmail’ => ноль
защищенный ‘modelData’ =>
—-массив (Размер = 2)
——‘Given_name’ => строка ‘SomeFirstName’ (Длина = 4)
——‘family_name’ => строка ‘SomeFamilyName’ (Длина = 6)
защищенный ‘обработано’ =>
—-массив (Размер = 0)
——пустой

Как вы можете видеть, мой адрес электронной почты НЕДЕЙСТВИТЕЛЕН, и мне действительно нужно получить хотя бы адрес электронной почты (также фамилии и имя, но у меня они есть).

В начале я использовал объект Google_Service_Plus, но у меня был тот же результат (адрес электронной почты ноль), и я нашел текущее решение в этой теме (Единый вход Служб Google — имя и фамилия с OAuth 2 без использования Google+) но все равно не работает
Я тоже нашел эту ветку (Использование Google+ API для PHP — необходимо получить электронную почту пользователей) но теперь apiOauth2Service, похоже, называется Google_Service_Oauth2, поэтому он в основном такой же.

Что странно, что когда я использую собственный пример Google (https://developers.google.com/apis-explorer/#p/plus/v1/plus.people.get) и я пытаюсь получить свой адрес электронной почты с моим идентификатором пользователя, он возвращает пустой массив (который объясняет нулевое значение в моем коде).

200 ОК

  • Скрыть заголовки —

Cache-Control: приватный, max-age = 0, обязательно повторная проверка, без преобразования
Контент-кодировка: gzip
Длина контента: 23
Тип контента: приложение / JSON; кодировка = UTF-8
Дата: понедельник, 24 ноября 2014 г. 17:34:39 GMT
Etag: «RqKWnRU4WW46-6W3rWhLR9iFZQM / C5t5kUwLc-tXgfm2-1GGe31qPDs» истекает: понедельник, 24 ноября 2014 г. 17:34:39 GMT
Сервер: GSE

{
}

Я тоже пробовал это решение (Google Api получает адрес электронной почты пользователей) но это тоже не работает.

Тем не менее, когда я пытаюсь зарегистрироваться на этом сайте (https://www.airbnb.fr/) с моей учетной записью Google, они получили мой адрес электронной почты! Так что это возможно, я просто не знаю как.

Заранее спасибо за помощь :).

0

Решение

Поэтому я выяснил, откуда возникла ошибка.

В моем коде Google не отправляет мне электронную почту пользователя, потому что мое приложение не аутентифицировано. Из-за этой проблемы аутентификации у меня мог быть доступ только к публичной информации пользователя, но не к электронной почте.

Эта ошибка аутентификации произошла из этой строки в HTML

data-redirecturi="postmessage"

Когда значение «postmessage» используется в качестве redirect_uri, ваше приложение будет иметь привилегию «guest», и Google не выдаст никакой ошибки в отношении параметра redirect_uri. Это значение следует использовать только в начале разработки, чтобы проверить связь между API Google и вашим приложением.

Здесь официальная документация о параметре redirect_uri:

Значение этого параметра должно точно соответствовать одному из значений, отображаемых на странице «Учетные данные» в консоли разработчика Google (включая схему http или https, регистр и косую черту)

Тем не менее, я не смог заставить вещи работать с использованием Google SDK JavaScript, как показано выше.
Я использовал основную ссылку:

<a href="https://accounts.google.com/o/oauth2/auth?redirect_uri=http://www.example.com/googleplus/&response_type=code&client_id={{ google.cid }}&scope=https://www.googleapis.com/auth/plus.login+https://www.googleapis.com/auth/userinfo.email&access_type=offline" >
Connect with Google+
</a>

Детская площадка очень помог мне решить эту проблему.

Надеюсь, это кому-нибудь поможет 🙂

1

Другие решения

Вы также должны установить область действия электронной почты в html, больше информации области электронной почты:

<div id="signinButton">
<span class="g-signin"data-scope="https://www.googleapis.com/auth/plus.login email"...
data-callback="signInCallback">
</span>
</div>

или другой вариант:

<div id="signinButton">
<span class="g-signin"data-scope="https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/plus.profile.emails.read"...
data-callback="signInCallback">
</span>
</div>
0

зайдите в Google / model.php
cheange

protected $modelData = array();
to
public $modelData = array();
0
По вопросам рекламы [email protected]