Get user info via Google API

Is it possible to get information from user's profile via Google API? If it is possible, which API should I use?

I'm interesting in such information:

Also it would be cool to get other information from user's profile.

267593 次浏览

将其添加到范围 -https://www.googleapis.com/auth/userinfo.profile

授权完成后,从 -https://www.googleapis.com/oauth2/v1/userinfo?alt=json获取信息

它有很多东西-包括名字,公共资料网址,性别,照片等。

范围 -https://www.googleapis.com/auth/userinfo.profile

return youraccess_token = access_token

get 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"
}

致 Tahir Yasin:

这是一个 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#timetable

您将使用的新范围获取配置文件信息是: 配置文件或 https://www.googleapis.com/auth/plus.login

端点是-https://www.googleapis.com/plus/v1/people/{ userId }-userId 可以是当前登录用户的“ me”。

我正在使用谷歌 API。但是毫无疑问,您可以找到同样的方法来使用其他版本的 API 获取这些信息。 正如 User872858所提到的,范围 Userinfo.profile已被弃用(谷歌文章)。

为了获得用户配置文件信息,我使用以下代码(从 谷歌的例子重写的部分) :

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 访问几乎任何内容。

更新: 为了让这个代码工作,你必须使用适当的范围谷歌登录按钮。比如我的按钮:

     <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>

我正在使用 PHP,并通过使用 Google-api-php-client的1.1.4版本来解决这个问题

假设使用以下代码将用户重定向到 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 账户没有特定的用户名

如果您处于客户端 Web 环境中,新的 auth2 javascript API 包含一个非常需要的 getBasicProfile()函数,该函数返回用户的名称、电子邮件和图像 URL。

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

需要运行3个步骤。

  1. 从 GoogleAPI 控制台注册应用程序的客户端 ID
  2. Ask your end user to give consent using this api https://developers.google.com/identity/protocols/OpenIDConnect#sendauthrequest
  3. 使用步骤2中获得的令牌,按照 https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get中的描述使用 google 的 oauth2api。(尽管我仍然找不到如何正确填写“ fields”参数)。

有趣的是,任何地方都没有清楚地描述这种最简单的用法。而且 i believe存在危险,您应该注意响应中的 verified_email参数。因为 如果我没错的话可能会产生虚假的电子邮件来注册你的申请。(这只是我的解释,有一个公平的机会,我可能是错的!)

我发现 Facebook 的 OAuth 机制描述得非常清楚。

如果你只是想获取你的 web 应用访问者的 Google 用户 ID、名称和图片-这是我的2020年纯 PHP 服务端解决方案,没有使用外部库-

如果你读了谷歌的 对 Web 服务器应用程序使用 OAuth 2.0指南(当心,谷歌喜欢改变它自己文档的链接) ,那么你只需要执行两个步骤:

  1. 给访问者一个网页,要求同意与您的网络应用程序共享她的名字
  2. 然后采取“代码”通过上述网页传递到您的网络应用程序,并获取一个令牌(实际上是2)从谷歌。

返回的令牌之一称为“ id _ token”,其中包含访问者的用户 ID、名称和照片。

这是我写的 一个网络游戏的 PHP 代码。最初我使用的是 Javascript SDK,但后来我注意到,当只使用客户端 SDK 时,假用户数据可能会传递到我的网络游戏中(特别是用户 ID,这对我的游戏很重要) ,所以我转而在服务器端使用 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 签名来增加额外的安全性。出于我的目的,这是没有必要的,因为我相信谷歌不会背叛我的小网络游戏,发送虚假的访问者数据。

此外,如果你想获得更多访问者的个人信息,那么你需要第三个步骤:

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 Google API 的作用域文档中的长列表。

最后,在我的代码中使用的 APP _ ID 和 APP _ Secret 常量——您可以从 Google API 控制台中获得:

screenshot

这是一个糟糕的文档/有一些变化。我会参考这个 https://developers.google.com/oauthplayground来获得最新的端点。

As of 2021 the correct endpoint for userinfo is

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

So once you get the access_token you can do

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

要点: 为了获得所有的信息,你需要 openid email profilescope

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

如果您使用 Oath2,那么客户端将给出 id _ token

然后您可以使用这个 URL 在服务器上验证它

https://oauth2.googleapis.com/tokeninfo?id_token=your_id_token

能像幸运符一样解决问题