1
votes

"Connexion avec Google" en PHP - Migration d'arrêt de l'API Google+ - comment migrer loin de plus.people.get?

J'ai reçu un e-mail d'avertissement de Google me rappelant la fin de vie de Google +, qui est censée interrompre ma "connexion avec Google" actuelle, mais je ne sais pas exactement ce que je dois changer.

 entrez la description de l'image ici

Permettez-moi de vous montrer mon code de connexion (simplifié):

google-login.php

new class {
    private $newUser = false;

    public function __construct() {
        if (!isset($_GET['state']) || $_GET['state'] != $_SESSION['state'])
            die('State mismatch.');

        $client = new Google_Client();
        $client->setApplicationName(Config::Google['app_name']);
        $client->setClientId(Config::Google['id']);
        $client->setClientSecret(Config::Google['secret']);
        $client->setRedirectUri(sprintf('https://%s/members/google-callback.php', $_SERVER['HTTP_HOST']));
        $client->setScopes(['profile', 'email']);

        $plus = new Google_Service_Plus($client);

        if (isset($_GET['code'])) {
            $client->fetchAccessTokenWithAuthCode($_GET['code']);
            $_SESSION['token'] = $client->getAccessToken();
        }

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

        if (!$client->getAccessToken() || $client->isAccessTokenExpired()) {
            $state = mt_rand();
            $client->setState($state);
            $_SESSION['state'] = $state;
            $url = $client->createAuthUrl();

            header ("location: $url");
        }

        try {
            $me = $plus->people->get('me');
        } catch (Google_Exception $e) {
            \Rollbar::report_message($e->getMessage());
            print_r($e->getMessage());

            return;
        }

        $accessToken = $client->getAccessToken()['access_token'];
        $email = $me->getEmails()[0]->getValue();
        $name = $me->getDisplayName();
        $avatar = $me->getImage()->getUrl();
        $id = $me->getId();

        if ($this->isEmailInSystem($email) === false) {
            $this->newUser = true;
            $this->addUser($email, $name, 'google', $accessToken, $id, $avatar);
        }

        header ("location: " . '/');
    }
};


0 commentaires

4 Réponses :


-1
votes

Évidemment, les lignes

$service = new Google_Service_Gmail($client);

et

$me = $plus->people->get('me');

Vous devez utiliser l'API google email, voir https://developers.google.com/gmail/api/quickstart/php , donc la première ligne sera être

$plus = new Google_Service_Plus($client);

et deuxièmement ... hmmm ... pas sûr qu'il y aura un avatar après la suppression de google plus ...


0 commentaires

3
votes

La meilleure migration consiste à passer de l'API Plus à l ' API People , qui permet d'accéder au profil de l'utilisateur d'une manière similaire (mais pas tout à fait identique).

Vous remplaceriez la création de l'objet $ plus par un nouvel objet Goolge_Service_PeopleService . Quelque chose comme

$profile = $people->people->get(
  'people/me', 
  array('personFields' => 'names,emailAddresses,photos')
);

L'obtention du profil est plus complexe puisque vous devez spécifier les champs du profil que vous souhaitez obtenir. Mais vous pouvez faire quelque chose comme

$people = new Google_Service_PeopleService( $client );

Le premier paramètre doit être "people / me" pour spécifier que vous demandez le profil de l'utilisateur autorisé.

Le second est un tableau de paramètres de requête. Vous devez spécifier les "personFields" que vous souhaitez dans la liste de ce qui est disponible (faites défiler vers le bas sur cette page jusqu'à ce que vous voyiez la description des champs disponibles) et spécifiez-le sous forme de liste séparée par des virgules dans une chaîne. Dans mon exemple ci-dessus, j'illustre l'obtention du nom, des adresses e-mail et des photos. Mais consultez la liste et testez.

Les champs exacts que vous obtenez du résultat dans $ profile seront différents de ceux que vous avez obtenus avec $ plus , mais ils doivent correspondre aux champs que vous avez demandés. Vérifiez les valeurs et leur structure exacte.


1 commentaires

Merci beaucoup pour cela. FYI J'utilise google / apiclient version ^ 2.1 et j'ai dû utiliser Google_Service_PeopleService au lieu de Google_Service_People pour certains raison (trouvé la solution à ce problème ici: stackoverflow.com/a/45517659/1325575 ).



0
votes

J'ai rencontré le même problème avec l'arrêt des API Google+ le 7 mars 2019.

Assurez-vous que L'API Google People est activée dans votre console Google J'ai utilisé la bibliothèque google-api-php-client .

Une fois que vous avez un jeton d'accès, voici le code pour obtenir l'objet personne à l'aide de API people

$accessToken = 'REPLACE_WITH_ACCESS_TOKEN';
$clientId = 'REPLACE_WITH_CLIENT_ID';
$clientSecret = 'REPLACE_WITH_CLIENT_SECRET';
$developerKey = 'REPLACE_WITH_DEVELOPER_KEY';    
    $client = new Google_Client();
    $client->setApplicationName("Application Name");
    $client->setClientId($clientId . '.apps.googleusercontent.com');
    $client->setClientSecret($clientSecret);
    $client->setDeveloperKey($developerKey);
    $client->setScopes(['https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile']);
    $client->setAccessToken($accessToken);
    $guzzleClient = new \GuzzleHttp\Client(array( 'curl' => array( CURLOPT_SSL_VERIFYPEER => false, ), ));
    $client->setHttpClient($guzzleClient);
    $people = new Google_Service_PeopleService( $client );

    if ($client->getAccessToken()) {
        try {
            $me = $people->people->get(
                'people/me',
                array('personFields' => 'emailAddresses,names,photos')
            );

            $id       = preg_replace('/[^0-9]/', '', $me->getResourceName());
            $email    = $me->getEmailAddresses()[0]->value;
            $name     = $me->getNames()[0]->displayName;
            $avtar    = $me->getPhotos()[0]->getUrl();
        } catch (Google_Exception $e) {
            // error
            echo $e->getMessage();
        }
    }

J'ai également désactivé API Google+ pour vous assurer que l'application ne l'utilise plus nulle part.


0 commentaires

0
votes

Avec la dernière version du client PHP Google API, vous pouvez récupérer les détails du profil de l'objet Google_Client lui-même.

$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
$attributes = $client->verifyIdToken($token['id_token'], GOOGLE_CLIENT_ID);
print_r($attributes);

Reportez-vous à ce article .


0 commentaires