Получить информацию о пользователе через Google API

Можно ли получить информацию из профиля пользователя через Google API? Если возможно, какой API мне следует использовать?

Мне интересна такая информация:

Также было бы здорово получить другую информацию из профиля пользователя.


person glagola    schedule 20.08.2011    source источник


Ответы (9)


Добавьте это в область видимости - https://www.googleapis.com/auth/userinfo.profile

И после завершения авторизации получите информацию по адресу - https://www.googleapis.com/oauth2/v1/userinfo?alt=json

В нем есть масса информации, включая имя, URL общедоступного профиля, пол, фото и т. Д.

person Abhinav Manchanda    schedule 21.08.2011
comment
Я использовал указанные выше URL-адреса, но не смог получить профиль пользователя. Получение только "{". Пожалуйста, можете опубликовать код или ссылки. Заранее спасибо. - person Panache; 05.09.2011
comment
Хм, просто авторизуйте запрос с помощью OAuth 2. Этот URL-адрес возвращает данные для текущего пользователя, вошедшего в систему. Это приведет к ошибке, если вы сделаете запрос, не отправляя заголовок OAuth. - person Bob Aman; 17.01.2012
comment
Указанный вами URL-адрес работает отлично, например googleapis.com/oauth2/v1/userinfo. Но можете ли вы сказать, откуда вы взяли этот URL? Я пытался найти его, но нигде не нашел. Документирует ли Google эти URL-адреса в каком-либо месте? - person Akshar Raaj; 16.02.2015
comment
Где я могу увидеть спецификацию данных, возвращаемых для определенной области? - person Matko; 05.10.2015
comment
Scope userinfo.profile, похоже, устарел, вместо этого вы должны использовать профиль и электронную почту. developers.google.com/+/web/api/rest/ oauth # область авторизации - person Martin B.; 21.06.2016
comment
Я не могу получить информацию о поле (я сохранил информацию о поле в открытом доступе) с помощью этого прицела. Я попробовал для этого developers.google.com/oauthplayground игровую площадку oauth. Я хочу сделать это с помощью REST API на стороне сервера. вы можете мне помочь в этом? - person Vishant dhandha; 29.09.2017
comment
кто-нибудь может здесь ответить на мой вопрос? stackoverflow.com/ questions / 48632883 / - person Alexander Mills; 06.02.2018
comment
Вы можете просто запросить этот URL-адрес, используя токен доступа, который вы получите после того, как пользователь авторизует вас для доступа к этой области. Пример: curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" -H"Authorization: Bearer accessTokenHere" - person Pratik Singhal; 07.07.2018
comment
Чтобы получить справку в будущем, посетите эту страницу на платформе Google Identity Platform. URL-адрес работает с https://openidconnect.googleapis.com/v1/userinfo, а структура ответа - под 5. Получите информацию о пользователе из раздела токенов идентификатора. - person user3290525; 03.09.2019

область действия - https://www.googleapis.com/auth/userinfo.profile

return youraccess_token = access_token

получить https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=youraccess_token

вы получите json:

{
 "id": "xx",
 "name": "xx",
 "given_name": "xx",
 "family_name": "xx",
 "link": "xx",
 "picture": "xx",
 "gender": "xx",
 "locale": "xx"
}

Тахиру Ясину:

Это пример PHP.
Вы можете использовать функцию json_decode, чтобы получить массив userInfo.

$q = 'https://www.googleapis.com/oauth2/v1/userinfo?access_token=xxx';
$json = file_get_contents($q);
$userInfoArray = json_decode($json,true);
$googleEmail = $userInfoArray['email'];
$googleFirstName = $userInfoArray['given_name'];
$googleLastName = $userInfoArray['family_name'];
person eason    schedule 14.11.2011
comment
как я могу использовать их ответ? - person Tahir Yasin; 04.02.2013
comment
Как я могу получить адрес электронной почты вместе с другой упомянутой вами информацией? - person Dilantha; 20.08.2013
comment
Пожалуйста, обновите код, чтобы он имел правильный формат для доступа к $userInfoArray свойствам. Получение адреса электронной почты из $userInfoArray должно быть похоже на $userInfoArray['email']. ОБРАТИТЕ ВНИМАНИЕ НА ОДИН ПРЕДЛОЖЕНИЕ ДЛЯ ДОСТУПА К ОБЪЕКТАМ. - person Shantha Kumara; 26.03.2014
comment
@Shantha Kumara, ты мог бы отредактировать это сам, но не волнуйся, я сделал это сейчас. Насколько нам известно, они могли пропустить код define(email, 'email');) - person verbumSapienti; 23.04.2014
comment
я хочу получить номер телефона и возраст / день рождения - person Prasad; 06.01.2015
comment
Я застрял на этом несколько часов, и, как ни странно, ваш ответ был единственным, который показал пример того, как этого добиться. Благодаря тонну ! - person varunkr; 13.09.2016

Эта область https://www.googleapis.com/auth/userinfo.profile устарела. См. https://developers.google.com/+/api/auth-migration#timetable.

Новая область действия, которую вы будете использовать для получения информации профиля: profile или https://www.googleapis.com/auth/plus.login

а конечная точка - https://www.googleapis.com/plus/v1/people/ {userId } - userId может быть просто «я» для текущего пользователя.

person user872858    schedule 17.03.2014
comment
Это важная информация для обеспечения интеграции в будущем. дополнительная информация об устаревших областях developers.google.com/+/web/api/rest / oauth - person Pandurang Patil; 10.12.2016
comment
и все же ... If you are directly requesting the “plus.me” scope, any other Google+ OAuth scopes, or making any Google+ API calls, please ensure that you remove these requests from your project before March 7, 2019. - Google - person maininformer; 13.02.2019

Я использую PHP и решил это с помощью версии 1.1.4 google-api-php- клиент

Предположим, что следующий код используется для перенаправления пользователя на страницу аутентификации Google:

 $client = new Google_Client();
 $client->setAuthConfigFile('/path/to/config/file/here');
 $client->setRedirectUri('https://redirect/url/here');
 $client->setAccessType('offline'); //optional
 $client->setScopes(['profile']); //or email
 $auth_url = $client->createAuthUrl();
 header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
 exit();

Предполагая, что в redirect_url возвращается действительный код аутентификации, следующее сгенерирует токен из кода аутентификации, а также предоставит базовую информацию о профиле:

 //assuming a successful authentication code is return
 $authentication_code = 'code-returned-by-google';
 $client = new Google_Client();
 //.... configure $client object code goes here
 $client->authenticate($authentication_code);
 $token_data = $client->getAccessToken();

 //get user email address
 $google_oauth =new Google_Service_Oauth2($client);
 $google_account_email = $google_oauth->userinfo->get()->email;
 //$google_oauth->userinfo->get()->familyName;
 //$google_oauth->userinfo->get()->givenName;
 //$google_oauth->userinfo->get()->name;
 //$google_oauth->userinfo->get()->gender;
 //$google_oauth->userinfo->get()->picture; //profile picture

Однако местонахождение не возвращается. В новых аккаунтах YouTube нет конкретных имен пользователей YouTube

person singh1469    schedule 10.06.2015
comment
как получить местоположение? - person SoftSan; 18.09.2017
comment
Я не могу получить информацию о поле (я сохранил информацию о поле в открытом доступе) с помощью этого прицела. Я пробовал для этого oauth игровую площадку developers.google.com/oauthplayground. Я хочу сделать это с помощью REST API на стороне сервера. вы можете мне помочь в этом? - person Vishant dhandha; 29.09.2017
comment
Не могу определить и пол. А в некоторых аккаунтах ничего, кроме электронной почты, не возвращается. Идеи? - person Reign.85; 15.01.2018

Я использую Google API для .Net, но, без сомнения, вы можете найти такой же способ получить эту информацию, используя другую версию API. Как упоминалось в user872858, область действия userinfo.profile устарела (статья Google).

Для получения информации профиля пользователя я использую следующий код (переписанная часть из примера Google):

IAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(
                                  new GoogleAuthorizationCodeFlow.Initializer
                                      {
                                            ClientSecrets = Secrets,
                                            Scopes = new[] { PlusService.Scope.PlusLogin,"https://www.googleapis.com/auth/plus.profile.emails.read"  }
                                       });    
TokenResponse _token = flow.ExchangeCodeForTokenAsync("", code, "postmessage", 
                              CancellationToken.None).Result;

                    // Create an authorization state from the returned token.
                    context.Session["authState"] = _token;

                    // Get tokeninfo for the access token if you want to verify.
                    Oauth2Service service = new Oauth2Service(
                     new Google.Apis.Services.BaseClientService.Initializer());
                    Oauth2Service.TokeninfoRequest request = service.Tokeninfo();
                    request.AccessToken = _token.AccessToken;
                    Tokeninfo info = request.Execute();
                    if (info.VerifiedEmail.HasValue && info.VerifiedEmail.Value)
                    {
                        flow = new GoogleAuthorizationCodeFlow(
                                    new GoogleAuthorizationCodeFlow.Initializer
                                         {
                                             ClientSecrets = Secrets,
                                             Scopes = new[] { PlusService.Scope.PlusLogin }
                                          });

                        UserCredential credential = new UserCredential(flow, 
                                                              "me", _token);
                        _token = credential.Token;
                        _ps = new PlusService(
                              new Google.Apis.Services.BaseClientService.Initializer()
                               {
                                   ApplicationName = "Your app name",
                                   HttpClientInitializer = credential
                               });
                        Person userProfile = _ps.People.Get("me").Execute();
                    }

Затем вы можете получить доступ практически ко всему, используя userProfile.

ОБНОВЛЕНИЕ: чтобы заставить этот код работать, вы должны использовать соответствующие области на кнопке входа в Google. Например моя кнопка:

     <button class="g-signin"
             data-scope="https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/plus.profile.emails.read"
             data-clientid="646361778467-nb2uipj05c4adlk0vo66k96bv8inqles.apps.googleusercontent.com"
             data-accesstype="offline"
             data-redirecturi="postmessage"
             data-theme="dark"
             data-callback="onSignInCallback"
             data-cookiepolicy="single_host_origin"
             data-width="iconOnly">
     </button>
person LaoR    schedule 01.07.2014

Необходимо выполнить 3 шага.

  1. Зарегистрируйте идентификатор клиента вашего приложения из консоли Google API.
  2. Попросите конечного пользователя дать согласие, используя этот api https://developers.google.com/identity/protocols/OpenIDConnect#sendauthrequest
  3. Используйте API Google oauth2, как описано на странице https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get с использованием токена, полученного на шаге 2. (Хотя я все еще не мог найти, как правильно заполнить параметр «поля»).

Очень интересно, что это простейшее использование нигде четко не описано. И я считаю опасность, вам следует обратить внимание на параметр verified_email в ответе. Потому что если я не ошибаюсь, для регистрации вашего приложения могут появиться поддельные электронные письма. (Это всего лишь моя интерпретация, есть шанс, что я ошибаюсь!)

Я считаю, что механизм OAuth в facebook очень четко описан.

person Mehmet Kaplan    schedule 06.04.2019

Если вы хотите получить только идентификатор пользователя, имя и изображение Google для посетителя вашего веб-приложения - вот мое чисто сервисное решение PHP на 2020 год без использования внешних библиотек -

Если вы читали руководство Google по Использование OAuth 2.0 для приложений веб-сервера (и будьте осторожны, Google любит менять ссылки на свою документацию), тогда вам нужно выполнить всего 2 шага:

  1. Представьте посетителю веб-страницу с просьбой дать согласие на использование ее имени в вашем веб-приложении.
  2. Затем возьмите код, переданный указанной выше веб-страницей, в свое веб-приложение и получите токен (фактически 2) из ​​Google.

Один из возвращенных токенов называется id_token и содержит идентификатор пользователя, имя и фотографию посетителя.

Вот PHP-код моей веб-игры. Первоначально я использовал Javascript SDK, но затем я заметил, что в мою веб-игру могут передаваться поддельные пользовательские данные при использовании только клиентского SDK (особенно идентификатора пользователя, который важен для моей игры), поэтому я переключился на использование PHP на стороне сервера:

<?php

const APP_ID       = '1234567890-abcdefghijklmnop.apps.googleusercontent.com';
const APP_SECRET   = 'abcdefghijklmnopq';

const REDIRECT_URI = 'https://the/url/of/this/PHP/script/';
const LOCATION     = 'Location: https://accounts.google.com/o/oauth2/v2/auth?';
const TOKEN_URL    = 'https://oauth2.googleapis.com/token';
const ERROR        = 'error';
const CODE         = 'code';
const STATE        = 'state';
const ID_TOKEN     = 'id_token';

# use a "random" string based on the current date as protection against CSRF
$CSRF_PROTECTION   = md5(date('m.d.y'));

if (isset($_REQUEST[ERROR]) && $_REQUEST[ERROR]) {
    exit($_REQUEST[ERROR]);
}

if (isset($_REQUEST[CODE]) && $_REQUEST[CODE] && $CSRF_PROTECTION == $_REQUEST[STATE]) {
    $tokenRequest = [
        'code'          => $_REQUEST[CODE],
        'client_id'     => APP_ID,
        'client_secret' => APP_SECRET,
        'redirect_uri'  => REDIRECT_URI,
        'grant_type'    => 'authorization_code',
    ];

    $postContext = stream_context_create([
        'http' => [
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($tokenRequest)
        ]
    ]);

    # Step #2: send POST request to token URL and decode the returned JWT id_token
    $tokenResult = json_decode(file_get_contents(TOKEN_URL, false, $postContext), true);
    error_log(print_r($tokenResult, true));
    $id_token    = $tokenResult[ID_TOKEN];
    # Beware - the following code does not verify the JWT signature! 
    $userResult  = json_decode(base64_decode(str_replace('_', '/', str_replace('-', '+', explode('.', $id_token)[1]))), true);

    $user_id     = $userResult['sub'];
    $given_name  = $userResult['given_name'];
    $family_name = $userResult['family_name'];
    $photo       = $userResult['picture'];

    if ($user_id != NULL && $given_name != NULL) {
        # print your web app or game here, based on $user_id etc.
        exit();
    }
}

$userConsent = [
    'client_id'     => APP_ID,
    'redirect_uri'  => REDIRECT_URI,
    'response_type' => 'code',
    'scope'         => 'profile',
    'state'         => $CSRF_PROTECTION,
];

# Step #1: redirect user to a the Google page asking for user consent
header(LOCATION . http_build_query($userConsent));

?>

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

Также, если вы хотите получить больше личных данных посетителя, вам понадобится третий шаг:

const USER_INFO    = 'https://www.googleapis.com/oauth2/v3/userinfo?access_token=';
const ACCESS_TOKEN = 'access_token'; 

# Step #3: send GET request to user info URL
$access_token = $tokenResult[ACCESS_TOKEN];
$userResult = json_decode(file_get_contents(USER_INFO . $access_token), true);

Или вы можете получить больше разрешений от имени пользователя - см. Длинный список на странице OAuth 2.0. Области применения API Google док.

Наконец, константы APP_ID и APP_SECRET, используемые в моем коде - вы получаете их из консоли Google API:

скриншот

person Alexander Farber    schedule 04.07.2020

Если вы работаете в клиентской веб-среде, новый API JavaScript auth2 содержит столь необходимую функцию getBasicProfile(), которая возвращает имя пользователя, адрес электронной почты и URL-адрес изображения.

https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile

person alalonde    schedule 02.11.2015
comment
Но каков фактический URL-адрес API? Я просмотрел документацию, я не могу найти фактический URL-адрес API. Google, кажется, подталкивает нас к их SDK, но не все хотят использовать SDK. - person Supertecnoboff; 19.07.2017

Это так плохо документ от Google. Я хотел бы сослаться на этот https://developers.google.com/oauthplayground для получения обновленных конечных точек.

Начиная с 2021 правильной конечной точкой для userinfo является

https://www.googleapis.com/oauth2/v2/userinfo

Итак, как только вы получите access_token, вы сможете делать

curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo" \
   -H "Authorization: Bearer <access_token>"

Примечание. Чтобы получить всю информацию, вам потребуется scope из openid email profile

{
 'sub': '<unique_id>',
 'name': '<full>',
 'given_name': '<first>',
 'family_name': '<last>',
 'picture': '<pic>',
 'email': '<email>',
 'email_verified': True,
 'locale': 'en'
}
person Glen Thompson    schedule 10.06.2021