Obtenha informações do usuário por meio da API do Google

103

É possível obter informações do perfil do usuário via API do Google? Se for possível, qual API devo usar?

Estou interessado nessas informações:

Também seria legal obter outras informações do perfil do usuário.

glagola
fonte

Respostas:

122

Adicione ao escopo - https://www.googleapis.com/auth/userinfo.profile

E depois que a autorização for concluída, obtenha as informações em - https://www.googleapis.com/oauth2/v1/userinfo?alt=json

Tem muitas coisas - incluindo nome, url de perfil público, gênero, foto etc.

Abhinav Manchanda
fonte
1
Usei os URLs acima, mas não consegui obter o perfil do usuário. Obtendo '{' apenas. Plz pode postar algum código ou links. Desde já, obrigado.
Panache
9
O url fornecido funciona perfeitamente, ou seja, googleapis.com/oauth2/v1/userinfo . Mas você sabe dizer de onde você tirou esse url. Tentei pesquisar, mas não encontrei em lugar nenhum. O Google documenta esses urls em algum lugar?
Akshar Raaj
1
Onde posso ver as especificações dos dados retornados para o escopo específico?
Matko
3
O escopo "userinfo.profile" parece estar obsoleto, em vez disso, você deve usar "profile" e "email". developers.google.com/+/web/api/rest/oauth#authorization-scopes
Martin B.
3
Você pode apenas consultar esse url, usando o token de acesso obtido após o usuário autorizar você a acessar este escopo. Exemplo:curl -X GET "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" -H"Authorization: Bearer accessTokenHere"
Pratik Singhal
90

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

return youraccess_token = access_token

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

você obterá json:

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

Para Tahir Yasin:

Este é um exemplo de php.
Você pode usar a função json_decode para obter a matriz 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'];
eason
fonte
1
como posso usar sua resposta?
Tahir Yasin
Como posso obter o endereço de e-mail junto com as outras informações que você mencionou?
Dilantha de
Por favor, atualize o código para ter o formato correto para acessar as $userInfoArraypropriedades. Deve ser como $userInfoArray['email']obter o endereço de e-mail do $userInfoArray. NOTE A COTAÇÃO ÚNICA PARA ACESSAR RPOPERDADES.
Shantha Kumara
@Shantha Kumara você mesmo poderia ter editado, mas não se preocupe, pois fiz isso agora. Pelo que sabemos, eles poderiam ter omitido o código define(email, 'email');)
verbumSapienti
quero obter o número de telefone e idade / aniversário
Prasad
29

Este escopo https://www.googleapis.com/auth/userinfo.profile foi descontinuado agora. Veja https://developers.google.com/+/api/auth-migration#timetable .

O novo escopo que você usará para obter informações de perfil é: profile ou https://www.googleapis.com/auth/plus.login

e o endpoint é - https://www.googleapis.com/plus/v1/people/ {userId} - userId pode ser apenas 'eu' para o usuário conectado no momento.

user872858
fonte
Este é um importante trecho de informações para que a integração seja preparada para o futuro. mais informações sobre escopos obsoletos developers.google.com/+/web/api/rest/oauth
Pandurang Patil
e ainda ... 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

Estou usando PHPe resolvi isso usando a versão 1.1.4 do google-api-php-client

Supondo que o código a seguir seja usado para redirecionar um usuário à página de autenticação do 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();

Presumindo que um código de autenticação válido seja retornado ao redirect_url, o seguinte irá gerar um token do código de autenticação, bem como fornecer informações básicas de perfil:

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

No entanto, o local não é retornado. Novas contas do YouTube não têm nomes de usuário específicos do YouTube

singh1469
fonte
como obter localização?
SoftSan
Não consigo obter informações de gênero (mantive informações de gênero públicas) usando este escopo. Eu tentei oauth playground developers.google.com/oauthplayground para isso. Eu quero fazer isso usando REST API no lado do servidor. você pode me ajudar nisso?
Vishant dhandha
Não é possível obter gênero também. E, em alguns casos, nada exceto e-mail é retornado. Ideias ?
Reign.85
5

Estou usando a API do Google para .Net, mas sem dúvida você pode encontrar a mesma forma de obter essas informações usando outra versão da API. Como o usuário872858 mencionou, o escopo userinfo.profile foi descontinuado ( artigo do google ).

Para obter as informações do perfil do usuário, eu uso o seguinte código (parte reescrita do exemplo do 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();
                    }

Então, você pode acessar quase tudo usando userProfile.

ATUALIZAÇÃO: para fazer este código funcionar, você deve usar os escopos apropriados no botão de login do Google. Por exemplo, meu botão:

     <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>
LaoR
fonte
2

Existem 3 etapas que precisam ser executadas.

  1. Registre o ID do cliente do seu aplicativo no console de API do Google
  2. Peça ao seu usuário final para dar consentimento usando esta api https://developers.google.com/identity/protocols/OpenIDConnect#sendauthrequest
  3. Use a API oauth2 do google conforme descrito em https://any-api.com/googleapis_com/oauth2/docs/userinfo/oauth2_userinfo_v2_me_get usando o token obtido na etapa 2. (Embora ainda não tenha conseguido descobrir como preencher o parâmetro "fields" corretamente) .

É muito interessante que esse uso mais simples não seja descrito claramente em lugar algum. E eu acredito que há um perigo, você deve prestar atenção ao verified_emailparâmetro que vem na resposta. Porque se eu não estiver errado , pode resultar em e-mails falsos para registrar seu aplicativo. (Esta é apenas minha interpretação, há uma boa chance de que eu possa estar errado!)

Acho a mecânica do OAuth do Facebook muito claramente descrita.

Mehmet Kaplan
fonte
1

Se você estiver em um ambiente da web do lado do cliente, a nova API auth2 javascript contém uma getBasicProfile()função muito necessária , que retorna o nome do usuário, e-mail e URL da imagem.

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

Alalonde
fonte
Mas qual é o URL da API real? Olhei a documentação, não consigo encontrar o URL da API real. O Google parece estar nos empurrando para seu SDK, mas nem todo mundo quer usar o SDK.
Supertecnoboff
0

Se você deseja apenas buscar a id de usuário do Google, o nome e a imagem de um visitante de seu aplicativo da web - aqui está minha solução de serviço de PHP puro para o ano de 2020, sem bibliotecas externas usadas -

Se você leu o guia Usando OAuth 2.0 para aplicativos de servidor da Web do Google (e cuidado, o Google gosta de alterar os links para sua própria documentação), então você deve executar apenas 2 etapas:

  1. Apresentar ao visitante uma página da web pedindo consentimento para compartilhar o nome dela com seu aplicativo da web
  2. Em seguida, leve o "código" passado pela página da web acima para seu aplicativo da web e busque um token (na verdade, 2) do Google.

Um dos tokens retornados é chamado de "id_token" e contém a id do usuário, nome e foto do visitante.

Aqui está o código PHP de um jogo da web meu. Inicialmente, eu estava usando o SDK Javascript, mas depois percebi que dados falsos do usuário podiam ser passados ​​para o meu jogo da web, ao usar apenas o SDK do lado do cliente (especialmente o ID do usuário, que é importante para o meu jogo), então mudei para usar PHP no lado do servidor:

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

?>

Você pode usar uma biblioteca PHP para adicionar segurança adicional, verificando a assinatura JWT. Para meus propósitos, era desnecessário, porque confio que o Google não trairá meu pequeno jogo da web enviando dados falsos de visitantes.

Além disso, se você quiser obter mais dados pessoais do visitante, precisará de uma terceira etapa:

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

Ou você pode obter mais permissões em nome do usuário - consulte a longa lista no documento Escopos OAuth 2.0 para APIs do Google .

Finalmente, as constantes APP_ID e APP_SECRET usadas em meu código - você as obtém no console da API do Google :

captura de tela

Alexander Farber
fonte