25 votes

Obtenir des informations sur l'utilisateur à partir de l'API PHP OAuth 2.0 de Google

J'essaie d'utiliser l'API Oauth de Google pour obtenir des informations sur les utilisateurs. Cela fonctionne parfaitement pour l'API Google Plus mais j'essaie de créer une sauvegarde au cas où l'utilisateur n'aurait pas de compte Google Plus. Le processus d'authentification est correct et j'obtiens même l'objet $userinfo mais comment accéder aux propriétés ? J'ai essayé $userinfo>get() mais il ne renvoie que l'identifiant de l'utilisateur.

Est-ce que je fais quelque chose de mal ? Voici le code que j'utilise...

require_once '../../src/Google_Client.php';
require_once '../../src/contrib/Google_Oauth2Service.php';

session_start();

$client = new Google_Client();
$client->setApplicationName("Google+ PHP Starter Application");
// Visit https://code.google.com/apis/console to generate your
// oauth2_client_id, oauth2_client_secret, and to register your oauth2_redirect_uri.
 $client->setClientId('*********************');
 $client->setClientSecret('**************');
 $client->setRedirectUri('***************');
 $client->setDeveloperKey('**************');
$plus = new Google_Oauth2Service($client);

if (isset($_REQUEST['logout'])) {
  unset($_SESSION['access_token']);
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();
  header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}

if (isset($_SESSION['access_token'])) {
  $client->setAccessToken($_SESSION['access_token']);
}

if ($client->getAccessToken()) 
{
    $userinfo = $plus->userinfo;
    print_r($userinfo->get());

} else 
{
    $authUrl = $client->createAuthUrl();
}
?>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <link rel='stylesheet' href='style.css' />
</head>
<body>
<header><h1>Google+ Sample App</h1></header>
<div class="box">

<?php if(isset($personMarkup)): ?>
<div class="me"><?php print $personMarkup ?></div>
<?php endif ?>

<?php
  if(isset($authUrl)) {
    print "<a class='login' href='$authUrl'>Connect Me!</a>";
  } else {
   print "<a class='logout' href='?logout'>Logout</a>";
  }
?>
</div>
</body>
</html>

Merci...

**EDIT* * * Il manquait les Scopes ajoutés

 $client->setScopes(array('https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile'));

fonctionne maintenant...

24voto

Kshitiz Shankar Points 397

Il manquait des lunettes de visée

$client->setScopes(array('https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile'));

Cela fonctionne comme un charme maintenant !

18voto

insign Points 156

Je ne sais pas si cela peut vous aider, mais depuis que le client PHP de l'API Google a été mis à jour, j'obtiens des informations sur les utilisateurs de cette manière :

        $oauth = new Google_Service_Oauth2($googleClient);

        var_dump($oauth->userinfo->get());

3voto

Alexander Farber Points 1434

El Client PHP pour l'API Google La bibliothèque a changé - voici comment récupérer les informations sur les utilisateurs :

<?php

require_once('google-api-php-client-1.1.7/src/Google/autoload.php');

const TITLE = 'My amazing app';
const REDIRECT = 'https://example.com/myapp/';

session_start();

$client = new Google_Client();
$client->setApplicationName(TITLE);
$client->setClientId('REPLACE_ME.apps.googleusercontent.com');
$client->setClientSecret('REPLACE_ME');
$client->setRedirectUri(REDIRECT);
$client->setScopes(array(Google_Service_Plus::PLUS_ME));
$plus = new Google_Service_Plus($client);

if (isset($_REQUEST['logout'])) {
        unset($_SESSION['access_token']);
}

if (isset($_GET['code'])) {
        if (strval($_SESSION['state']) !== strval($_GET['state'])) {
                error_log('The session state did not match.');
                exit(1);
        }

        $client->authenticate($_GET['code']);
        $_SESSION['access_token'] = $client->getAccessToken();
        header('Location: ' . REDIRECT);
}

if (isset($_SESSION['access_token'])) {
        $client->setAccessToken($_SESSION['access_token']);
}

if ($client->getAccessToken() && !$client->isAccessTokenExpired()) {
        try {
                $me = $plus->people->get('me');
                $body = '<PRE>' . print_r($me, TRUE) . '</PRE>';
        } catch (Google_Exception $e) {
                error_log($e);
                $body = htmlspecialchars($e->getMessage());
        }
        # the access token may have been updated lazily
        $_SESSION['access_token'] = $client->getAccessToken();
} else {
        $state = mt_rand();
        $client->setState($state);
        $_SESSION['state'] = $state;
        $body = sprintf('<P><A HREF="%s">Login</A></P>',
            $client->createAuthUrl());
}

?>

<!DOCTYPE HTML>
<HTML>
<HEAD>
        <TITLE><?= TITLE ?></TITLE>
</HEAD>
<BODY>
        <?= $body ?>
        <P><A HREF="<?= REDIRECT ?>?logout">Logout</A></P>
</BODY>
</HTML>

N'oubliez pas de -

  1. Obtenir l'identifiant et le secret du client Web à Console Google API
  2. Autoriser le https://example.com/myapp/ au même endroit

Vous trouverez des exemples officiels à l'adresse suivante Youtube GitHub .

MISE À JOUR 2017 :

Vous pouvez ajouter les champs à récupérer avec :

const FIELDS       = 'id,name,image';
$me = $plus->people->get('me', array('fields' => FIELDS));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X