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

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

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

Tahir Yasin에게 :

이것은 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

언급 한 다른 정보와 함께 이메일 주소를 얻으려면 어떻게해야합니까?
Dilantha 2013-08-20

$userInfoArray속성 에 액세스하려면 올바른 형식을 갖도록 코드를 업데이트하십시오 . $userInfoArray['email']에서 이메일 주소를 가져 오는 것과 같아야 합니다 $userInfoArray. ROPERTIES에 액세스하려면 단일 견적을 참고하십시오.
Shantha Kumara 2014 년

@Shantha Kumara 당신이 직접 편집 할 수 있었지만 지금은 내가 한 것처럼 걱정하지 마십시오. 모두를 위해 우리는 코드를 생략 할 수 있었다 알고 define(email, 'email'))
verbumSapienti

전화 번호와 나이 / 생일을 알고 싶습니다.
Prasad

29

이 범위 https://www.googleapis.com/auth/userinfo.profile 은 이제 더 이상 사용되지 않습니다. https://developers.google.com/+/api/auth-migration#timetable참조하십시오 .

프로필 정보를 가져 오는 데 사용할 새 범위는 프로필 또는 https://www.googleapis.com/auth/plus.login입니다.

및 엔드 포인트입니다 - https://www.googleapis.com/plus/v1/people/가 {userId를가} - 현재 로그인 한 사용자에 대한 userId를 그냥 '나'가 될 수 있습니다.


이것은 통합 미래 증명을위한 중요한 정보 평화입니다. 지원 중단 된 범위에 대한 자세한 정보 developers.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.Google
plumSemPy

25

내가 사용하고 PHP그리고 버전 1.1.4을 사용하여이 문제를 해결 구글-API-PHP 클라이언트

사용자를 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

이 범위를 사용하여 성별 정보를 얻을 수 없습니다 (성별 정보를 공개로 유지했습니다). 나는 이것을 위해 oauth 놀이터 developers.google.com/oauthplayground를 시도했습니다. 서버 측에서 REST API를 사용하여이 작업을 수행하고 싶습니다. 이것에 대해 나를 도울 수 있습니까?
Vishant dhandha

성별도 얻을 수 없습니다. 일부 계정에서는 이메일 외에는 아무것도 반환되지 않습니다. 아이디어?
Reign.85

5

.Net 용 Google API를 사용하고 있지만 다른 버전의 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. 2 단계에서 얻은 토큰을 사용하여 https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get에 설명 된대로 Google의 oauth2 api를 사용합니다. (여전히 "fields"매개 변수를 올바르게 채우는 방법을 찾을 수 없습니다.) .

이 가장 간단한 사용법이 어디에도 명확하게 설명되어 있지 않다는 것은 매우 흥미 롭습니다. 그리고 위험이 있다고 생각verified_email 합니다. 응답에서 오는 매개 변수에 주의를 기울여야합니다 . 내가 틀리지 않으면 신청서를 등록하기 위해 가짜 이메일을 보낼 수 있기 때문입니다. (이것은 내 해석 일 뿐이며 내가 틀릴 수있는 공정한 기회가 있습니다!)

나는 페이스 북의 OAuth 메커니즘이 훨씬 명확하게 설명되어 있음을 발견했습니다.


1

클라이언트 측 웹 환경에있는 경우 새 auth2 javascript API에는 getBasicProfile()사용자 이름, 이메일 및 이미지 URL을 반환 하는 매우 필요한 함수 가 포함되어 있습니다 .

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


그러나 실제 API URL은 무엇입니까? 설명서를 봤는데 실제 API URL을 찾을 수 없습니다. Google은 우리를 SDK로 밀어 붙이는 것 같지만 모든 사람이 SDK를 사용하기를 원하지는 않습니다.
Supertecnoboff

0

웹 앱 방문자의 Google 사용자 ID, 이름 및 사진 만 가져 오려는 경우-여기에 외부 라이브러리를 사용하지 않는 2020 년의 순수한 PHP 서비스 측 솔루션이 있습니다.

Google 에서 제공하는 웹 서버 애플리케이션 용 OAuth 2.0 사용 가이드 를 읽은 경우 (Google은 자체 문서에 대한 링크를 변경하는 것을 좋아합니다) 다음 두 단계 만 수행하면됩니다.

  1. 방문자에게 자신의 이름을 웹 앱과 공유하는 데 동의하는 웹 페이지를 제시합니다.
  2. 그런 다음 위의 웹 페이지에서 전달 된 "코드"를 웹 앱으로 가져 와서 Google에서 토큰 (실제로는 2)을 가져옵니다.

반환 된 토큰 중 하나는 "id_token"이며 방문자의 사용자 ID, 이름 및 사진을 포함합니다.

다음은 제가 작성한 웹 게임 의 PHP 코드입니다 . 처음에는 Javascript SDK를 사용했지만 클라이언트 측 SDK 만 사용할 때 (특히 게임에 중요한 사용자 ID) 가짜 사용자 데이터가 웹 게임에 전달 될 수 있다는 사실을 알게 되었기 때문에 사용으로 전환했습니다. 서버 측의 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 서명을 확인하여 추가 보안을 추가 할 수 있습니다. 내 목적 상 불필요했다. 구글이 가짜 방문자 데이터를 보내서 내 작은 웹 게임을 배신하지 않을 것이라고 믿기 때문이다.

또한 방문자의 더 많은 개인 데이터를 얻으려면 세 번째 단계가 필요합니다.

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.