Статьи

Как аутентифицировать пользователей с помощью Twitter OAuth

Начиная с 16 августа, Twitter больше не будет поддерживать базовый протокол аутентификации для своей платформы. Это означает, что единственный способ аутентификации пользователей будет через приложение Twitter. В этом уроке я покажу вам, как использовать Twitter в качестве системы аутентификации одним нажатием, как мы это делали с Facebook .


Сначала нам нужно будет установить новое приложение Twitter.

  • Зарегистрируйте новое приложение на dev.twitter.com/apps/
  • Заполните поля для своего сайта соответствующим образом, просто убедитесь, что в браузере « Тип приложения» выберите « Браузер» и задайте для URL обратного вызова что-то вроде http://localhost.com/twitter_login.php ( http://localhost/ не будет принято потому что у него нет доменного имени).
  • Наконец, выберите « Чтение и запись» . Введите капчу, нажмите «Зарегистрировать приложение» и примите Условия использования.

Теперь вы увидите экран, как показано ниже.

В ближайшее время мы будем использовать ключ Consumer и секретные значения Consumer .

Теперь, когда это сделано, давайте загрузим библиотеку. Поскольку мы будем кодировать с помощью PHP, кажется, лучшим из них является twitteroauth ; но если вы используете другой язык, вы найдете здесь и другие хорошие библиотеки .

Найдите каталог twitteroauth внутри zip-файла и распакуйте его в папку вашего приложения.

Наконец, поскольку мы используем Twitter для аутентификации пользователей, нам понадобится таблица базы данных для хранения этих пользователей. Вот быстрый пример того, что мы будем делать.

1
2
3
4
5
6
7
8
9
CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `oauth_provider` varchar(10),
    `oauth_uid` text,
    `oauth_token` text,
    `oauth_secret` text,
    `username` text,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Обратите внимание на oauth_token и oauth_secret . Для проверки подлинности пользователей для OAuth в Twitter требуются значения token и token_secret , поэтому мы token_secret их. С этим мы закончили с настройкой!


На этом этапе мы будем делать три вещи:

  • Запрос авторизации из твиттера.
  • Регистрация или, если пользователь уже зарегистрирован, войти в систему.
  • Установка данных в сеанс.

Рабочий процесс OAuth начинается с создания URL-адреса для запроса; пользователь перенаправляется на этот URL и запрашивается авторизация. После предоставления, приложение перенаправляет обратно на наш сервер с двумя токенами в параметрах URL, которые необходимы для аутентификации.

Давайте начнем с включения библиотеки и запуска обработчика сеанса.

1
2
require(«twitteroauth/twitteroauth.php»);
session_start();

После этого давайте создадим новый экземпляр TwitterOAuth, предоставив ему ключ потребителя и секрет потребителя, которые Twitter предоставил нам при создании приложения. Затем мы запросим токены аутентификации, сохраним их в сеансе и перенаправим пользователя в Twitter для авторизации.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
// The TwitterOAuth instance
$twitteroauth = new TwitterOAuth(‘YOUR_CONSUMER_KEY’, ‘YOUR_CONSUMER_SECRET’);
// Requesting authentication tokens, the parameter is the URL we will be redirected to
$request_token = $twitteroauth->getRequestToken(‘http://localhost.com/twitter_oauth.php’);
 
// Saving them into the session
$_SESSION[‘oauth_token’] = $request_token[‘oauth_token’];
$_SESSION[‘oauth_token_secret’] = $request_token[‘oauth_token_secret’];
 
// If everything goes well..
if($twitteroauth->http_code==200){
    // Let’s generate the URL and redirect
    $url = $twitteroauth->getAuthorizeURL($request_token[‘oauth_token’]);
    header(‘Location: ‘. $url);
} else {
    // It’s a bad idea to kill the script, but we’ve got to know when there’s an error.
    die(‘Something wrong happened.’);
}

Сохраните его как twitter_login.php , перейдите по twitter_login.php http://localhost.com/twitter_login.php или как там есть имя вашего локального хоста. Если все прошло правильно, вы должны быть перенаправлены на twitter.com, и вы должны увидеть что-то вроде этого.

Нажмите Разрешить, и вы будете перенаправлены на http://localhost.com/twitter_oauth.php — так как мы установили этот URL-адрес в качестве параметра в getRequestToken . Мы не создали этот файл, поэтому он должен выдать ошибку. Создайте этот файл, затем включите библиотеку и начните сеанс, как мы это делали в первом файле.

После этого нам понадобятся три вещи:

  • Проверка подлинности в данных запроса URL
  • Ток авторизации из сессии
  • Аут секрет от сессии

Итак, первое, что нужно сделать в этом скрипте, это проверить эти данные и перенаправить, если одна из этих переменных пуста.

1
2
3
4
5
6
if(!empty($_GET[‘oauth_verifier’]) && !empty($_SESSION[‘oauth_token’]) && !empty($_SESSION[‘oauth_token_secret’])){
    // We’ve got everything we need
} else {
    // Something’s missing, go back to square 1
    header(‘Location: twitter_login.php’);
}

Теперь, если все установлено, внутри условия мы будем создавать экземпляр TwitterOAuth, но с токенами, которые мы только что получили в качестве третьего и четвертого параметров; после этого мы получим токен доступа, который является массивом. Этот токен мы будем сохранять в базе данных. Наконец, мы сделаем быстрый тест, чтобы увидеть, все ли работает.

01
02
03
04
05
06
07
08
09
10
// TwitterOAuth instance, with two new parameters we got in twitter_login.php
$twitteroauth = new TwitterOAuth(‘YOUR_CONSUMER_KEY’, ‘YOUR_CONSUMER_SECRET’, $_SESSION[‘oauth_token’], $_SESSION[‘oauth_token_secret’]);
// Let’s request the access token
$access_token = $twitteroauth->getAccessToken($_GET[‘oauth_verifier’]);
// Save it in a session var
$_SESSION[‘access_token’] = $access_token;
// Let’s get the user’s info
$user_info = $twitteroauth->get(‘account/verify_credentials’);
// Print user’s info
print_r($user_info);

Если ничего не происходит, print_r должен показать данные пользователя. Вы можете получить идентификатор пользователя с помощью $user_info->id , его или ее имя пользователя с помощью $user_info->screen_name ; там также есть куча другой информации.

Очень важно понимать, что oauth_verifier не использовался до этого. Если вы видите информацию о пользователе правильно, а затем перезагружаете страницу, скрипт выдаст ошибку, так как эта переменная была использована. Просто вернитесь в twitter_login.php и он автоматически сгенерирует еще один свежий токен.

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

1
2
mysql_connect(‘localhost’, ‘YOUR_USERNAME’, ‘YOUR_PASSWORD’);
mysql_select_db(‘YOUR_DATABASE’);

Измените информацию базы данных по мере необходимости. Теперь, чуть ниже, где мы получаем информацию о пользователе, нам нужно проверить его в нашей базе данных. Если его или ее там нет, мы введем информацию. Если пользователь был зарегистрирован, мы должны обновить токены, потому что Twitter сгенерировал новые, а те, что у нас в базе данных, теперь не могут использоваться. Наконец, мы устанавливаем информацию о пользователе в сессионные переменные и перенаправляем в twitter_update.php .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if(isset($user_info->error)){
    // Something’s wrong, go back to square 1
    header(‘Location: twitter_login.php’);
} else {
    // Let’s find the user by its ID
    $query = mysql_query(«SELECT * FROM users WHERE oauth_provider = ‘twitter’ AND oauth_uid = «. $user_info->id);
    $result = mysql_fetch_array($query);
 
    // If not, let’s add it to the database
    if(empty($result)){
        $query = mysql_query(«INSERT INTO users (oauth_provider, oauth_uid, username, oauth_token, oauth_secret) VALUES (‘twitter’, {$user_info->id}, ‘{$user_info->screen_name}’, ‘{$access_token[‘oauth_token’]}’, ‘{$access_token[‘oauth_token_secret’]}’)»);
        $query = mysql_query(«SELECT * FROM users WHERE id = » . mysql_insert_id());
        $result = mysql_fetch_array($query);
    } else {
        // Update the tokens
        $query = mysql_query(«UPDATE users SET oauth_token = ‘{$access_token[‘oauth_token’]}’, oauth_secret = ‘{$access_token[‘oauth_token_secret’]}’ WHERE oauth_provider = ‘twitter’ AND oauth_uid = {$user_info->id}»);
    }
 
    $_SESSION[‘id’] = $result[‘id’];
    $_SESSION[‘username’] = $result[‘username’];
    $_SESSION[‘oauth_uid’] = $result[‘oauth_uid’];
    $_SESSION[‘oauth_provider’] = $result[‘oauth_provider’];
    $_SESSION[‘oauth_token’] = $result[‘oauth_token’];
    $_SESSION[‘oauth_secret’] = $result[‘oauth_secret’];
 
    header(‘Location: twitter_update.php’);
}

Обратите внимание, что эти запросы не проверены; если вы оставите их как есть, вы оставите свою базу данных уязвимой. Наконец, ниже соединения с базой данных, мы должны установить проверку, чтобы убедиться, что пользователь вошел в систему.

1
2
3
4
if(!empty($_SESSION[‘username’])){
    // User is logged in, redirect
    header(‘Location: twitter_update.php’);
}

Теперь вы можете приветствовать пользователя по его или ее имени пользователя.

1
<h2>Hello <?=(!empty($_SESSION[‘username’]) ? ‘@’ . $_SESSION[‘username’] : ‘Guest’);

Давайте перейдем к веселой стороне: обновление, следование и чтение.


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

Как и два других скрипта, нам нужно создать экземпляр TwitterOAuth, включая переменные в сеансе.

1
2
3
if(!empty($_SESSION[‘username’])){
    $twitteroauth = new TwitterOAuth(‘YOUR_CONSUMER_KEY’, ‘YOUR_CONSUMER_SECRET’, $_SESSION[‘oauth_token’], $_SESSION[‘oauth_secret’]);
}

Начнем с временной шкалы пользователя. Ссылка говорит нам, что путь это statuses/home_timeline ; игнорируйте версию и формат , об этом позаботится библиотека.

1
2
$home_timeline = $twitteroauth->get(‘statuses/home_timeline’);
print_r($home_timeline);

Это даст вам график времени. Вы можете получить каждый элемент с помощью цикла foreach . Тем не менее, ссылка указывает некоторые необязательные параметры, такие как count , который ограничивает количество твитов, которые будут выбраны. Фактически, второй параметр get — это массив всех необходимых опций, поэтому, если вы хотите получить последние сорок твитов, вот код:

1
$home_timeline = $twitteroauth->get(‘statuses/home_timeline’, array(‘count’ => 40));

Кроме того, вы можете увидеть чей-то график, если он не защищен. statuses/user_timeline требует либо идентификатор пользователя, либо псевдоним. Если вы хотите проверить временную шкалу @nettuts, вам нужно использовать следующий фрагмент:

1
$nettuts_timeline = $twitteroauth->get(‘statuses/user_timeline’, array(‘screen_name’ => ‘nettuts’));

Как вы можете видеть, после аутентификации чтение временных шкал становится легким делом.


С друзьями вы можете проверить, следует ли пользователь за другим, а также подписаться или отписаться от других пользователей. Этот фрагмент будет проверять, подписаны ли вы на меня, и создаст подписку, если нет.

Но сначала, проверьте friendships/exists и friendships/create ссылку. Заметьте что-нибудь? friendships/create метод POST. К счастью, библиотека включает функцию post() , которая работает так же, как функция get() ; Основное отличие состоит в том, что get() предназначен для чтения, а post() для создания, удаления или обновления.

В любом случае, для friendships/exists требуется два параметра: user_a и user_b , а для friendships/create user_b требуется только один, либо screen_name либо user_id .

1
2
3
4
5
$follows_faelazo = $twitteroauth->get(‘friendships/exists’, array(‘user_a’ => $_SESSION[‘username’], ‘user_b’ => ‘faelazo’));
if(!$follows_faelazo){
    echo ‘You are NOT following @faelazo!’;
    $twitteroauth->post(‘friendships/create’, array(‘screen_name’ => ‘faelazo’));
}

Вы можете отписаться от пользователя, используя в основном тот же код, который создает подписку, просто замените create на destroy :

1
2
3
4
5
$follows_faelazo = $twitteroauth->get(‘friendships/exists’, array(‘user_a’ => $_SESSION[‘username’], ‘user_b’ => ‘faelazo’));
if($follows_faelazo){
    echo ‘You are following @faelazo!
    $twitteroauth->post(‘friendships/destroy’, array(‘screen_name’ => ‘faelazo’));
}

Это, пожалуй, самый интересный раздел, поскольку он является ядром Twitter: опубликовать обновление, как вы могли себе представить, довольно просто. Путь — это statuses/update , метод — POST (поскольку мы не читаем), а один обязательный аргумент — это status .

1
$twitteroauth->post(‘statuses/update’, array(‘status’ => ‘Hello Nettuts+’));

Теперь перейдите на страницу своего профиля в Twitter, и вы увидите свой твит.

Давайте ретвитим обновление @Nettuts, объявляющее конкурс HTML 5 ; идентификатор статуса — 19706871538 и ссылка говорит нам, что путь — это statuses/retweet/:id , где часть :id — это идентификатор статуса, который мы будем ретвитнуть. Метод POST и не требует дополнительных параметров.

1
$twitteroauth->post(‘statuses/retweet/19706871538’);

Чтобы удалить твит, вам нужно будет передать идентификатор статуса, который вы уничтожаете, в первом параметре, как ретвит. Если идентификатор твита 123456789, код для уничтожения будет.

1
$twitteroauth->post(‘statuses/destroy/123456789’);

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


API Twitter довольно прост для понимания; это намного более задокументировано, чем даже Facebook (хотя Facebook предлагает собственную библиотеку). К сожалению, аутентификация не так гладка, как мы могли бы надеяться, в зависимости от данных сеанса.

Стоит отметить, что после авторизации пользователя Twitter (при условии, что у приложения есть права на чтение и запись), вы можете контролировать этот аккаунт. Если вы что-то измените от имени пользователя без его разрешения, вы создадите проблемы. Используйте это с осторожностью!

Изменения API, поступающие в Twitter, будут запрещать базовую аутентификацию; Твиттер фокусируется на прекращении бесчисленных мошенников, которые обманом заставляют пользователей отказываться от своих учетных данных. OAuth — это решение; и, если вы работали над учебным пособием по Facebook Connect , теперь вы можете предоставить пользователям своего веб-сайта или приложения быстрый вход без учетных данных, используя свой выбор двух наиболее часто используемых социальных сетей. Как это круто?