รับข้อมูลผู้ใช้ผ่าน Google API


103

สามารถรับข้อมูลจากโปรไฟล์ของผู้ใช้ผ่าน Google API ได้หรือไม่? ถ้าเป็นไปได้ฉันควรใช้ API ใด

ฉันสนใจข้อมูลดังกล่าว:

นอกจากนี้ยังเป็นการดีที่จะได้รับข้อมูลอื่น ๆ จากโปรไฟล์ของผู้ใช้

คำตอบ:


122

เพิ่มสิ่งนี้ในขอบเขต - https://www.googleapis.com/auth/userinfo.profile

และหลังจากการอนุญาตเสร็จสิ้นให้รับข้อมูลจาก - https://www.googleapis.com/oauth2/v1/userinfo?alt=json

มีหลายสิ่งหลายอย่างเช่นชื่อ url โปรไฟล์สาธารณะเพศรูปภาพ ฯลฯ


1
ฉันใช้ URL ข้างต้น แต่ไม่สามารถรับโปรไฟล์ของผู้ใช้ได้ รับ "{" เท่านั้น กรุณาโพสต์รหัสหรือลิงค์บางส่วน ขอบคุณล่วงหน้า.
Panache

9
URL ที่คุณให้ทำงานได้อย่างสมบูรณ์เช่นgoogleapis.com/oauth2/v1/userinfo แต่คุณบอกได้ไหมว่าคุณได้รับ url นี้มาจากไหน ฉันพยายามค้นหามัน แต่ไม่พบที่ไหนเลย Google จัดทำเอกสาร URL เหล่านี้ไว้ที่ใดที่หนึ่งหรือไม่
Akshar Raaj

1
ฉันจะดูข้อกำหนดของข้อมูลที่ส่งคืนสำหรับขอบเขตเฉพาะได้ที่ไหน
Matko

3
ดูเหมือนว่าขอบเขต "userinfo.profile" จะเลิกใช้งานแล้วคุณควรใช้ "โปรไฟล์" และ "อีเมล" แทน 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

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
ฉันจะใช้คำตอบได้อย่างไร
Tahir Yasin

ฉันจะรับที่อยู่อีเมลพร้อมกับข้อมูลอื่น ๆ ที่คุณกล่าวถึงได้อย่างไร
ดิลันทา

โปรดอัปเดตโค้ดให้มีรูปแบบที่ถูกต้องเพื่อเข้าถึง$userInfoArrayคุณสมบัติ ควรจะ$userInfoArray['email']ได้รับที่อยู่อีเมลจากไฟล์$userInfoArray. สังเกตใบเสนอราคาเดียวเพื่อเข้าถึง RPOPERTIES
Shantha Kumara

@Shantha Kumara คุณสามารถแก้ไขได้เอง แต่ไม่ต้องกังวลเพราะฉันได้ทำไปแล้ว สำหรับทุกสิ่งที่เรารู้ว่าพวกเขาสามารถละเว้นรหัสได้define(email, 'email'))
verbumSapienti

อยากได้เบอร์โทรและอายุ / วันเกิด
ปรา

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 สามารถเป็นแค่ "ฉัน" สำหรับผู้ใช้ที่ลงชื่อเข้าใช้ในปัจจุบัน


สิ่งนี้เป็นความสงบของข้อมูลที่สำคัญในการมีการพิสูจน์บูรณาการในอนาคต ข้อมูลเพิ่มเติมเกี่ยวกับผู้พัฒนา
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และแก้ไขสิ่งนี้โดยใช้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 ใหม่ไม่มีชื่อผู้ใช้เฉพาะของ YouTube


จะรับตำแหน่งได้อย่างไร?
SoftSan

ฉันไม่สามารถรับข้อมูลเพศ (ฉันเก็บข้อมูลเพศไว้แบบสาธารณะ) โดยใช้ขอบเขตนี้ ฉันได้ลองใช้ oauth playground developers.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. ลงทะเบียนรหัสไคลเอ็นต์ของแอปจากคอนโซล Google API
  2. ขอให้ผู้ใช้ปลายทางของคุณให้คำยินยอมโดยใช้ API นี้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 (แม้ว่าจะยังไม่พบวิธีเติมพารามิเตอร์ "fields" อย่างถูกต้อง) .

เป็นเรื่องที่น่าสนใจมากที่การใช้งานที่ง่ายที่สุดนี้ไม่มีการอธิบายอย่างชัดเจนในทุกที่ และฉันเชื่อว่ามีอันตรายคุณควรใส่ใจกับverified_emailพารามิเตอร์ที่มาในการตอบสนอง เพราะถ้าฉันไม่ผิดอาจส่งอีเมลปลอมมาลงทะเบียนใบสมัครของคุณ (นี่เป็นเพียงการตีความของฉันมีโอกาสพอสมควรที่ฉันอาจจะผิด!)

ฉันพบว่ากลไก OAuth ของ Facebook อธิบายไว้อย่างชัดเจนมาก


1

หากคุณอยู่ในสภาพแวดล้อมเว็บฝั่งไคลเอ็นต์ auth2 javascript API ใหม่มีgetBasicProfile()ฟังก์ชันที่จำเป็นมากซึ่งจะส่งคืนชื่ออีเมลและ URL รูปภาพของผู้ใช้

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


แต่ URL ของ API จริงคืออะไร? ฉันดูเอกสารไม่พบ URL ของ API จริง ดูเหมือนว่า Google จะผลักดันให้เราใช้ SDK แต่ไม่ใช่ทุกคนที่ต้องการใช้ SDK
Supertecnoboff

0

หากคุณต้องการดึงเฉพาะรหัสผู้ใช้ Google ชื่อและรูปภาพสำหรับผู้เยี่ยมชมเว็บแอปของคุณนี่คือโซลูชันด้านบริการ PHP ที่แท้จริงของฉันสำหรับปี 2020 โดยไม่มีไลบรารีภายนอกใช้ -

หากคุณอ่านคู่มือการใช้ OAuth 2.0 สำหรับเว็บเซิร์ฟเวอร์แอปพลิเคชันโดย Google (และระวัง Google ชอบเปลี่ยนลิงก์ไปยังเอกสารของตัวเอง) คุณจะต้องดำเนินการเพียง 2 ขั้นตอนเท่านั้น:

  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 ขอบเขตสำหรับ Google APIs doc

สุดท้ายค่าคงที่ APP_ID และ APP_SECRET ที่ใช้ในโค้ดของฉันคุณจะได้รับจากคอนโซล Google API :

ภาพหน้าจอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.