Google APIを介してユーザーのプロファイルから情報を取得することは可能ですか?可能であれば、どのAPIを使用すればよいですか?
私はそのような情報に興味があります:
- ユーザープロファイルのURL(例:https : //profiles.google.com/115063121183536852887)。
- 性別(セックス);
- プロフィール写真。
また、ユーザーのプロファイルから他の情報を取得すると便利です。
Google APIを介してユーザーのプロファイルから情報を取得することは可能ですか?可能であれば、どのAPIを使用すればよいですか?
私はそのような情報に興味があります:
また、ユーザーのプロファイルから他の情報を取得すると便利です。
回答:
これをスコープに追加します-https://www.googleapis.com/auth/userinfo.profile
承認が完了したら、https://www.googleapis.com/oauth2/v1/userinfo?alt = jsonから情報を取得します
名前、公開プロフィールのURL、性別、写真など、さまざまなものがあります。
curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" -H"Authorization: Bearer accessTokenHere"
スコープ-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'];
$userInfoArray
プロパティにアクセスするための正しい形式にコードを更新してください。$userInfoArray['email']
からメールアドレスを取得するようなものである必要があります$userInfoArray
。RPOPERTIESにアクセスするための単一の引用に注意してください。
define(email, 'email')
;)
このスコープ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は、現在ログインしているユーザーの「私」だけにすることができます。
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.
私は使っています 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固有のユーザー名はありません
私は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>
実行する必要がある3つのステップがあります。
この最も単純な使用法がどこにも明確に記述されていないことは非常に興味深いです。そして私は危険があると私は信じています、あなたはverified_email
応答で来るパラメータに注意を払うべきです。そのため、私は間違っていないよ場合、それはあなたのアプリケーションを登録するために偽の電子メールをもたらす可能性があります。(これは単なる私の解釈であり、私が間違っている可能性はかなりあります!)
facebookのOAuthメカニズムは非常に明確に説明されています。
クライアント側のWeb環境を使用している場合、新しいauth2 javascript APIには非常に必要なものが含まれています getBasicProfile()
は、ユーザーの名前、メール、画像のURLを返す、関数ます。
https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile
Webアプリの訪問者のGoogleユーザーID、名前、画像のみを取得する場合-外部ライブラリを使用せずに、2020年の純粋なPHPサービス側ソリューションを以下に示します-
Googleのウェブサーバーアプリケーション向けOAuth 2.0の使用ガイドを読んでいる場合(そして、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コンソールから取得します。