Google API aracılığıyla kullanıcı bilgilerini alın


103

Google API ile kullanıcının profilinden bilgi almak mümkün müdür? Mümkünse hangi API'yi kullanmalıyım?

Bu tür bilgilerle ilgileniyorum:

Ayrıca kullanıcının profilinden başka bilgiler almak da harika olurdu.

Yanıtlar:


122

Bunu kapsama ekleyin - https://www.googleapis.com/auth/userinfo.profile

Yetkilendirme yapıldıktan sonra, bilgileri şu adresten alın - https://www.googleapis.com/oauth2/v1/userinfo?alt=json

Ad, genel profil url'si, cinsiyet, fotoğraf vb.


1
Yukarıdaki URL'leri kullandım ancak kullanıcının profilini alamadım. Yalnızca '{' alınıyor. Plz bazı kodları veya bağlantıları gönderebilir. Şimdiden teşekkürler.
Panache

9
Sağladığınız url mükemmel çalışıyor, yani googleapis.com/oauth2/v1/userinfo . Ama bu url'yi nereden aldığınızı söyleyebilir misiniz? Aramayı denedim ama hiçbir yerde bulamadım. Google bu url'leri bir yerde belgeliyor mu?
Akshar Raaj

1
Belirli bir kapsam için döndürülen verilerin özelliklerini nerede görebilirim?
Matko

3
"Userinfo.profile" kapsamı kullanımdan kaldırılmış gibi görünüyor, bunun yerine "profil" ve "e-posta" kullanmalısınız. developer.google.com/+/web/api/rest/oauth#authorization-scopes
Martin B.

3
Kullanıcı sizi bu kapsama erişmeniz için yetkilendirdikten sonra aldığınız erişim jetonunu kullanarak bu url'yi sorgulayabilirsiniz. Örnek:curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" -H"Authorization: Bearer accessTokenHere"
Pratik Singhal

90

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

return youraccess_token = access_token

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

json alacaksın:

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

Tahir Yasin'e:

Bu bir php örneğidir.
UserInfo dizisini almak için json_decode işlevini kullanabilirsiniz.

$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
yanıtlarını nasıl kullanabilirim?
Tahir Yasin

Bahsettiğiniz diğer bilgilerle birlikte e-posta adresini nasıl alabilirim?
Dilantha

$userInfoArrayÖzelliklere erişmek için doğru biçime sahip olmak için lütfen kodu güncelleyin . Gibi olmalıdır $userInfoArray['email']e-posta adresini almak için $userInfoArray. İŞLEMLERE ERİŞİM İÇİN TEK TEKLİFİNE NOT
Shantha Kumara

@Shantha Kumara bunu kendiniz düzenleyebilirdiniz, ama şimdi yaptığım için endişelenmeyin. Hepimizin bildiği gibi kodu ihmal etmiş olabilirler define(email, 'email');)
verbumSapienti

telefon numarası ve yaş / doğum günü öğrenmek istiyorum
Prasad

29

Bu kapsam https://www.googleapis.com/auth/userinfo.profile artık kullanımdan kaldırılmıştır. Lütfen https://developers.google.com/+/api/auth-migration#timetable sayfasına bakın .

Profil bilgilerini almak için kullanacağınız yeni kapsam: profil veya https://www.googleapis.com/auth/plus.login

ve uç nokta - https://www.googleapis.com/plus/v1/people/ {userId} - şu anda oturum açmış kullanıcı için userId sadece 'ben' olabilir.


Bu, entegrasyonun gelecekte kanıtlanması için önemli bir bilgi barışıdır. Kullanımdan kaldırılan kapsam developer.google.com/+/web/api/rest/oauth
Pandurang Patil

ve henüz ... 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

Bunu google-api-php-clientPHP 1.1.4 sürümünü kullanarak kullanıyorum ve çözdüm

Bir kullanıcıyı Google kimlik doğrulama sayfasına yönlendirmek için aşağıdaki kodun kullanıldığını varsayarsak:

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

Adresine geçerli bir kimlik doğrulama kodunun döndürüldüğünü varsayarsak redirect_url, aşağıdakiler kimlik doğrulama kodundan bir belirteç oluşturacak ve temel profil bilgilerini sağlayacaktır:

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

Ancak konum iade edilmez. Yeni YouTube hesaplarının YouTube'a özgü kullanıcı adları yoktur


Konum nasıl alınır?
SoftSan

Bu kapsamı kullanarak cinsiyet bilgisi alamıyorum (cinsiyet bilgisini herkese açık tuttum). Bunun için oauth oyun alanı developer.google.com/oauthplayground'u denedim. Bunu sunucu tarafında REST API kullanarak yapmak istiyorum. bana bu konuda yardım edebilir misin?
Vishant dhandha

Cinsiyet de alamıyorum. Ve bazı hesaplarda, e-posta dışında hiçbir şey iade edilmez. Fikirler?
Reign. 85

5

.Net için Google API kullanıyorum, ancak diğer API sürümünü kullanarak bu bilgileri elde etmenin aynı yolunu bulabileceğinize şüphe yok. Olarak user872858 söz kapsamı userinfo.profile (kaldırıldı makale google ).

Kullanıcı profili bilgilerini almak için aşağıdaki kodu kullanıyorum ( google örneğinden yeniden yazılmış kısım ):

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

Bundan sonra, userProfile'ı kullanarak neredeyse her şeye erişebilirsiniz.

GÜNCELLEME: Bu kodun çalışmasını sağlamak için, google oturum açma düğmesinde uygun kapsamları kullanmanız gerekir. Örneğin düğmem:

     <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

Çalıştırılması gereken 3 adım vardır.

  1. Uygulamanızın istemci kimliğini Google API konsolundan kaydedin
  2. Son kullanıcınızdan bu api https://developers.google.com/identity/protocols/OpenIDConnect#sendauthrequest kullanarak izin vermesini isteyin
  3. 2. adımda elde edilen jetonu kullanarak https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get adresinde açıklandığı gibi Google'ın oauth2 api'sini kullanın ("alanlar" parametresini nasıl düzgün dolduracağımı hala bulamadım) .

Bu en basit kullanımın hiçbir yerde açıkça tanımlanmaması çok ilginç. Ve bir tehlike olduğuna inanıyorumverified_email , cevapta gelen parametreye dikkat etmelisiniz . Çünkü yanılmıyorsam , başvurunuzu kaydetmek için sahte e-postalar gönderebilir. (Bu sadece benim yorumum, yanılıyor olabileceğim için adil bir şans var!)

Facebook'un OAuth mekaniğinin çok açık bir şekilde tanımlandığını görüyorum.


1

İstemci tarafı bir web ortamındaysanız, yeni auth2 javascript API getBasicProfile(), kullanıcının adını, e-postasını ve resim URL'sini döndüren çok ihtiyaç duyulan bir işlevi içerir .

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


Ancak gerçek API URL'si nedir? Dokümanlara baktım, gerçek API URL'sini bulamıyorum. Google bizi SDK'larına zorluyor gibi görünüyor, ancak herkes SDK'yı kullanmak istemiyor.
Supertecnoboff

0

Yalnızca web uygulamanızın bir ziyaretçisinin Google kullanıcı kimliğini, adını ve resmini getirmek istiyorsanız - işte 2020 yılı için harici kitaplık kullanılmadan saf PHP hizmet tarafı çözümüm -

Google'ın Web Sunucusu Uygulamaları için OAuth 2.0'ı Kullanma kılavuzunu okursanız (ve Google'ın kendi belgelerine giden bağlantıları değiştirmeyi sevdiğini unutmayın), yalnızca 2 adımı gerçekleştirmeniz gerekir:

  1. Ziyaretçiye, adını web uygulamanızla paylaşmak için izin isteyen bir web sayfası sunun
  2. Ardından, yukarıdaki web sayfasından geçen "kodu" web uygulamanıza alın ve Google'dan bir jeton (aslında 2) alın.

Döndürülen belirteçlerden biri "id_token" olarak adlandırılır ve ziyaretçinin kullanıcı kimliği, adı ve fotoğrafını içerir.

İşte benim yazdığım bir web oyununun PHP kodu . Başlangıçta Javascript SDK kullanıyordum, ancak daha sonra sahte kullanıcı verilerinin web oyunuma sadece istemci tarafı SDK kullanıldığında (özellikle oyunum için önemli olan kullanıcı kimliği) aktarılabileceğini fark ettim, bu yüzden kullanmaya geçtim Sunucu tarafında 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));

?>

JWT imzasını doğrulayarak ek güvenlik eklemek için bir PHP kitaplığı kullanabilirsiniz. Amaçlarım için gereksizdi çünkü Google'ın sahte ziyaretçi verileri göndererek küçük web oyunuma ihanet etmeyeceğine inanıyorum.

Ayrıca, ziyaretçinin daha fazla kişisel verilerini almak istiyorsanız, üçüncü bir adıma ihtiyacınız var:

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

Veya kullanıcı adına daha fazla izin alabilirsiniz - Google API'leri için OAuth 2.0 Kapsamları dokümanındaki uzun listeye bakın .

Son olarak, kodumda kullanılan APP_ID ve APP_SECRET sabitleri - Google API konsolundan edinebilirsiniz :

ekran görüntüsü

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.