Реализация аутентификации OAuth 2.0 для моего API - PullRequest
30 голосов
/ 13 мая 2011

Я уже некоторое время успешно использую API Graph Facebook (использует oauth 2.0 для аутентификации). Теперь мне нужно написать собственный API, который позволяет разработчикам подключаться к нему аналогичным образом. Я просмотрел различные библиотеки, но мне хотелось бы чего-нибудь немного более скромного, поэтому я решил свернуть свои собственные. Глядя на код, который мне нужно для аутентификации пользователя на Facebook, он выглядит относительно простым, но, пожалуйста, исправьте меня, если я сбился с пути.

Сначала я должен предоставить защищенную страницу, на которую потребитель должен будет перенаправить. например, https://api.mydomain.com/oauth/authorize?client_id=CONSUMER_KEY&redirect_url=CALLBACK_URL. Пользователь проверяет приложение, а затем я перенаправляю обратно на URL-адрес, указанный в URL-адресе обратного вызова с oauth_token в строке запроса. Я полагаю, что я мог бы просто сгенерировать случайную уникальную строку здесь для oauth_token и сохранить ее для пользователя для данного конкретного потребителя (РЕДАКТИРОВАТЬ: см. Ответ ниже, он должен быть уникальным для каждого потребительского приложения, а не для пользователя).

Это первый шаг. Теперь мне нужно предоставить вторую защищенную страницу, к которой потребитель будет инициировать веб-запрос. например, https://api.mydomain.com/oauth/access_token?client_id=CONSUMER_KEY&client_secret=CONSUMER_SECRET&oauth_token=OAUTH_TOKEN_RETURNED_ABOVE. Это позволит потребителю обменять полученный выше токен oauth_token на токен доступа. Я снова просто сгенерирую случайную уникальную строку и сохраню ее для пользователя для этого конкретного потребителя.

Теперь мой API будет принимать access_token для методов, которые пытаются получить информацию, специфичную для пользователя, который его использует.

Я хотел бы знать, правильно ли я понял вещи. Спецификация OAuth 2.0 кажется в этом случае тривиальной. Кроме того, почему мы должны обменивать oauth_token с access_token? У меня есть своя идея, но я был бы признателен, если бы кто-то мог помочь прояснить это.

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

Спасибо

1 Ответ

48 голосов
/ 13 мая 2011

На самом деле блок-схемы протоколов были бы чрезвычайно полезны для визуализации таких характеристик, как OAuth 2, но есть только некоторые частичные разработки.Поскольку я только что реализовал только библиотеку OAuth 2 на стороне клиента, я могу убедиться, что вы на правильном пути.Но здесь есть одна загвоздка:

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

Вот базовый процесс аутентификации настольного приложения (взят из:http://developers.gigya.com/020_Developer_Guide/85_REST/OAuth2)

REST OAuth 2.0

Фактически биграмма с временной шкалой (сверху вниз, взято из: http://www.ibm.com/developerworks/web/library/wa-oauthsupport/?ca=drs-)

Protocol flow

И, наконец, полная процедура: (взято из http://h2anetwork.org/ProjectDocs/DPI/DPI_Framework.html)

OAuth protocol flow

...