Доступ к Web-сайтам социальных сетей по протоколу OAuth

Часть 1. Клиентское настольное приложение для Twitter, использующее OAuth

Введение

Comments

Серия контента:

Этот контент является частью # из серии # статей: Доступ к Web-сайтам социальных сетей по протоколу OAuth

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Доступ к Web-сайтам социальных сетей по протоколу OAuth

Следите за выходом новых статей этой серии.

Социальные сети широко используются людьми по всему миру. Web-сайты, подобные Facebook и Twitter, становятся все более и более популярными, но, к сожалению, учитывая сложности взаимодействия между ними, эти Web-сайты похожи на изолированные острова, разбросанные в океане. Несмотря на то, что многие из этих сайтов предоставляют API для представления некоторых своих данных, агрегировать много таких Web-сайтов в для mashup-сайте непросто. Например, необходимо управлять пользовательскими учетными записями для различных Web-сайтов, поэтому для облегчения работы пользователей требуется в некотором роде единая регистрация (single sign-on). Пользователи не всегда охотно предоставляют свои пароли стороннему Web-сайту.

В данной серии статей описывается открытый протокол OAuth, позволяющий пользователям предоставлять свои частные данные различным Web-сайтам вместе со своими полномочиями, но показывать эти данные только исходному Web-сайту, где они хранятся. В этой первой статье дается введение в OAuth с примером настольного приложения, позволяющего пользователям обновлять свой Twitter-статус, используя OAuth. Во второй части данной серии статей будет рассказано, как разработать более практичное Web-приложение Twitter-клиента, использующее OAuth. В последней статье речь пойдет о том, как развернуть разработанное во второй части Web-приложение в среде Google App Engine (GAE).

Для работы с данной статьей необходимо иметь опыт Web-разработки с использованием технологии Java™ Servlet/JSP. В качестве Web-контейнера был выбран Apache Tomcat, а вся разработка проводится в среде Eclipse. Однако вы сможете адаптировать данную информацию для предпочитаемых вами инструментальных средств. Отметим, что для компилирования исходного кода необходим JDK 5+.

Введение в OAuth

Протокол OAuth позволяет пользователям предоставлять частные ресурсы, хранящиеся на Web-сайте, другим сайтам, не показывая информацию о полномочиях (например, имя пользователя и пароль) Web-сайтам, отличным от сайта, хранящего данные. Web-сайт, применяющий OAuth в качестве одного из своих протоколов аутентификации, улучшает защищенность и секретность для пользователей. В OAuth есть три ключевых игрока: пользователь (user), потребитель (consumer) и поставщик сервиса (service provider) (см. врезку). Типичный сценарий работы OAuth можно описать следующим образом (полное описание OAuth приведено в спецификации "OAuth Core 1.0a" и "Руководстве для начинающих", ссылки на которые приведены в разделе Ресурсы):

Web-сайт PHOTO (поставщик сервиса) хранит некоторые частные фотографии пользователя (пользователь). Но этот сайт не предоставляет сервис печати. Поэтому, когда пользователь захочет распечатать свои фотографии, он может перейти на Web-сайт PRINTER (потребитель), предоставляющий сервис печати. Но Web-сайт PRINTER не имеет фотографий пользователя. Следовательно, должен существовать поток данных от сайта PHOTO к PRINTER. Вот здесь может помочь OAuth. Если сайт PHOTO позволяет выполнять аутентификацию с использованием OAuth, то при желании пользователя распечатать фотографии (хранящиеся на сайте PHOTO) сайт PRINTER направит его на сайт PHOTO для предоставления доступа к фотографиям. Здесь пользователь может быть аутентифицирован с использованием обычной пары имя-пароль. После аутентификации на сайте PHOTO пользователю может быть выдан запрос на разрешение доступа сайту PRINTER для чтения фотографий. (Это разрешение может быть установлено заранее, и этот шаг может пропускаться.) После этого пользователь будет направлен на сайт PRINTER. Теперь сайт PRINTER имеет разрешение на чтение пользовательских фотографий с сайта PHOTO и сможет распечатать их по требованию пользователя. На всех шагах сайт PRINTER не имеет информации о полномочиях пользователя, зарегистрированной на сайте PHOTO. Таким образом, частные данные пользователя защищаются лучше. На рисунке 1 продемонстрирован описанный выше процесс в виде упрощенной схемы последовательности действий.

Рисунок 1. OAuth-взаимодействия между пользователем, потребителем и поставщиком сервиса
Рисунок 1. OAuth-взаимодействия между пользователем, потребителем и поставщиком сервиса
Рисунок 1. OAuth-взаимодействия между пользователем, потребителем и поставщиком сервиса

(Подробное описание данного рисунка.)

Спецификация OAuth Core 1.0 была завершена в конце 2007 года. На время написания данной статьи последней версией является 1.0a, в которой исправлена проблема системы защиты, связанная с атаками фиксирования сессии в потоке подтверждения маркера запроса OAuth. Сегодня OAuth принят самыми крупными игроками на интернет-рынке, такими как Google и Yahoo.

Разработка настольного клиентского приложения для Twitter

Twitter, один из наиболее успешных примеров социальных сетей, привлек большое количество пользователей. Не только люди, но также и компании используют Twitter для быстрого обновления своего статуса. Например, IBM developerWorks использует Twitter для информирования людей о новостях сайта. Не удивительно, что Twitter поддерживает OAuth, поэтому я рассмотрю его в данной статье. Сначала я расскажу, как разработать простое клиентское приложение для Twitter, использующее OAuth. Если у вас еще нет учетной записи на Twitter, зарегистрируйтесь на сайте http://twitter.com и продолжите работу с данной статьей.

Регистрация настольного приложения на Twitter: MyTtDesktopClient

В настоящее время Twitter поддерживает два типа аутентификации: Basic Auth и OAuth. Хотя Basic Auth прост в использовании, имена пользователей и пароли не защищены во время передачи по протоколу HTTP, поэтому я не буду рассматривать его в данной статье. Чтобы иметь возможность использовать OAuth с Twitter, необходимо сначала зарегистрировать приложение на http://twitter.com/oauth_clients. Я зарегистрировал свое приложение со следующей информацией.

  • Application Name (название приложения): MyTtDesktopClient.
  • Description (описание): настольное клиентское приложение для Twitter, использующее OAuth.
  • Application Website (Web-сайт приложения): введите домашнюю страницу вашего приложения.
  • Application Type (тип приложения): Client – мы собираемся разработать настольное клиентское приложение.
  • Default Access type (тип доступа по умолчанию): Read & Write (чтение и запись) – мы хотим предоставлять пользователям доступ по записи.
  • Use Twitter for login (использовать ли Twitter для регистрации): No (нет) – мы не собираемся использовать Twitter для аутентификации.

Отмечу, что необходимо выбрать тип приложения Client, а не Browser. (Во второй части данной серии статей я рассмотрю пример Web-приложения.) Также не забудьте указать доступ Read & Write, в противном случае ваше приложение сможет только читать данные с Twitter.

После успешной регистрации вы получите ключ потребителя (consumer key), секретную информацию (consumer secret) и три URL-адреса (URL маркера запроса (request token), URL маркера доступа (access token) и URL авторизации). Теперь все готово для реальной работы.

Разработка и тестирование MyTtDesktopClient

Я буду использовать Twitter4J, Java-библиотеку для TwitterAPI с открытыми исходными кодами (см. раздел Ресурсы). Twitter4J охватывает много функций, поэтому мы можем сосредоточиться на логике, не касаясь низкоуровневых API-вызовов к Twitter. Дополнительным преимуществом Twitter4J является то, что она поддерживает OAuth, что значительно облегчает нашу работу. Давайте начнем с метода updateStatus(String status) класса myttdesktopclient.OAuthTwitterClient, приведенного в листинге 1. Исходный код доступен по ссылке, приведенной в разделе Загрузка. Не забудьте поместить ваши ключ и секретную информацию (эти параметры были предоставлены вам после регистрации клиентского приложения на Twitter) в OAuthTwitterClient.java.

Листинг 1. Метод updateStatus(String status) класса myttdesktopclient.OAuthTwitterClient
public void updateStatus(String status) throws TwitterException, IOException {
	Twitter twitter = new Twitter();
	twitter.setOAuthConsumer(consumerKey, consumerSecret);
	RequestToken requestToken = twitter.getOAuthRequestToken();
	AccessToken accessToken = null;
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	while (accessToken == null) {
		System.out.println("Open the following URL and grant access to
	       								your account:");
		System.out.println(requestToken.getAuthorizationURL());
		// Скопируйте URL авторизации в ваш браузер
		// http://twitter.com/oauth/authorize?oauth_token=xxxxxxxxxxxxxxxxxxxxxxxx
		// Войдите в Twitter, предоставьте доступ
		// Получите PIN, например 738805
		// Отметим, что вы можете использовать HttpClient для этого
		System.out.println("Copy the PIN displayed in your browser, then
		       							hit ENTER: ");
		String pin = br.readLine();
		accessToken = twitter.getOAuthAccessToken(requestToken, pin);
	}

	// Запомнить маркер запроса для последующей ссылки
	int userId = twitter.verifyCredentials().getId();
	storeAccessToken(userId, accessToken);
	Status twitterStatus = twitter.updateStatus(status);
	System.out.println("Successfully updated the status for user with ID "
				+ userId + " to [" + twitterStatus.getText() + "].");
}

Метод updateStatus(String status) сначала создает объект Twitter, затем устанавливает ключ и секретную информацию. После этого из Twitter извлекается маркер запроса. Затем метод выводит URL для авторизации пользователя с целью предоставления доступа к данным, хранящимся на Twitter. Теперь скопируйте и поместите URL-адрес, выданный кодом, в браузер и нажмите клавишу Enter; появится запрос авторизации от MyTtDesktopClient (см. рисунок 2). Отмечу, что мы собираемся авторизоваться на сайте Twitter, и наше настольное приложение не знает о том, как это происходит.

Рисунок 2. Предоставление доступа к MyTtDesktopClient
Рисунок 2. Предоставление доступа к MyTtDesktopClient
Рисунок 2. Предоставление доступа к MyTtDesktopClient

При авторизации запроса Twitter возвращает PIN, как показано на рисунке 3.

Рисунок 3. Twitter возвращает PIN в MyTtDesktopClient
Рисунок 3. Twitter возвращает PIN в MyTtDesktopClient
Рисунок 3. Twitter возвращает PIN в MyTtDesktopClient

Теперь скопируйте и поместите этот PIN в окно терминала, в котором работает ваш код, и нажмите клавишу Enter. Вы должны увидеть информацию, аналогичную приведенной в листинге 2. Как видно из листинга 1, настольное клиентское приложение интересуется только выходными данными процесса авторизации. Если он успешен (в данном случае Twitter возвращает PIN), предоставляется маркер доступа, благодаря которому клиентское приложение может обновить свой Twitter-статус от имени пользователя. Это ключевой момент OAuth. Секретные данные о пользователе (имя и пароль) приложению MyTtDesktopClient. не предоставляются. Если вы зарегистрируетесь в Twitter, то увидите последнее обновление "Studying OAuth" (см. рисунок 4). Отмечу, что сообщение ниже последнего статуса указывает на то, что он был обновлен приложением MyTtDesktopClient.

Листинг 2. Выходная информация MyTtDesktopClient
Open the following URL and grant access to your account:
http://twitter.com/oauth/authorize?oauth_token=matzsp0Q8k5GfhX2DQoQaHEipBH3g3ieqzPg5QyYek
Copy the PIN displayed in your browser, then hit ENTER:
1944867
Storing access token for 23741179...Done
Successfully updated the status for user with ID 23741179 to [Studying OAuth].
Рисунок 4. Статус Twitter обновлен приложением MyTtDesktopClient
Рисунок 4. Статус Twitter обновлен приложением MyTtDesktopClient
Рисунок 4. Статус Twitter обновлен приложением MyTtDesktopClient

Отмечу, что в листинге 1 перед обновлением статуса Twitter маркер доступа сохраняется путем вызова метода storeAccessToken. Причина этого заключается в том, что в настоящее время маркер доступа от Twitter не имеет даты истечения срока годности. Следовательно, нет необходимости получать доступ снова при повторном использовании нашего клиентского приложения пользователем. Это улучшает процесс работы с пользователем. В данном примере маркер доступа сохраняется в обычном текстовом файле (plain text) для пользователя. Его можно извлекать для последующего использования. Взгляните на методы storeAccessToken и loadAccessToken в исходном коде (см. ссылку в разделе Загрузка). Новый метод обновления updateStatus(int userId, String status) использует сохраненный маркер доступа (см. листинг 3). В методе main закомментируйте строку tt.updateStatus("Studying OAuth"); и удалите символы комментирования в строке tt.updateStatus(23741179, "Studying OAuth again");. Замените число 23741179 вашим собственным Twitter ID. Повторно скомпилируйте и запустите код. Статус Twitter обновится без процесса авторизации.

Листинг 3. Метод updateStatus(int userId, String status) класса myttdesktopclient.OAuthTwitterClient
public void updateStatus(int userId, String status)
		throws TwitterException, IOException {
	Twitter twitter = new Twitter();
	twitter.setOAuthConsumer(consumerKey, consumerSecret);
	AccessToken accessToken = loadAccessToken(userId);
	twitter.setOAuthAccessToken(accessToken);
	Status twitterStatus = twitter.updateStatus(status);
	System.out.println("Successfully updated the status for user with ID "
			+ userId + " to [" + twitterStatus.getText() + "].");
}

Резюме

В этой первой статье серии я представил протокол OAuth. На примере приложения MyTtDesktopClient мы познакомились с основными принципами использования OAuth. Особенностью здесь является то, что данные о пользовательских полномочиях, хранящиеся у поставщика сервисов (имя пользователя и пароль в Twitter), не предоставляются потребителю - приложению MyTtDesktopClient. Во второй части данной серии я продемонстрирую, как разработать более практичное Web-приложение, позволяющее пользователям взаимодействовать с Twitter по протоколу OAuth.


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Web-архитектура, SOA и web-сервисы
ArticleID=778841
ArticleTitle=Доступ к Web-сайтам социальных сетей по протоколу OAuth: Часть 1. Клиентское настольное приложение для Twitter, использующее OAuth
publish-date=12052011