Статьи

Аутентификация в социальной сети: Google+

В предыдущей части этой серии мы создали наши начальные интерфейсы, которые мы будем использовать для всех будущих частей. В этой статье мы интегрируем Google+ в наше приложение.

Вы можете просмотреть код для всех статей на этой странице Github .

Вход в Google+

Мы начнем с создания следующего каталога: src/SitePoint/SocialLogin/Google . Это будет каталог, в котором мы будем работать до конца статьи. В этом каталоге мы создаем класс GoogleLogin . Этот класс реализует интерфейс SocialLoginInterface который мы создали в предыдущей статье. Убедитесь, что свойство, называемое service , доступно для хранения нашего сервиса (см. Код ниже).

У Google есть определенные требования, чтобы мы могли войти в систему. Поэтому убедитесь, что у нас есть следующие 3 свойства, присутствующие в классе:
— ID клиента
— ключ
— URL обратного вызова

Поскольку все 3 свойства необходимы для работы нашего приложения, наш конструктор получит эти 3 переменные в качестве параметров и установит свойства.

До сих пор наш код выглядит следующим образом.

 <?php namespace SitePoint\SocialLogin\Google; use SitePoint\SocialLogin\Interfaces\SocialLoginInterface; class GoogleLogin implements SocialLoginInterface { /** * Google service * * @var string */ protected $service; /** * OAuth client ID * * @var string */ protected $clientId; /** * OAuth key * * @var string */ protected $key; /** * Callback url * * @var string */ protected $callbackUrl; /** * Constructor * * @param $clientId string * @param $key string * @param $callbackUrl string */ public function __construct($clientId, $key, $callbackUrl) { $this->clientId = $clientId; $this->key = $key; $this->callbackUrl = $callbackUrl; } /** * Initializes our service */ public function init() { } /** * Returns the login url for the social network * * @return string */ public function getLoginUrl() { } /** * Handles the login callback from the social network * * @param string $accessCode * * @return SocialUserInterface */ public function loginCallback($accessCode) { } } 

Следующим шагом является создание нашего сервиса Google+. Как вы видели в предыдущей статье, мы используем библиотеку OAuth для настройки нашего соединения с Google+. Мы будем использовать наш метод init для создания сервиса.

Прежде чем мы сможем начать, мы должны добавить некоторые операторы использования в начало нашего класса.

 use OAuth\ServiceFactory; use OAuth\OAuth2\Service\Google; use OAuth\Common\Storage\Session; use OAuth\Common\Consumer\Credentials; 

Все для нашего метода init теперь присутствует. Время установить нашу связь с Google+. Мы делаем это с помощью основных примеров библиотеки OAuth, которую мы используем.

 /** * Initializes our service */ public function init() { $storage = new Session(); $serviceFactory = new ServiceFactory(); $credentials = new Credentials($this->clientId, $this->key, $this->callbackUrl); $this->service = $serviceFactory->createService('google', $credentials, $storage, array('userinfo_email', 'userinfo_profile')); return $this; } 

Наш сервис настроен сейчас, поэтому мы можем продолжить, заполнив другие методы из интерфейса. Мы начнем с метода getLoginUrl . Этот метод возвращает URL-адрес, на который вы будете перенаправлять пользователя.

 /** * Returns the login url for the social network * * @return string */ public function getLoginUrl() { return $this->service->getAuthorizationUri(); } 

Следующий метод для определения — метод loginCallback . Когда пользователь принимает данные Google+, которыми вы делитесь с вашим приложением, он будет перенаправлен обратно на URL, который вы определили как callbackUrl . Когда пользователь запрашивает этот URL, вы должны вызвать метод loginCallback из этого класса.

Если все прошло хорошо, теперь мы можем получить данные из Google+.

 /** * Handles the login callback from the social network * * @return SocialUserInterface */ public function loginCallback() { $userData = json_decode($this->service->request('https://www.googleapis.com/oauth2/v1/userinfo'), true); $googleUser = new GoogleUser($userData); return $googleUser; } 

Вы можете заметить, что мы используем класс с именем GoogleUser здесь, и мы возвращаем класс с интерфейсом SocialUserInterface . Однако этого класса еще нет.

Пользователь Google+

Каждая социальная сеть возвращает данные пользователя по-своему. Вместо того, чтобы просто возвращать эти данные, мы собираемся нормализовать их, чтобы мы могли легко работать с ними. Нам нужно создать класс с именем GoogleUser . Этот класс будет реализовывать SocialUserInterface мы создали в предыдущей статье.

Конструктор этого класса ожидает необработанные данные Google в этом случае. В каждом получателе мы будем получать нужные данные из необработанных данных от Google. В конце ваш класс GoogleUser может выглядеть следующим образом.

 <?php namespace SitePoint\SocialLogin\Google; use SitePoint\SocialLogin\Interfaces\SocialUserInterface; class GoogleUser implements SocialUserInterface { /** * @var mixed user data */ private $userData; /** * Constructor. * * @param $userData mixed Raw social network data for this particular user */ public function __construct($userData) { $this->userData = $userData; } /** * Get the provider name * * @return string */ public function getProvider() { return "google"; } /** * Get the UID of the user * * @return string */ public function getUid() { if(array_key_exists('id', $this->userData)) { return $this->userData['id']; } return null; } /** * Get the first name of the user * * @return string */ public function getFirstname() { if(array_key_exists('given_name', $this->userData)) { return $this->userData['given_name']; } return null; } /** * Get the last name of the user * * @return string */ public function getLastname() { if(array_key_exists('family_name', $this->userData)) { return $this->userData['family_name']; } return null; } /** * Get the username * * @return string */ public function getUsername() { if(array_key_exists('family_name', $this->userData)) { return str_replace(" ", "_", $this->userData['family_name']); } return null; } /** * Get the emailaddress * * @return string */ public function getEmailAddress() { if(array_key_exists('email', $this->userData)) { return $this->userData['email']; } return null; } /** * Get the city * * @return string */ public function getCity() { return null; } /** * Get the birthdate * * @return string */ public function getBirthDate() { return null; } /** * Get the gender * * @return string */ public function getGender() { if(array_key_exists('gender', $this->userData)) { return $this->userData['gender']; } return null; } } 

Внедрение его в ваше приложение

В зависимости от используемой вами структуры (если вы используете любую из них) реализация может немного отличаться. Тем не менее, я бы порекомендовал вам следующие методы:

 public function loginForm() { //Renders a login form with a button to login with google+ (calls the LoginWithGoogle method). } 
 public function loginWithGoogle() { $googleLogin = new GoogleLogin("clientId", "key", "url/loginCallbackGoogle"); $googleUrl = $googleLogin->init()->getLoginUrl(); // Redirect user to $googleUrl. } 
 public function loginCallbackGoogle() { $googleLogin = new GoogleLogin("clientId", "key", "url/loginCallbackGoogle"); $googleUser = $googleLogin->init()->loginCallback(); // You can now either save or merge this user. // Next, you can log the user in and redirect him to any page you like } 

Рекомендация 1:

Вместо ссылки в форме входа в систему, которая перенаправляет вас на метод loginWithGoogle , вы также можете разместить URL Google в своем представлении. Однако обратите внимание, что вы уже создаете соединение с Google. Это может замедлить вашу страницу. Особенно при использовании нескольких социальных сетей. В общем, я бы порекомендовал способ выше.

Рекомендация 2:

Если вы собираетесь использовать несколько социальных $socialNetwork loginWith , вы можете легко добавить параметр с именем $socialNetwork в loginWith и метод loginCallback и добавить оператор switch внутри.

Быстрый тест

Если вы хотите выполнить быстрый тест для проверки кода, клонируйте репозиторий Github на локальный компьютер и переключитесь на ветку с именем part2 . Введите данные своего API Google+ в файле testGoogle.php и запустите файл из своего браузера. При запросе страницы вы будете перенаправлены на страницу Google с просьбой поделиться информацией.

Google requesting to share information

Когда вы нажмете «Принять», вы будете перенаправлены обратно на страницу, которую вы настроили в качестве URL обратного вызова, с указанием вашего имени и фамилии.

Вывод

В этой статье мы взяли основу, которую мы заложили в предыдущей статье, и продолжили работу над этим. Мы реализовали способ входа в Google+ и убедились, что вернули объект, который нормализует данные, которые вы получили от Google. В следующей статье мы рассмотрим, как мы можем объединять учетные записи, когда люди используют несколько входов в систему. В последующих статьях мы рассмотрим, как мы добавляем больше социальных сетей в нашу систему.