Статьи

OAuth, Twitter, WordPress HTTP API и вы

В предыдущих уроках мы глубоко погрузились в HTTP-API WordPress . Мы даже пошли на создание следующих плагинов, чтобы продемонстрировать реальные примеры его использования: доменный whois и виджет социальных данных ; CAPTCHA защитный плагин для входа в WordPress, регистрации и комментирования ; и плагин для прекращения регистрации одноразового адреса электронной почты .

В этом руководстве мы познакомимся с миром OAuth , тем, как Twitter использует его для авторизации HTTP-запросов к своему API и, наконец, для создания класса PHP на основе WordPress HTTP API, который плагины могут использовать при использовании Twitter.

Введение в OAuth

OAuth — это протокол аутентификации, который обеспечивает простой, безопасный и более безопасный способ публикации и взаимодействия с защищенными данными. Это позволяет пользователям утверждать приложения, чтобы действовать от их имени, не раскрывая свой пароль.

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

Кодирование класса PHP

Краткий обзор того, как HTTP-запросы к Twitter выполняются с аутентификацией OAuth, будет объяснен при кодировании PHP class .

Прежде всего, зайдите в центр управления приложениями Twitter; создайте приложение для получения ключей и доступа к токену.

Пошаговое руководство по созданию приложений Twitter и получению ключей API можно найти на hostoople.com

Создайте класс PHP и включите свойства, которые будут хранить различные параметры. Они изложены ниже.

 class Twitter_API_WordPress { /** @var string OAuth access token */ private $oauth_access_token; /** @var string OAuth access token secrete */ private $oauth_access_token_secret; /** @var string Consumer key */ private $consumer_key; /** @var string consumer secret */ private $consumer_secret; /** @var array POST parameters */ private $post_fields; /** @var string GET parameters */ private $get_field; /** @var array OAuth credentials */ private $oauth_details; /** @var string Twitter's request URL */ private $request_url; /** @var string Request method or HTTP verb */ private $request_method; 

Конструктор примет массив ключей и секретов вашего потребителя (или API-интерфейса) вашего Twitter, а также доступ к токену и секретному токену и сохранит их в соответствующих свойствах.

 /** Class constructor */ public function __construct( $settings ) { if ( ! isset( $settings['oauth_access_token'] ) || ! isset( $settings['oauth_access_token_secret'] ) || ! isset( $settings['consumer_key'] ) || ! isset( $settings['consumer_secret'] ) ) { return new WP_Error( 'twitter_param_incomplete', 'Make sure you are passing in the correct parameters' ); } $this->oauth_access_token = $settings['oauth_access_token']; $this->oauth_access_token_secret = $settings['oauth_access_token_secret']; $this->consumer_key = $settings['consumer_key']; $this->consumer_secret = $settings['consumer_secret']; } 

Далее идут методы, которые будут принимать параметры GET или POST для HTTP-запроса.

 /** * Store the POST parameters * * @param array $array array of POST parameters * * @return $this */ public function set_post_fields( array $array ) { $this->post_fields = $array; return $this; } /** * Store the GET parameters * * @param $string * * @return $this */ public function set_get_field( $string ) { $this->getfield = $string; return $this; } 

_build_signature_base_string() метод _build_signature_base_string() принимает следующие аргументы для создания базовой строки подписи: URL-адрес запроса, метод запроса или HTTP-глагол и учетные данные OAuth (ключ и секретный ключ; токен и секретный ключ доступа, а также параметры GET, если он является ПОЛУЧИТЬ запрос).

 /** * Create a signature base string from list of arguments * * @param string $request_url request url or endpoint * @param string $method HTTP verb * @param array $oauth_params Twitter's OAuth parameters * * @return string */ private function _build_signature_base_string( $request_url, $method, $oauth_params ) { // save the parameters as key value pair bounded together with '&' $string_params = array(); ksort( $oauth_params ); foreach ( $oauth_params as $key => $value ) { // convert oauth parameters to key-value pair $string_params[] = "$key=$value"; } return "$method&" . rawurlencode( $request_url ) . '&' . rawurlencode( implode( '&', $string_params ) ); } 

_generate_oauth_signature() метод _generate_oauth_signature() принимает созданную базовую строку подписи для генерации подписи OAuth.

 private function _generate_oauth_signature( $data ) { // encode consumer and token secret keys and subsequently combine them using & to a query component $hash_hmac_key = rawurlencode( $this->consumer_secret ) . '&' . rawurlencode( $this->oauth_access_token_secret ); $oauth_signature = base64_encode( hash_hmac( 'sha1', $data, $hash_hmac_key, true ) ); return $oauth_signature; } 

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

  • oauth_consumer_key — ключ потребителя приложения Twitter.
  • oauth_nonce — случайная строка, уникально сгенерированная клиентом, чтобы позволить серверу проверить, что запрос никогда не был сделан прежде, часто создаваемый с помощью time() или mt_rand() .
  • oauth_signature_method — метод подписи, который часто бывает «HMAC-SHA1»
  • oauth_token — токен приложения OAuth.
  • oauth_timestamp — текущая временная метка, созданная с помощью time()
  • oauth_version — Twitter использует версию 1.0
  • oauth_signature — подпись OAuth, сгенерированная _generate_oauth_signature()

Метод запроса или HTTP-глагол также сохраняется в свойстве request_method .

 /** * Build, generate and include the OAuth signature to the OAuth credentials * * @param string $request_url Twitter endpoint to send the request to * @param string $request_method Request HTTP verb eg GET or POST * * @return $this */ public function build_oauth( $request_url, $request_method ) { if ( ! in_array( strtolower( $request_method ), array( 'post', 'get' ) ) ) { return new WP_Error( 'invalid_request', 'Request method must be either POST or GET' ); } $oauth_credentials = array( 'oauth_consumer_key' => $this->consumer_key, 'oauth_nonce' => time(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_token' => $this->oauth_access_token, 'oauth_timestamp' => time(), 'oauth_version' => '1.0' ); if ( ! is_null( $this->get_field ) ) { // remove question mark(?) from the query string $get_fields = str_replace( '?', '', explode( '&', $this->get_field ) ); foreach ( $get_fields as $field ) { // split and add the GET key-value pair to the post array. // GET query are always added to the signature base string $split = explode( '=', $field ); $oauth_credentials[ $split[0] ] = $split[1]; } } // convert the oauth credentials (including the GET QUERY if it is used) array to query string. $signature = $this->_build_signature_base_string( $request_url, $request_method, $oauth_credentials ); $oauth_credentials['oauth_signature'] = $this->_generate_oauth_signature( $signature ); // save the request url for use by WordPress HTTP API $this->request_url = $request_url; // save the OAuth Details $this->oauth_details = $oauth_credentials; $this->request_method = $request_method; return $this; } 

Вот код для метода authorization_header() мы говорили.

 /** * Generate the authorization HTTP header * @return string */ public function authorization_header() { $header = 'OAuth '; $oauth_params = array(); foreach ( $this->oauth_details as $key => $value ) { $oauth_params[] = "$key=\"" . rawurlencode( $value ) . '"'; } $header .= implode( ', ', $oauth_params ); return $header; } 

process_request() отправит запрос GET или POST с помощью wp_remote_get() или wp_remote_post() зависимости от метода запроса и впоследствии вернет ответ с помощью wp_remote_retrieve_body() .

 /** * Process and return the JSON result. * * @return string */ public function process_request() { $header = $this->authorization_header(); $args = array( 'headers' => array( 'Authorization' => $header ), 'timeout' => 45, 'sslverify' => false ); if ( ! is_null( $this->post_fields ) ) { $args['body'] = $this->post_fields; $response = wp_remote_post( $this->request_url, $args ); return wp_remote_retrieve_body( $response ); } else { // add the GET parameter to the Twitter request url or endpoint $url = $this->request_url . $this->get_field; $response = wp_remote_get( $url, $args ); return wp_remote_retrieve_body( $response ); } } 

Посмотрите это руководство для лучшего понимания API-интерфейса WordPress и его работы.

И, наконец, мы закрываем класс.

 } // Twitter_API_WordPress 

Обратите внимание: в set_post_fields() , set_get_field() и build_oauth() объект $this возвращается в каждом методе для поддержки цепочки методов.

Пример:

 $SomeObject->getObjectOne()->getObjectTwo() 

См. Использование класса ниже для лучшего понимания.

Как использовать класс

Этот класс должен использоваться в контексте плагина WordPress. Он не будет работать как отдельный класс, потому что для его работы требуется HTTP-API WordPress.

Чтобы получить список или коллекцию ваших последних твитов, следуйте приведенным ниже инструкциям.
Примечание. Https://api.twitter.com/1.1/statuses/user_timeline.json — это URL-адрес ресурса для получения последних данных твита.

Сначала создайте массив ваших ключей доступа и токенов.

 $settings = array( 'oauth_access_token' => "211978035-tcdnwn5GlzeY9tKiMqTvkSLNPAgcwO5ABtqwgx18", 'oauth_access_token_secret' => "rS0CMxoVNmcUYG5nWi2OhY8bJdFnK3p4W99KSyJ5BU7Iv", 'consumer_key' => "qFt8kyGlietTJoduRItBAU2oJ", 'consumer_secret' => "YWlaR5amBQWlwB62Uah8hjNoCnYYme7tMcrUDg0Z9SKaFvh4eC" ); 

Установите URL-адрес запроса и метод, где w3guy — ваше имя пользователя в Twitter.

 $url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; $getfield = '?screen_name=w3guy'; $request_method = 'GET'; 

Наконец, обработайте запрос следующим образом.

 $twitter_instance = new Twitter_API_WordPress( $settings ); $result = $twitter_instance ->set_get_field( $getfield ) ->build_oauth( $url, $request_method ) ->process_request(); 

Если все пойдет хорошо, переменная $result будет заполнена данными JSON ваших последних твитов.

Например, для запроса POST вы хотите обновить описание своего профиля.

 $settings = array( 'oauth_access_token' => "211978035-tcdnwn5GlzeY9tKiMqTvkSLNPAgcwO5ABtqwgx18", 'oauth_access_token_secret' => "rS0CMxoVNmcUYG5nWi2OhY8bJdFnK3p4W99KSyJ5BU7Iv", 'consumer_key' => "qFt8kyGlietTJoduRItBAU2oJ", 'consumer_secret' => "YWlaR5amBQWlwB62Uah8hjNoCnYYme7tMcrUDg0Z9SKaFvh4eC" ); /** POST fields required by the URL above. See relevant docs as above **/ $url = 'https://api.twitter.com/1.1/account/update_profile.json'; $postField = array( 'description' => 'Web Developer, Writer, Geek' ); $request_method = 'POST'; $instance = new Twitter_API_WordPress( $settings ); $update = $instance ->set_post_fields( $postField ) ->build_oauth( $url, $request_method ) ->process_request(); 

Кредит & Ресурсы

Структура и код этого класса были вдохновлены PHP-клиентом Джеймса Маллисона для PHP .

Чтобы узнать больше о Twitter API и OAuth, см. Ресурсы ниже.

Вывод

В этой статье мы узнали об OAuth и о том, как использовать Twitter с помощью класса HTTP-клиента на основе WordPress HTTP API . Как указывалось ранее, этот класс следует использовать в плагине WordPress, поскольку он использует HTTP-API WordPress, который присутствует или создается только при загрузке WordPress. Этот класс PHP может пригодиться при создании, например, недавнего виджета твитов .

Код доступен на GitHub . Не стесняйтесь, чтобы раскошелиться и даже подать запросы тянуть.

Обязательно подпишитесь на канал WordPress, чтобы быть в курсе моих будущих уроков.

Удачного кодирования.