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.

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.


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'];

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.


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


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>

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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.