Реализация аутентификации OAuth 2.0 для My API
Я уже некоторое время успешно использую API Graph Facebook (использует oauth 2.0 для аутентификации). Теперь мне нужно написать собственный API, который позволяет разработчикам подключаться к нему аналогичным образом. Я просмотрел различные библиотеки, но мне хотелось бы чего-нибудь немного более скромного, поэтому я решил свернуть свои собственные. Глядя на код, который я должен аутентифицировать пользователя на фейсбуке, он выглядит относительно простым, но, пожалуйста, поправьте меня, если я сбился с пути.
Сначала я должен предоставить защищенную страницу, на которую потребитель должен будет перенаправить. например, 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 ответ
На самом деле, блок-схемы протоколов были бы чрезвычайно полезны для визуализации таких спецификаций, как OAuth 2, но есть только некоторые частичные разработки. Поскольку я только что реализовал клиентскую библиотеку OAuth 2 только на стороне клиента, я могу убедиться, что вы на правильном пути. Но вот подвох:
oauth_token принадлежит вашему клиентскому приложению (то есть настольному ридеру Facebook), которое аутентифицирует ваше приложение (как ID). Вы отправляете это, чтобы получить обратно access_token, специфичный для вашего приложения и вошедшего в систему пользователя, который позволяет вам получить доступ к ограниченным ресурсам, связанным с пользователем.
Вот базовый процесс аутентификации настольного приложения (взят из: http://developers.gigya.com/020_Developer_Guide/85_REST/OAuth2)
На самом деле потоковая диграмма с временной шкалой (сверху вниз, взято с: http://www.ibm.com/developerworks/web/library/wa-oauthsupport/?ca=drs-)
И, наконец, полная процедура: (взято с http://h2anetwork.org/ProjectDocs/DPI/DPI_Framework.html)