通过Google API获取用户信息


Answers:


122

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

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

它包含大量内容-包括名称,公开个人资料网址,性别,照片等。


1
我使用了上面的Urls,但无法获取用户的个人资料。仅获取“ {”。请您发布一些代码或链接。提前致谢。
Panache

9
您提供的网址可以完美运行,即googleapis.com/oauth2/v1/userinfo。但是你能告诉你从哪里得到这个URL的。我尝试搜索它,但未在任何地方找到它。Google是否在某个地方记录了这些URL?
Akshar Raaj

1
在哪里可以看到针对特定范围返回的数据的规范?
Matko 2015年

3
范围“ userinfo.profile”似乎已被弃用,而应使用“ profile”和“ email”。developers.google.com/+/web/api/rest/oauth#authorization-scopes
Martin B.

3
您可以使用用户授权您访问此范围后获得的访问令牌来查询该URL。示例:curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" -H"Authorization: Bearer accessTokenHere"
Pratik Singhal '18

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

前往塔希尔·亚辛(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'];

1
如何使用他们的回应?
塔希尔·亚辛

我如何获得电子邮件地址以及您提到的其他信息?
Dilantha

请更新代码以使用正确的格式来访问$userInfoArray属性。它应该像是$userInfoArray['email']从中获取电子邮件地址$userInfoArray。注意访问ROPERTIES的单引号。
Shantha Kumara 2014年

@Shantha Kumara,您可以自己编辑它,但不要担心,因为我现在已经完成了它。就我们所知,他们本可以省略代码define(email, 'email');)
verbumSapienti 2014年

我想获取电话号码和年龄/生日
普拉萨德

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可以只是“我”。


这是实现集成未来证明的重要信息安全。有关不推荐使用的范围的更多信息,developer.google.com / +
web / api

但是...- 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

我正在使用google-api-php-clientPHP版本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帐户没有YouTube专用的用户名


如何获得位置?
SoftSan

我无法使用此范围获取性别信息(我一直公开性别信息)。我已经为此尝试过oauth Playground developers.google.com/oauthplayground。我想在服务器端使用REST API来执行此操作。你能帮我吗?
Vishant dhandha '17

也无法获得性别。在某些帐户上,除了电子邮件之外,什么也不会返回。想法?
Reign.85年

5

我使用的是.Net的Google API,但毫无疑问,您可以找到使用其他版本的API来获取此信息的相同方法。如user872858所述,范围userinfo.profile已被弃用(google article)。

为了获取用户个人资料信息,我使用以下代码(从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. 从Google API控制台注册您的应用的客户端ID
  2. 请您的最终用户使用此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的oauth2 api 。(尽管我仍然找不到如何正确填充“ fields”参数) 。

有趣的是,没有在任何地方清楚地描述这种最简单的用法。而且我认为存在危险,您应该注意verified_email响应中出现的参数。因为如果我没记错话,它可能会产生伪造的电子邮件来注册您的应用程序。(这只是我的解释,很可能我错了!)

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



0

如果您只想获取Web应用程序访问者的Google用户ID,名称和图片-这是我2020年纯PHP服务端解决方案,不使用任何外部库-

如果您阅读了Google 的《将OAuth 2.0用于Web服务器应用程序指南》(请注意,Google喜欢更改指向其自己文档的链接),那么您只需执行两个步骤:

  1. 向访问者显示一个网页,征求同意,以便与您的Web应用程序共享其姓名
  2. 然后,将上述网页传递给您的Web应用程序的“代码”从Google提取一个令牌(实际上是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签名来增加其他安全性。对我而言,这是不必要的,因为我相信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);

或者,您可以代表用户获得更多权限-请参阅Google APIOAuth 2.0范围中的长列表文档中。

最后,在我的代码中使用了APP_ID和APP_SECRET常量-您可以从Google API控制台获取它:

屏幕截图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.