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を使用しましたが、ユーザーのプロファイルを取得できませんでした。「{」のみを取得しています。Plzはコードやリンクを投稿できます。前もって感謝します。
Panache

9
指定したURLは完全に機能します。つまり、googleapis.com/oauth2/v1/userinfoです。しかし、どこからこのURLを取得したのかわかりますか?探してみたがどこにも見つからなかった。GoogleはこれらのURLをどこかに文書化していますか?
Akshar Raaj 2015

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

90

スコープ-https://www.googleapis.com/auth/userinfo.profile

return youraccess_token = access_token

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

タヒル・ヤシンへ:

これは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 2013

あなたが言及した他の情報と一緒にメールアドレスを取得するにはどうすればよいですか?
ディランサ2013

$userInfoArrayプロパティにアクセスするための正しい形式にコードを更新してください。$userInfoArray['email']からメールアドレスを取得するようなものである必要があります$userInfoArray。RPOPERTIESにアクセスするための単一の引用に注意してください。
Shantha Kumara 14年

@Shantha Kumara自分で編集することもできますが、私が今行ったので心配しないでください。彼らがコードを省略できた可能性があることはすべてわかっていますdefine(email, 'email');)
verbumSapienti 2014

電話番号と年齢/誕生日を知りたい
Prasad

29

このスコープhttps://www.googleapis.com/auth/userinfo.profileは非推奨になりました。ご覧くださいhttps://developers.google.com/+/api/auth-migration#timetable

プロファイル情報を取得するために使用する新しいスコープは、profileまたはhttps://www.googleapis.com/auth/plus.loginです。

エンドポイントは-https ://www.googleapis.com/plus/v1/people/ {userId}-userIdは、現在ログインしているユーザーの「私」だけにすることができます。


これは、将来の統合を証明するための重要な情報の平和です。非推奨のスコープの詳細developer.google.com/+/web/api/rest/oauth
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.
...-

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 2017

このスコープを使用して性別情報を取得できません(性別情報を公開しています)。私はこれのためにoauth playground developers.google.com/oauthplaygroundを試しました。サーバー側でREST APIを使用してこれを行います。これについて私を助けてくれませんか?
Vishant dhandha

性別も取得できません。また、一部のアカウントでは、メール以外は何も返されません。アイデア?
Reign.85 2018年

5

私はGoogle API for .Netを使用していますが、他のバージョンのAPIを使用してこの情報を取得する同じ方法を見つけられることは間違いありません。以下のようuser872858が述べたように、スコープuserinfo.profileは(廃止されました記事をグーグル)。

ユーザープロファイル情報を取得するには、次のコードを使用します(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. https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_getで説明されているように、Googleのoauth2 APIを使用します手順2で取得したトークンを使用して、使用します(ただし、「フィールド」パラメーターを正しく入力する方法はまだ見つかりませんでした)。 。

この最も単純な使用法がどこにも明確に記述されていないことは非常に興味深いです。そして私は危険があると私は信じています、あなたはverified_email応答で来るパラメータに注意を払うべきです。そのため、私は間違っていないよ場合、それはあなたのアプリケーションを登録するために偽の電子メールをもたらす可能性があります。(これは単なる私の解釈であり、私が間違っている可能性はかなりあります!)

facebookのOAuthメカニズムは非常に明確に説明されています。


1

クライアント側のWeb環境を使用している場合、新しいauth2 javascript APIには非常に必要なものが含まれています getBasicProfile()は、ユーザーの名前、メール、画像のURLを返す、関数ます。

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


しかし、実際のAPI URLは何ですか?ドキュメントを確認しましたが、実際のAPI URLが見つかりません。グーグルは私たちを彼らのSDKに押しやっているようですが、誰もがSDKを使いたいとは限りません。
Supertecnoboff

0

Webアプリの訪問者のGoogleユーザーID、名前、画像のみを取得する場合-外部ライブラリを使用せずに、2020年の純粋なPHPサービス側ソリューションを以下に示します-

Googleのウェブサーバーアプリケーション向けOAuth 2.0使用ガイドを読んでいる場合(そして、Googleが独自のドキュメントへのリンクを変更することを好むことに注意してください)、実行する必要があるのは2つのステップだけです。

  1. 訪問者に自分の名前をWebアプリと共有することに同意を求めるWebページを提示する
  2. 次に、上記のWebページから渡された「コード」をWebアプリに取り、Googleからトークン(実際には2)をフェッチします。

返されたトークンの1つは「id_token」と呼ばれ、訪問者のユーザーID、名前、写真が含まれています。

これが私が作成したWebゲームの PHPコードです。最初はJavaScript SDKを使用していましたが、クライアント側のSDKのみを使用している場合(特に、ゲームに重要なユーザーID)、偽のユーザーデータがWebゲームに渡される可能性があることに気づきました。サーバー側の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が偽の訪問者データを送信して私の小さなWebゲームを裏切ることはないと確信しているため、それは不要でした。

また、訪問者のより多くの個人データを取得したい場合は、3番目のステップが必要です。

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 APIのOAuth 2.0スコープの長いリストをご覧くださいドキュメントに。

最後に、私のコードで使用されているAPP_IDおよびAPP_SECRET定数-Google APIコンソールから取得します

スクリーンショット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.