falbar Аутентификация через Twitter

Аутентификация через Twitter

21 января 2016 2483 2

Продолжаем тему аутентификации через социальные сети и сегодня поговорим о Twitter.

Реклама

Предыдущие статьи по этой теме:

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

Разбираемся с Twitter приложением

Начинаем мы свою работу с посещения страницы – приложения Twitter. Если вы оказались тут впервые, то на этой странице увидите только одну кнопку «Create New App» - по ней и жмём.

prilozheniya-twitter

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

iznachalnye-nastrojki-twitter-prilozheniya

Тут особо пояснять нечего, двигаемся дальше и после заполнения соглашаемся с условиями пользования, кликаем в конце страницы на кнопку «Create your Twitter application».

Разработчики Twittera избавили нас от лишних настроек (в отличие от Facebook). Мы же сразу попадаем на главную страницу приложения и единственное, что можно изменить - это иконка. Перейдем на страницу «Keys and Access Tokens» и получим нам необходимые параметры для связи с API.

keys-and-access-tokens-twitter-prilozheniya

Вот и всё, всего несколько минут и приложение можно использовать.

Пишем класс для аунтефикации через Twitter

Приступим к написанию и определимся, что у нас будет в скрипте:

  1. Нам потребуется конструктор, где мы будем сохранять передаваемые в него настройки и получать данные для формирования запросов к API;
  2. Сам метод аунтефикации при удачном выполнении, которого возвращать будем – true, а при обратном – false;
  3. Метод, при помощи которого мы сформируем ссылку для пользователя.
class TWAuth{

 public $settings    = array();
  public $auth_status = false;
    public $user_info   = array();

  private $app_data = array();

    // Остальное код пишем ниже
}

В классе TWAuth сразу добавляем необходимые нам свойства. Названия свойств говорящие. Поясню только $app_data - в нём мы будем сохранять данные, которые получим после отработки конструктора (они нужны для формирования ссылки и для запроса):

public function __construct($settings){

   if(isset($settings["client_id"], $settings["client_secret"], $settings["redirect_uri"])){

     $this->settings = $settings;

     // Формирование подписи для запроса
     $an = md5(uniqid(rand(), true));
        $at = time();

       $sign_str = "GET&".urlencode("https://api.twitter.com/oauth/request_token")."&".implode(
          "",
           array_map("urlencode", array(

             "oauth_callback=".urlencode($this->settings["redirect_uri"])."&",
              "oauth_consumer_key=".$this->settings["client_id"]."&",
                "oauth_nonce=".$an."&",
             "oauth_signature_method=HMAC-SHA1&",
              "oauth_timestamp=".$at."&",
             "oauth_version=1.0"
           ))
      );

      $as = base64_encode(hash_hmac("sha1", $sign_str, $this->settings["client_secret"]."&", true));

     // Формирование токена для запроса
      $ot_url = "https://api.twitter.com/oauth/request_token?oauth_callback=".urlencode($this->settings["redirect_uri"]).implode("&", array(

             "&oauth_consumer_key=".$this->settings["client_id"],
             "oauth_nonce=".$an,
               "oauth_signature=".urlencode($as),
                "oauth_signature_method=HMAC-SHA1",
               "oauth_timestamp=".$at,
               "oauth_version=1.0"
           )
       );

      $response = file_get_contents($ot_url);
     parse_str($response, $response);

        $this->app_data["response_at"]           = $response["oauth_token"];
     $this->app_data["response_at_secret"] = $response["oauth_token_secret"];
 }
}

Для того чтобы мы могли общаться с API Twitter, нам нужно особым образам сформировать для этого запрос. Он же состоит из подписи, которую мы также должны сформировать, после чего при помощи функции file_get_contents() обратиться, по этому адресу. В частности: в конструкторе формируем запрос для получения oauth_token и oauth_token_secret, чтобы уже их использовать для получения данных из API. Да, в твитаре заботятся о безопасности, и поэтому сделано всё довольно завёрнуто. Двигаемся дальше, и на очереди второй метод:

public function auth($oauth_token, $oauth_verifier){

    // Формирование подписи для запроса
 $an = md5(uniqid(rand(), true));
    $at = time();

   $sign_str = "GET&".urlencode("https://api.twitter.com/oauth/access_token")."&".implode(
       "",
       array_map("urlencode", array(

         "oauth_consumer_key=".$this->settings["client_id"]."&",
            "oauth_nonce=".$an."&",
         "oauth_signature_method=HMAC-SHA1&",
          "oauth_token=".$oauth_token."&",
            "oauth_timestamp=".$at."&",
         "oauth_verifier=".$oauth_verifier."&",
          "oauth_version=1.0"
       ))
  );

  $as = base64_encode(hash_hmac("sha1", $sign_str, $this->settings["client_secret"]."&".$this->app_data["response_at_secret"], true));

  // Формирование токена для запроса
  $ot_url = "https://api.twitter.com/oauth/access_token?".implode("&", array(

     "oauth_nonce=".$an,
       "oauth_signature_method=HMAC-SHA1",
       "oauth_timestamp=".$at,
       "oauth_consumer_key=".$this->settings["client_id"],
      "oauth_token=".urlencode($oauth_token),
       "oauth_verifier=".urlencode($oauth_verifier),
     "oauth_signature=".urlencode($as),
        "oauth_version=1.0"
   ));

 $response = file_get_contents($ot_url);
 parse_str($response, $response);

    if(isset($response["oauth_token"], $response["oauth_token_secret"], $response["screen_name"])){

       // Формирование подписи для запроса
     $an = md5(uniqid(rand(), true));
        $at = time();

       $oauth_token        = $response["oauth_token"];
       $oauth_token_secret = $response["oauth_token_secret"];
        $screen_name        = $response["screen_name"];

       $sign_str = "GET&".urlencode("https://api.twitter.com/1.1/users/show.json")."&".implode(
          "",
           array_map("urlencode", array(

             "oauth_consumer_key=".$this->settings["client_id"]."&",
                "oauth_nonce=".$an."&",
             "oauth_signature_method=HMAC-SHA1&",
              "oauth_timestamp=".$at."&",
             "oauth_token=".$oauth_token."&",
                "oauth_version=1.0&",
             "screen_name=".$screen_name
           ))
      );

      $as = base64_encode(hash_hmac("sha1", $sign_str, $this->settings["client_secret"]."&".$oauth_token_secret, true));

     // Формирование токена для запроса (Данные пользователя)
        $ot_url = "https://api.twitter.com/1.1/users/show.json?".implode("&", array(

            "oauth_consumer_key=".$this->settings["client_id"],
          "oauth_nonce=".$an,
           "oauth_signature=".urlencode($as),
            "oauth_signature_method=HMAC-SHA1",
           "oauth_timestamp=".$at,
           "oauth_token=".urlencode($oauth_token),
           "oauth_version=1.0",
          "screen_name=".$screen_name
       ));

     $this->user_info = json_decode(file_get_contents($ot_url), true);

        if(isset($this->user_info["id"])){

         $this->auth_status = true;

           return true;
        }
   }

   return false;
}

Метод auth() принимает два параметра, которые мы будем отлавливать в адресной строке после того, как пользователь нажмёт на ссылку для аунтефикации и вернётся к нам обратно на страницу. А весь внутренний код метода будет, как видите, повторяться прямиком до получения самих данных. Теперь допишем последний метод:

public function get_link(){

    if($this->app_data){

     return "https://api.twitter.com/oauth/authorize?oauth_token=".$this->app_data["response_at"];
    }

   return false;
}

Ура! Мы закончили со скриптом, теперь воспользуемся им и напишем простой код для получения информации о пользователе.

require_once("TWAuth.php");

$tw = new TWAuth(array(

   "client_id"   => "api_ключ",
 "client_secret"   => "api_секрет",
   "redirect_uri"    => "адрес_редиректа_после_аунтефикации"
));

if(isset($_GET["oauth_token"], $_GET["oauth_verifier"])){

    if($tw->auth($_GET["oauth_token"], $_GET["oauth_verifier"])){

        // Делаем свои дела
 }
}

Далее между тегами body выводим инфу:

if($tw->auth_status){

   echo("Социальный ID пользователя: ".$tw->user_info["id"]);
   echo("<br />");
 echo("Имя пользователя: ".$tw->user_info["name"]);
   echo("<br />");
 echo("Алис: ".$tw->user_info["screen_name"]);
    echo("<br />");
 echo("<img src='".$tw->user_info["profile_image_url"]."' alt='image' />");
}else{

 echo("<a href='".$tw->get_link()."'>Войти</a>");
}

Фух, вот мы и закончили эту статью! Готовый рабочий скрипт прилагается, скачиваем и разбираемся, пишем коменты, если что-то было непонятно.

Реклама
Иван Иваныч
23 января 2016
Спасибо за статью! У меня получилось с первого раза подключить ваш скрипт к себе на сайт и при этом не возникло трудностей. Будут ещё по этой теме статьи?
Антон Кулешов
24 января 2016
Я рад, что вам пригодился скрипт, а касательно ещё статей по авторизациям через социальные сети пока в планах нет.
no_avatar