Nhận thông tin người dùng qua API Google


103

Có thể lấy thông tin từ hồ sơ của người dùng qua Google API không? Nếu có thể, tôi nên sử dụng API nào?

Tôi thú vị với những thông tin như vậy:

Ngoài ra, sẽ rất tuyệt nếu nhận được thông tin khác từ hồ sơ của người dùng.

Câu trả lời:


122

Thêm điều này vào phạm vi - https://www.googleapis.com/auth/userinfo.profile

Và sau khi ủy quyền xong, hãy lấy thông tin từ - https://www.googleapis.com/oauth2/v1/userinfo?alt=json

Nó có vô số thứ - bao gồm tên, url hồ sơ công khai, giới tính, ảnh, v.v.


1
Tôi đã sử dụng các Url ở trên nhưng không thể lấy hồ sơ của người dùng. Chỉ nhận được '{'. Làm ơn bạn có thể đăng một số mã hoặc liên kết. Cảm ơn trước.
Panache

9
Url bạn cung cấp hoạt động hoàn hảo, tức là googleapis.com/oauth2/v1/userinfo . Nhưng bạn có thể cho biết bạn lấy url này từ đâu không. Tôi đã thử tìm kiếm nó nhưng không thấy nó ở đâu cả. Google có ghi lại các url này ở một số nơi không?
Akshar Raaj

1
Tôi có thể xem đặc tả dữ liệu được trả về cho phạm vi cụ thể ở đâu?
Matko

3
Phạm vi "userinfo.profile" dường như không được dùng nữa, thay vào đó bạn nên sử dụng "hồ sơ" và "email". Develop.google.com/+/web/api/rest/oauth#authorization-scope
Martin B.

3
Bạn chỉ có thể truy vấn url này, sử dụng mã thông báo truy cập mà bạn nhận được sau khi người dùng đã cho phép bạn truy cập phạm vi này. Ví dụ:curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" -H"Authorization: Bearer accessTokenHere"
Pratik Singhal

90

phạm vi - https://www.googleapis.com/auth/userinfo.profile

return youraccess_token = access_token

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

bạn sẽ nhận được json:

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

Gửi Tahir Yasin:

Đây là một ví dụ php.
Bạn có thể sử dụng hàm json_decode để lấy mảng 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
làm thế nào để tôi có thể sử dụng phản hồi của họ?
Tahir Yasin

Làm cách nào để lấy địa chỉ email cùng với các thông tin khác mà bạn đã đề cập?
Dilantha

Vui lòng cập nhật mã để có định dạng chính xác để truy cập $userInfoArraythuộc tính. Nó sẽ giống như $userInfoArray['email']để lấy địa chỉ email từ $userInfoArray. LƯU Ý BÁO GIÁ DUY NHẤT ĐỂ TRUY CẬP RPOPERTIES.
Shantha Kumara

@Shantha Kumara, bạn có thể đã tự chỉnh sửa nó, nhưng đừng lo lắng vì tôi đã làm nó bây giờ. Đối với tất cả những gì chúng tôi biết là họ có thể đã bỏ qua mã define(email, 'email');)
verbumSapienti

tôi muốn biết số điện thoại và tuổi / ngày sinh
Prasad

29

Phạm vi này https://www.googleapis.com/auth/userinfo.profile hiện không được dùng nữa. Vui lòng xem https://developers.google.com/+/api/auth-migration#timetable .

Phạm vi mới mà bạn sẽ sử dụng để nhận thông tin hồ sơ là: hồ sơ hoặc https://www.googleapis.com/auth/plus.login

và điểm cuối là - https://www.googleapis.com/plus/v1/people/ {userId} - userId có thể chỉ là 'tôi' cho người dùng hiện đang đăng nhập.


Đây là điều quan trọng của thông tin hòa bình hướng tới có bằng chứng tích hợp trong tương lai. thêm thông tin về phạm vi NỮA developers.google.com/+/web/api/rest/oauth
Pandurang Patil

và chưa ... 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
mậnSemPy

25

Tôi đang sử dụng PHPvà giải quyết vấn đề này bằng cách sử dụng phiên bản 1.1.4 của google-api-php-client

Giả sử mã sau được sử dụng để chuyển hướng người dùng đến trang xác thực của 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();

Giả sử mã xác thực hợp lệ được trả về redirect_url , phần sau sẽ tạo mã thông báo từ mã xác thực cũng như cung cấp thông tin hồ sơ cơ bản:

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

Tuy nhiên, vị trí không được trả lại. Tài khoản YouTube mới không có tên người dùng cụ thể của YouTube


làm thế nào để có được Vị trí?
SoftSan

tôi không thể lấy thông tin giới tính (tôi đã công khai thông tin giới tính) bằng phạm vi này. tôi đã dùng thử oauth Play Develop.google.com/oauthplayground cho việc này. tôi muốn thực hiện việc này bằng API REST ở phía máy chủ. Bạn có thể giúp tôi về điều này?
Vishant dhandha

Không thể có giới tính cũng không. Và trên một số tài khoản, không có gì ngoại trừ email được trả lại. Ý tưởng?
Reign 85

5

Tôi đang sử dụng Google API cho .Net, nhưng chắc chắn bạn có thể tìm thấy cách tương tự để lấy thông tin này bằng cách sử dụng phiên bản API khác. Như user872858 đã đề cập, phạm vi userinfo.profile đã không được dùng nữa ( google bài viết ).

Để lấy thông tin hồ sơ người dùng, tôi sử dụng mã sau (phần được viết lại từ ví dụ của 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();
                    }

Hơn nữa, bạn có thể truy cập hầu hết mọi thứ bằng userProfile.

CẬP NHẬT: Để mã này hoạt động, bạn phải sử dụng phạm vi thích hợp trên nút đăng nhập google. Ví dụ nút của tôi:

     <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

Có 3 bước cần được chạy.

  1. Đăng ký id ứng dụng của ứng dụng của bạn từ bảng điều khiển API của Google
  2. Yêu cầu người dùng cuối của bạn đồng ý bằng cách sử dụng api này https://developers.google.com/identity/protocols/OpenIDConnect#sendauthrequest
  3. Sử dụng api oauth2 của google như được mô tả tại https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get bằng cách sử dụng mã thông báo có được ở bước 2. (Mặc dù tôi vẫn không thể tìm thấy cách điền thông số "fields" đúng cách) .

Điều rất thú vị là cách sử dụng đơn giản nhất này không được mô tả rõ ràng ở bất kỳ đâu. Và tôi tin rằng có một mối nguy hiểm, bạn nên chú ý đến verified_emailthông số có trong phản hồi. Bởi vì nếu tôi không sai nó có thể sẽ tạo ra những email giả mạo để đăng ký ứng dụng của bạn. (Đây chỉ là cách giải thích của tôi, rất có thể tôi đã sai!)

Tôi thấy cơ chế OAuth của facebook được mô tả rất rõ ràng.


1

Nếu bạn đang ở trong môi trường web phía máy khách, API javascript auth2 mới chứa một getBasicProfile()hàm rất cần thiết , hàm này trả về tên, email và URL hình ảnh của người dùng.

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


Nhưng URL API thực sự là gì? Tôi đã xem tài liệu, tôi không thể tìm thấy URL API thực tế. Google dường như đang đẩy chúng ta đến SDK của họ, nhưng không phải ai cũng muốn sử dụng SDK.
Supertecnoboff

0

Nếu bạn chỉ muốn tìm nạp id người dùng Google, tên và hình ảnh cho khách truy cập vào ứng dụng web của bạn - đây là giải pháp bên dịch vụ PHP thuần túy của tôi cho năm 2020 mà không sử dụng thư viện bên ngoài -

Nếu bạn đọc hướng dẫn Sử dụng OAuth 2.0 cho Ứng dụng Máy chủ Web của Google (và hãy cẩn thận, Google thích thay đổi các liên kết đến tài liệu của riêng mình), thì bạn chỉ phải thực hiện 2 bước:

  1. Đưa cho khách truy cập một trang web yêu cầu đồng ý chia sẻ tên của họ với ứng dụng web của bạn
  2. Sau đó, lấy "mã" do trang web trên chuyển đến ứng dụng web của bạn và tìm nạp mã thông báo (thực tế là 2) từ Google.

Một trong những mã thông báo được trả lại được gọi là "id_token" và chứa id người dùng, tên và ảnh của khách truy cập.

Đây là mã PHP của một trò chơi trên web của tôi. Ban đầu, tôi đang sử dụng SDK Javascript, nhưng sau đó tôi nhận thấy rằng dữ liệu người dùng giả mạo có thể được chuyển đến trò chơi trên web của tôi, khi chỉ sử dụng SDK phía máy khách (đặc biệt là id người dùng, điều quan trọng đối với trò chơi của tôi), vì vậy tôi đã chuyển sang sử dụng PHP ở phía máy chủ:

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

?>

Bạn có thể sử dụng thư viện PHP để thêm bảo mật bằng cách xác minh chữ ký JWT. Đối với mục đích của tôi, điều đó là không cần thiết, bởi vì tôi tin tưởng rằng Google sẽ không phản bội trò chơi web nhỏ của tôi bằng cách gửi dữ liệu khách truy cập giả mạo.

Ngoài ra, nếu bạn muốn lấy thêm dữ liệu cá nhân của khách truy cập, thì bạn cần bước thứ ba:

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

Hoặc bạn có thể nhận được nhiều quyền hơn thay mặt cho người dùng - xem danh sách dài tại tài liệu Phạm vi OAuth 2.0 cho Google APIs .

Cuối cùng, các hằng số APP_ID và APP_SECRET được sử dụng trong mã của tôi - bạn lấy nó từ bảng điều khiển API của Google :

ảnh chụp màn hình

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.