Отримуйте інформацію про користувача через API Google


103

Чи можливо отримати інформацію з профілю користувача через API Google? Якщо можливо, який API я повинен використовувати?

Мені цікава така інформація:

Також було б здорово отримувати іншу інформацію з профілю користувача.

Відповіді:


122

Додайте це до області дії - https://www.googleapis.com/auth/userinfo.profile

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

У ньому є багато матеріалів - включаючи ім’я, URL-адресу загальнодоступного профілю, стать, фотографії тощо.


1
Я використовував вищезазначені URL-адреси, але не зміг отримати профіль користувача. Отримання лише "{". Plz ви можете опублікувати якийсь код або посилання. Заздалегідь спасибі.
Панаш

9
URL, який ви надали, працює бездоганно, тобто googleapis.com/oauth2/v1/userinfo . Але чи можете ви сказати, звідки ви взяли цю URL-адресу. Я спробував його пошукати, але не знайшов його ніде. Чи документує Google якісь ці URL-адреси?
Акшар Раай

1
Де я можу побачити специфікацію даних, повернутих для конкретного обсягу?
Матко

3
Область "userinfo.profile" здається застарілою, замість цього слід використовувати "профіль" та "електронну пошту". developers.google.com/+/web/api/rest/oauth#authorization-scopes
Мартін Б.

3
Ви можете просто запитувати цей URL-адрес, використовуючи маркер доступу, який ви отримаєте після того, як користувач дозволив вам отримати доступ до цієї області. Приклад:curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" -H"Authorization: Bearer accessTokenHere"
Пратік Сінгал

90

область - 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'];

1
як я можу використовувати їх відповідь?
Тахір Ясін

Як я можу отримати електронну адресу разом з іншою інформацією, яку ви згадали?
Діланта

Оновіть код, щоб мати правильний формат для доступу до $userInfoArrayвластивостей. Це має бути як $userInfoArray['email']отримати електронну адресу від $userInfoArray. Зверніть увагу на єдину пропозицію для доступу до RPOPERTIES.
Шанта Кумара

@Shantha Kumara, ти міг би це відредагувати самостійно, але не хвилюйся, як я це робив зараз. define(email, 'email')
Наскільки

я хочу отримати номер телефону та вік / день народження
Prasad

29

Цей обсяг https://www.googleapis.com/auth/userinfo.profile тепер застарілий. Перегляньте https://developers.google.com/+/api/auth-migration#timetable .

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

а кінцевою точкою є - https://www.googleapis.com/plus/v1/people/ {userId} - userId може бути просто "я" для поточно зареєстрованого користувача.


Цей важливий мир інформації для досягнення інтеграції в майбутньому. більше інформації про застарілі сфери застосування developers.google.com/+/web/api/rest/oauth
Pandurang Patil

і все ж ... 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
plumSemPy

25

Я використовую PHPта вирішую це за допомогою версії 1.1.4 google-api-php-client

Припустимо, що наступний код використовується для перенаправлення користувача на сторінку аутентифікації 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


як отримати Місцезнаходження?
SoftSan

Я не можу отримати інформацію про гендерну інформацію (я зберігав інформацію про гендерну інформацію публічною), використовуючи цю область. я спробував для цього розробник майданчика для майданчиків oauth.google.com/oauthplayground. Я хочу це зробити за допомогою REST API на стороні сервера. ви можете мені допомогти в цьому?
Vishant dhandha

Неможливо також отримати стать. І на якомусь рахунку нічого, крім електронної пошти, не повертається. Ідеї?
Царювання.85

5

Я використовую 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>

2

Існує 3 кроки, які потрібно виконати.

  1. Зареєструйте ідентифікатор клієнта програми з консолі API Google
  2. Попросіть свого кінцевого користувача дати згоду за допомогою цієї програми https://developers.google.com/identity/protocols/OpenIDConnect#sendauthrequest
  3. Використовуйте oauth2 api google, як описано на веб-сторінці https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get, використовуючи маркер, отриманий на кроці 2. (Хоча я досі не міг знайти, як правильно заповнити параметр "поля") .

Дуже цікаво, що це найпростіше використання ніде не описано чітко. І я вважаю, що існує небезпека, вам слід звернути увагу на verified_emailпараметр, що надходить у відповідь. Тому що, якщо я не помиляюся, це може видавати підроблені електронні листи, щоб зареєструвати вашу заявку. (Це лише моя інтерпретація, є великий шанс, що я можу помилитися!)

Я вважаю, що механіки OAuth у Facebook набагато чіткіше описані.


1

Якщо ви перебуваєте у веб-середовищі клієнта, новий API auth2 javascript містить дуже потрібну getBasicProfile()функцію, яка повертає ім'я користувача, електронну пошту та URL-адресу зображення.

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


Але що таке фактична URL-адреса API? Я переглянув документацію, не можу знайти фактичну URL-адресу API. Google, схоже, підштовхує нас до їх SDK, але не всі хочуть використовувати SDK.
Supertecnoboff

0

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

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

  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 API Google .

Нарешті, константи APP_ID та APP_SECRET, які використовуються в моєму коді - ви отримуєте це з консолі API Google :

скріншот

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.