Dapatkan info pengguna melalui Google API

103

Apakah mungkin mendapatkan informasi dari profil pengguna melalui Google API? Jika memungkinkan, API mana yang harus saya gunakan?

Saya tertarik dengan informasi seperti itu:

Juga akan sangat bagus untuk mendapatkan informasi lain dari profil pengguna.

glagola
sumber

Jawaban:

122

Tambahkan ini ke cakupan - https://www.googleapis.com/auth/userinfo.profile

Dan setelah otorisasi selesai, dapatkan informasi dari - https://www.googleapis.com/oauth2/v1/userinfo?alt=json

Ini memiliki banyak hal - termasuk nama, url profil publik, jenis kelamin, foto, dll.

Abhinav Manchanda
sumber
1
Saya menggunakan Url di atas tetapi tidak bisa mendapatkan profil pengguna. Hanya mendapatkan '{'. Tolong bisakah Anda memposting beberapa kode atau tautan. Terima kasih sebelumnya.
Panache
9
Url yang Anda berikan berfungsi dengan sempurna, yaitu googleapis.com/oauth2/v1/userinfo . Tetapi dapatkah Anda mengetahui dari mana Anda mendapatkan url ini. Saya mencoba mencarinya tetapi tidak menemukannya di mana pun. Apakah Google mendokumentasikan url ini di suatu tempat?
Akshar Raaj
1
Di mana saya dapat melihat spesifikasi data yang dikembalikan untuk cakupan tertentu?
Matko
3
Cakupan "userinfo.profile" tampaknya tidak digunakan lagi, Anda harus menggunakan "profil" dan "email". developers.google.com/+/web/api/rest/oauth#authorization-scopes
Martin B.
3
Anda bisa menanyakan url ini, menggunakan token akses yang Anda dapatkan setelah pengguna memberi otorisasi kepada Anda untuk mengakses cakupan ini. Contoh:curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" -H"Authorization: Bearer accessTokenHere"
Pratik Singhal
90

cakupan - https://www.googleapis.com/auth/userinfo.profile

return youraccess_token = access_token

dapatkan https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=youraccess_token

Anda akan mendapatkan json:

{
 "id": "xx",
 "name": "xx",
 "given_name": "xx",
 "family_name": "xx",
 "link": "xx",
 "picture": "xx",
 "gender": "xx",
 "locale": "xx"
}

Kepada Tahir Yasin:

Ini adalah contoh php.
Anda dapat menggunakan fungsi json_decode untuk mendapatkan array 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'];
alasan
sumber
1
bagaimana cara menggunakan tanggapan mereka?
Tahir Yasin
Bagaimana saya bisa mendapatkan alamat email bersama dengan informasi lain yang telah Anda sebutkan?
Dilantha
Harap perbarui kode agar memiliki format yang benar untuk mengakses $userInfoArrayproperti. Ini akan seperti $userInfoArray['email']mendapatkan alamat email dari $userInfoArray. CATATAN KUTIPAN TUNGGAL UNTUK MENGAKSES RPOPERTI.
Shantha Kumara
@Shantha Kumara Anda bisa saja mengeditnya sendiri, tapi jangan khawatir karena saya telah melakukannya sekarang. Untuk semua yang kami tahu mereka bisa menghilangkan kode define(email, 'email');)
verbumSapienti
saya ingin mendapatkan nomor telepon dan umur / ulang tahun
Prasad
29

Cakupan https://www.googleapis.com/auth/userinfo.profile ini sudah tidak digunakan lagi sekarang. Silakan lihat di https://developers.google.com/+/api/auth-migration#timetable .

Cakupan baru yang akan Anda gunakan untuk mendapatkan info profil adalah: profil atau https://www.googleapis.com/auth/plus.login

dan titik akhirnya adalah - https://www.googleapis.com/plus/v1/people/ {userId} - userId hanya bisa menjadi 'saya' untuk pengguna yang sedang login.

pengguna872858
sumber
Yang satu ini adalah perdamaian informasi yang penting untuk memiliki bukti integrasi di masa depan. informasi lebih lanjut tentang cakupan yang tidak digunakan lagi developer.google.com/+/web/api/rest/oauth
Pandurang Patil
namun ... 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

Saya menggunakan PHPdan menyelesaikan ini dengan menggunakan versi 1.1.4 dari google-api-php-client

Dengan asumsi kode berikut digunakan untuk mengarahkan pengguna ke halaman otentikasi 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();

Dengan asumsi kode otentikasi yang valid dikembalikan ke redirect_url, berikut ini akan menghasilkan token dari kode otentikasi serta memberikan informasi profil dasar:

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

Namun, lokasi tidak dikembalikan. Akun YouTube baru tidak memiliki nama pengguna khusus YouTube

singh1469
sumber
bagaimana cara mendapatkan Lokasi?
SoftSan
saya tidak bisa mendapatkan info gender (saya tetap merahasiakan info gender) menggunakan ruang lingkup ini. Saya telah mencoba oauth playground developers.google.com/oauthplayground untuk ini. saya ingin melakukan ini menggunakan REST API di sisi server. dapatkah anda membantu saya dalam hal ini?
Vishant dhandha
Tidak bisa mendapatkan jenis kelamin juga. Dan di beberapa akun, tidak ada yang dikembalikan kecuali email. Ide ide ?
Berkuasa. 85
5

Saya menggunakan Google API untuk .Net, tetapi tidak diragukan lagi Anda dapat menemukan cara yang sama untuk mendapatkan informasi ini menggunakan versi API lainnya. Seperti user872858 disebutkan, ruang lingkup userinfo.profile telah usang ( google artikel ).

Untuk mendapatkan info profil pengguna saya menggunakan kode berikut (bagian yang ditulis ulang dari contoh 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();
                    }

Kemudian, Anda dapat mengakses hampir semua hal menggunakan userProfile.

UPDATE: Agar kode ini berfungsi, Anda harus menggunakan cakupan yang sesuai pada tombol masuk google. Misalnya tombol saya:

     <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>
LaoR
sumber
2

Ada 3 langkah yang perlu dijalankan.

  1. Daftarkan id klien aplikasi Anda dari konsol Google API
  2. Minta pengguna akhir Anda untuk memberikan persetujuan menggunakan api ini https://developers.google.com/identity/protocols/OpenIDConnect#sendauthrequest
  3. Gunakan api oauth2 google seperti yang dijelaskan di https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get menggunakan token yang diperoleh di langkah 2. (Meskipun saya masih tidak dapat menemukan cara mengisi parameter "bidang" dengan benar) .

Sangat menarik bahwa penggunaan yang paling sederhana ini tidak dijelaskan dengan jelas di mana pun. Dan saya yakin ada bahaya, Anda harus memperhatikan verified_emailparameter yang datang dalam respons. Karena jika saya tidak salah mungkin akan menghasilkan email palsu untuk mendaftarkan aplikasi Anda. (Ini hanya interpretasi saya, memiliki peluang yang adil bahwa saya mungkin salah!)

Saya menemukan mekanisme OAuth facebook dijelaskan dengan sangat jelas.

Mehmet Kaplan
sumber
1

Jika Anda berada di lingkungan web sisi klien, API javascript auth2 baru berisi getBasicProfile()fungsi yang sangat dibutuhkan , yang mengembalikan nama pengguna, email, dan URL gambar.

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

alalonde.dll
sumber
Tapi apa URL API yang sebenarnya? Saya melihat dokumentasi, saya tidak dapat menemukan URL API yang sebenarnya. Google tampaknya mendorong kami ke SDK mereka, tetapi tidak semua orang ingin menggunakan SDK tersebut.
Supertecnoboff
0

Jika Anda hanya ingin mengambil ID pengguna Google, nama dan gambar untuk pengunjung aplikasi web Anda - berikut adalah solusi sisi layanan PHP murni saya untuk tahun 2020 tanpa menggunakan pustaka eksternal -

Jika Anda membaca panduan Menggunakan OAuth 2.0 untuk Aplikasi Server Web oleh Google (dan berhati-hatilah, Google suka mengubah tautan ke dokumentasinya sendiri), maka Anda hanya perlu melakukan 2 langkah:

  1. Tampilkan halaman web kepada pengunjung yang meminta izin untuk membagikan namanya dengan aplikasi web Anda
  2. Kemudian ambil "kode" yang diteruskan oleh halaman web di atas ke aplikasi web Anda dan ambil token (sebenarnya 2) dari Google.

Salah satu token yang dikembalikan disebut "id_token" dan berisi id pengguna, nama, dan foto pengunjung.

Berikut adalah kode PHP web game oleh saya. Awalnya saya menggunakan Javascript SDK, tetapi kemudian saya perhatikan bahwa data pengguna palsu dapat diteruskan ke game web saya, saat menggunakan SDK sisi klien saja (terutama ID pengguna, yang penting untuk game saya), jadi saya beralih menggunakan PHP di sisi server:

<?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));

?>

Anda dapat menggunakan pustaka PHP untuk menambahkan keamanan tambahan dengan memverifikasi tanda tangan JWT. Untuk tujuan saya itu tidak perlu, karena saya percaya bahwa Google tidak akan mengkhianati permainan web kecil saya dengan mengirimkan data pengunjung palsu.

Selain itu, jika Anda ingin mendapatkan lebih banyak data pribadi pengunjung, maka Anda memerlukan langkah ketiga:

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

Atau Anda bisa mendapatkan lebih banyak izin atas nama pengguna - lihat daftar panjangnya di dokumen Cakupan OAuth 2.0 untuk Google API .

Terakhir, konstanta APP_ID dan APP_SECRET digunakan dalam kode saya - Anda mendapatkannya dari konsol Google API :

tangkapan layar

Alexander Farber
sumber