«Войти через Google» в PHP - миграция при отключении API Google+ - как перейти с plus.people.get? - PullRequest
0 голосов
/ 30 января 2019

Я получил электронное письмо с предупреждением от Google, напоминающее мне о EOL от Google +, который должен сломать мой текущий "логин с Google", но я не уверен, что именно я должен изменить.

enter image description here

Позвольте мне показать вам мой (упрощенный) код для входа в систему:

google-login.php

new class {
    public function __construct() {
        $state = mt_rand();

        $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']);
        $client->setState($state);

        $_SESSION['state'] = $state;
        $url = $client->createAuthUrl(); // $url = https://accounts.google.com/o/oauth2/auth?response_type=code&access_type=online&client_id=CLIENT_ID.apps.googleusercontent.com&redirect_uri=https%3A%2F%2Fread2me.online%2Fmembers%2Fgoogle-callback.php&state=1588245f23f2a&scope=profile%20email&approval_prompt=auto

        header ("location: $url");
    }
};

google-callback.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: " . '/');
    }
};

Теперь я ознакомлюсь с современным руководством по входу в систему для PHP , но я неуверен, что изменить - есть идеи?

Спасибо

Ответы [ 4 ]

0 голосов
/ 12 апреля 2019

С последней версией Google API PHP Client вы можете получить данные профиля из самого объекта Google_Client.

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

См. Эту статью .

0 голосов
/ 30 января 2019

Лучшая миграция - перейти с Plus API на People API , который предоставляет доступ к профилю пользователя аналогичным (хотя и не совсем идентичным) способом.

Вы бызамените создание объекта $plus новым объектом Goolge_Service_PeopleService.Что-то вроде

$people = new Google_Service_PeopleService( $client );

Получение профиля более сложное, так как вам нужно указать, какие поля из профиля вы хотите получить.Но вы можете сделать это примерно так:

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

Первый параметр должен быть «people / me», чтобы указать, что вы запрашиваете профиль авторизованного пользователя.

Второй - массивпараметров запроса.Вам нужно указать нужные вам «personFields» из списка доступных (прокрутите вниз эту страницу , пока не увидите описание доступных полей) и укажите это как разделенный запятыми список встрока.В моем примере выше я иллюстрирую получение имени, адресов электронной почты и фотографий.Но ознакомьтесь со списком и поэкспериментируйте.

Точные поля, которые вы получите из результата в $profile, будут отличаться от тех, которые вы получили от $plus, но они должны совпадать с полями, которые вы запрашивали.Проверьте значения и точно, как они структурированы.

0 голосов
/ 05 марта 2019

Я столкнулся с той же проблемой, что и API Google+, закрывающиеся 7 марта 2019 года.

Убедитесь, что Google People API включен в вашей консоли Google google-api-php-client Библиотека.

Когда у вас есть токен доступа, здесь есть код для получения объекта person с помощью people API

$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();
        }
    }

Я также отключил Google + API дляУбедитесь, что приложение больше нигде не используется.

0 голосов
/ 30 января 2019

Очевидно, что строки

$plus = new Google_Service_Plus($client);

и

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

Вам необходимо использовать API электронной почты Google, см. https://developers.google.com/gmail/api/quickstart/php, поэтому первая строка будет

$service = new Google_Service_Gmail($client);

и второй ... хммм ... не уверен, что после удаления Google Plus будет БУДУТ аватар ...

...