是否可以通过Google API从用户的个人资料中获取信息?如果可能,我应该使用哪个API?
我对这些信息感兴趣:
从用户的个人资料中获取其他信息也很酷。
答案 0 :(得分:105)
将此添加到范围 - https://www.googleapis.com/auth/userinfo.profile
授权完成后,从 - https://www.googleapis.com/oauth2/v1/userinfo?alt=json
获取信息它有很多东西 - 包括姓名,公共档案网址,性别,照片等。
答案 1 :(得分:81)
范围 - 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"
}
致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'];
答案 2 :(得分:26)
此范围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'对于当前登录的用户。
答案 3 :(得分:24)
我正在使用PHP
并使用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
但是,不会返回位置。 New YouTube accounts don't have YouTube specific usernames
答案 4 :(得分:5)
我正在使用.Net的Google API,但毫无疑问,您可以找到使用其他版本的API获取此信息的相同方法。 正如 user872858 所述,范围 userinfo.profile 已被弃用(google article)。
要获取用户个人资料信息,请使用以下代码(从google's example重写部分):
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>
答案 5 :(得分:1)
如果您在客户端网络环境中,新的auth2 javascript API包含急需的getBasicProfile()
功能,该功能会返回用户的姓名,电子邮件和图片网址。
https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile
答案 6 :(得分:1)
如果您只想获取Web应用程序访问者的Google用户ID,名称和图片-这是我2020年纯PHP服务端解决方案,不使用任何外部库-
如果您阅读了Google的Using OAuth 2.0 for Web Server Applications指南(请注意,Google喜欢更改指向其自己文档的链接),那么您只需执行两个步骤:
返回的令牌之一称为“ id_token”,其中包含访问者的用户ID,名称和照片。
这是我的a web game的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签名来增加其他安全性。就我而言,这是不必要的,因为我相信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 console中获得它:
答案 7 :(得分:0)
需要执行3个步骤。
非常有趣的是,没有在任何地方清楚地描述这种最简单的用法。我相信有危险,您应该注意响应中出现的verified_email
参数。因为如果我没记错,它可能会产生假电子邮件来注册您的应用程序。 (这只是我的解释,很可能我错了!)
我发现Facebook的OAuth机制非常清晰。
答案 8 :(得分:0)
谷歌的文档太差了。我会参考这个 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'
}