Получить информацию о пользователе через Google API
Можно ли получить информацию из профиля пользователя через Google API? Если это возможно, какой API я должен использовать?
Мне интересна такая информация:
- URL-адрес профиля пользователя (например, https://profiles.google.com/115063121183536852887);
- Пол (пол);
- Аватар.
Также было бы здорово получить другую информацию из профиля пользователя.
10 ответов
Добавьте это в область действия - https://www.googleapis.com/auth/userinfo.profile
И после того, как авторизация завершена, получите информацию по адресу - https://www.googleapis.com/oauth2/v1/userinfo?alt=json
У этого есть множество вещей - включая имя, URL публичного профиля, пол, фотографию и т. Д.
Область действия - 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'];
Эта область https://www.googleapis.com/auth/userinfo.profile устарела. Пожалуйста, посмотрите на https://developers.google.com/+/api/auth-migration.
Новая область, которую вы будете использовать для получения информации о профиле: профиль или https://www.googleapis.com/auth/plus.login
конечная точка - https://www.googleapis.com/plus/v1/people/{userId} - userId может быть просто "я" для текущего вошедшего в систему пользователя.
Это так плохо документ от 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'
}
Я использую PHP
и решил эту проблему с помощью версии 1.1.4 https://github.com/google/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
Я использую 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>
Есть 3 шага, которые необходимо выполнить.
- Зарегистрируйте идентификатор клиента вашего приложения в консоли API Google
- Попросите вашего конечного пользователя дать согласие с помощью этого API https://developers.google.com/identity/protocols/OpenIDConnect.
- Используйте API Google oauth2, как описано на https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get используя токен, полученный на шаге 2. (Хотя я все еще не мог найти, как правильно заполнить параметр "поля"),
Очень интересно, что это простейшее использование нигде четко не описано. И я считаю, что есть опасность, вы должны обратить внимание на verified_email
параметр приходит в ответ. Потому что, если я не ошибаюсь, это может привести к поддельным электронным письмам при регистрации вашего приложения. (Это всего лишь мое толкование, есть вероятность, что я могу ошибаться!)
Я считаю, что механика OAuth в Facebook очень четко описана.
Если вы хотите получить только идентификатор пользователя, имя и изображение Google для посетителя вашего веб-приложения - вот мое чисто сервисное решение PHP на 2020 год без использования внешних библиотек -
Если вы прочитали руководство Google по использованию OAuth 2.0 для приложений веб-сервера (и будьте осторожны, Google любит изменять ссылки на свою документацию), то вам нужно выполнить всего 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 Scopes for Google APIs.
Наконец, константы APP_ID и APP_SECRET, используемые в моем коде - вы получаете их из консоли Google API:
если вы используете Oath2, то клиент выдаст id_token
затем вы можете проверить его на сервере с этим URL-адресом
https://oauth2.googleapis.com/tokeninfo?id_token=your_id_token
решит проблему, как талисман
Если вы находитесь в веб-среде на стороне клиента, новый API-интерфейс auth2 содержит столь необходимый getBasicProfile()
функция, которая возвращает имя пользователя, адрес электронной почты и URL изображения.
https://developers.google.com/identity/sign-in/web/reference