Статьи

OAuth для PHP Twitter приложений, часть 1

По состоянию на 31 августа служба HTTP Basic Authenticated API была полностью отключена. Теперь любой интерфейс с API должен будет использовать метод аутентификации на основе токенов, известный как OAuth.

Что это значит? Любой, кто написал серверное приложение, которое общается с Twitter через его API, должен потратить некоторое время на его обновление. В этой статье мы сконцентрируемся на автоматических серверных приложениях, таких как приложение, которое автоматически отправляет твит, когда на сайте появляется новая сделка, твиттер спортивных результатов или другие подобные приложения. Во второй части мы рассмотрим более традиционную модель OAuth, где отдельные пользователи авторизуют ваше приложение для доступа к своим учетным записям Twitter через веб-интерфейс.

На первый взгляд, задача реализации OAuth может показаться сложной, и система обмена токенами OAuth может сбивать с толку, если вы не знакомы с ней. К счастью, есть некоторые довольно умные люди, которые сделали основу для нас, так что давайте начнем.

Ранее Twitter не требовал, чтобы вы регистрировали свое приложение. Под OAuth, однако, вы должны сделать это. Когда вы это сделаете, Twitter предоставит вам набор ключей, которые вам понадобятся для подключения вашего приложения к API.

Чтобы зарегистрировать свое приложение, посетите http://dev.twitter.com/apps и заполните форму, большинство из которых довольно просты, хотя есть несколько полей, которые могут вас отбросить:

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

  • Тип доступа по умолчанию относится к доступу вашего приложения к Twitter. Только чтение удаляет возможность публиковать твиты или добавлять / удалять друзей, в то время как чтение и запись обеспечивает полный доступ. Это почти наверняка то, что вы хотите для вашего приложения.

  • Тип приложения должен быть изменен на Клиент , даже если это приложение может быть запущено заданием cron, имитирующим попадание в веб-браузер, или с помощью скрытого триггера с вашего веб-сайта, пользователь никогда не будет напрямую взаимодействовать с ним через браузер.

Как только ваше приложение будет зарегистрировано, вы получите ключ OAuth Consumer и Consumer secret . Эти две строки являются основой для нашего соединения OAuth.

TwitterOAuth, изначально разработанный Абрахамом Уильямсом , обрабатывает, регистрирует и аутентифицирует запросы OAuth для взаимодействия с Twitter. Благодаря этому классу нет необходимости разбираться во всех тонкостях манипулирования ключами OAuth и токенами. Идите вперед и загрузите копию библиотеки . Для этой статьи я буду использовать версию 0.2.0-бета3.

Обычно веб-приложения Twitter проходят аутентификацию в Twitter, передавая пользователя в Twitter, где они могут нажать кнопку « Авторизовать» . Однако для приложений без взаимодействия с пользователем (таких как автоматизированные приложения Tweet, приведенные в качестве примеров выше), мы бы предпочли не делать этого. К счастью, Twitter предоставил опцию аутентификации на основе PIN-кода, предназначенную для настольных приложений, но в равной степени подходящую для нашего автоматизированного веб-приложения.

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

Однако у класса TwitterOAuth, который мы взяли выше, отсутствует встроенная поддержка регистрации на основе ПИН-кода, поэтому нам нужно быстро изменить код, чтобы все работало. Этот код с некоторыми изменениями основан на этом сообщении в блоге Константина Ковшенина. Отредактируйте файл twitteroauth.php и замените функцию getAccessToken начиная со строки 111, следующим getAccessToken :

  function getAccessToken ($ token = NULL, $ pin = NULL) {if ($ pin) {$ request = $ this-> oAuthRequest ($ this-> accessTokenURL (), 'POST', массив ('oauth_verifier' => $ pin) ));  } else {$ request = $ this-> oAuthRequest ($ this-> accessTokenURL ());  } $ token = OAuthUtil :: parse_parameters ($ request);  $ this-> token = new OAuthConsumer ($ token ['oauth_token'], $ token ['oauth_token_secret']);  вернуть $ token;} 

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

Создайте папку в корне вашего сервера и поместите в twitteroauth папку twitteroauth вы скачали (и изменили).

Также в этой папке создайте файл с именем register.php , содержащий следующий код:


Не забудьте добавить в свой потребительский ключ и секрет.

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

  1. Войдите в Twitter (через веб-сайт), используя учетную запись Twitter, которую вы хотите использовать в приложении.

  2. Загрузите файл register.php в ваш браузер

  3. Сценарий создаст в своем каталоге два файла, содержащих ваш токен запроса и секретный ключ запроса.

  4. Ссылка будет отображаться на экране; это ссылка на ваш регистрационный URL.

  5. Нажмите на ссылку, и Twitter спросит, хотите ли вы разрешить приложению доступ к вашей учетной записи (той, в которую вы вошли в шаге 1).

  6. Наконец, Twitter будет отображать семизначный PIN-код. Скопируйте это.

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

Создайте новый файл validate.php в папке для разработки:


Этот сценарий ожидает, что вы передадите PIN-код в качестве параметра GET (например, http://dev.machine/validate.php?pin=1234567 ), и сохранит файлы с access_token и access_token_secret в папку. Получите доступ к нему в своем браузере, передав PIN-код.

предупреждение: время имеет значение

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

Если это произойдет, просто снова register.php чтобы создать новый PIN-код.

После того, как все токены OAuth сделаны и очищены, пришло время использовать API. Давайте попробуем самый простой из возможных тестов и напишем «Привет, мир» с авторизованного аккаунта:


Поместите этот файл в свой тестовый каталог и получите к нему доступ через браузер (опять же, вам нужно будет вставить свой собственный ключ и секретный ключ). Вы увидите подтверждение того, что ваша учетная запись была подключена, и если вы сейчас загрузите профиль Twitter этой учетной записи, вы должны увидеть твит «hello world»!

Теперь, когда все request_token , файлы register.php , validate.php , request_token и request_token_secret больше не требуются для работы вашего приложения. Сгенерированные токены доступа теперь обрабатывают все назад и вперед между вашим приложением и Twitter. Вы также заметите, что ни в написанном нами коде, ни в каком-либо из сгенерированных файлов нет упоминания имени пользователя или пароля связанной учетной записи Twitter; это главное преимущество безопасности метода OAuth.

Тем не менее, если ваши access_token и access_token_secret находятся в общедоступном веб-каталоге, безопасность учетной записи все еще может быть поставлена ​​под угрозу. После создания они должны быть перемещены за пределы веб-папок вашего сервера и загружены с помощью файловых операций PHP. Если по какой-либо причине это не подходит для вас, переместите их в подпапку, недоступную через Интернет.