Как обрабатывать аутентификацию (локальную и Facebook, например), используя passport.js, через RESTful API вместо веб-интерфейса?
Особые проблемы связаны с передачей данных из обратных вызовов в ответ RESTful (JSON) по сравнению с использованием типичного res.send ({data: req.data}), настройкой начальной конечной точки / конечной точки входа в систему, которая перенаправляет на Facebook (/ login не может быть доступ через AJAX, потому что это не ответ JSON - это перенаправление на Facebook с обратным вызовом).
Я нашел https://github.com/halrobertson/test-restify-passport-facebook , но у меня проблемы с пониманием.
Кроме того, как passport.js хранит учетные данные аутентификации? Сервер (или это сервис?) Поддерживается MongoDB, и я ожидаю, что там будут храниться учетные данные (логин и соленый хеш pw), но я не знаю, имеет ли passport.js такую возможность.
источник
passport-facebook
. После того, как вы начнете работать, следующий шаг - начать понимать, как работает Passport и как он хранит учетные данные. Подключение к Restify ( см. Здесь обновленную версию упомянутой вами) будет одним из последних шагов (или вы можете реализовать интерфейс REST в Express).Ответы:
Здесь задается много вопросов, и кажется, что хотя вопросы задаются в контексте Node и passport.js, реальные вопросы больше касаются рабочего процесса, чем того, как это сделать с определенной технологией.
Давайте использовать пример настройки @Keith, немного измененный для дополнительной безопасности:
https://example.com
обслуживает одностраничное клиентское приложение Javascripthttps://example.com/api
предоставляет поддержку сервера для многофункционального клиентского приложения.https://example.com/api
https://example.com/api
но не знают о веб-сервере вhttps://example.com
.Обратите внимание, что я использую безопасный HTTP. По моему мнению, это необходимо для любой службы, доступной в открытом доступе, поскольку конфиденциальная информация, такая как пароли и токены авторизации, передается между клиентом и сервером.
Имя пользователя / пароль аутентификация
Давайте посмотрим, как работает простая старая аутентификация.
https://example.com
https://example.com/api
для получения пользовательских данных, отображаемых на странице. Каждый отдельный запрос, отправляемый веб-службе, будет включать имя пользователя и пароль, возможно, в форме базовой аутентификации HTTP , поскольку службе, имеющей RESTful, не разрешено поддерживать состояние клиента от одного запроса к следующему. Поскольку веб-служба работает по безопасному HTTP, пароль безопасно шифруется во время транзита.https://example.com/api
получает несколько отдельных запросов, каждый из которых содержит информацию для аутентификации. Имя пользователя и пароль в каждом запросе сверяются с базой данных пользователей, и если они найдены правильно, запрошенная функция выполняется и данные возвращаются клиенту в формате JSON. Если имя пользователя и пароль не совпадают, клиенту отправляется ошибка в виде кода ошибки 401 HTTP.В этом примере важно отметить, что веб-сервисы RESTful требуют аутентификации при каждом запросе .
Дополнительный уровень безопасности в этом сценарии добавил бы авторизацию клиентского приложения в дополнение к аутентификации пользователя. Например, если у вас есть веб-клиент, приложения для iOS и Android, все из которых используют веб-сервис, вы можете попросить сервер знать, какой из трех клиентов данного запроса, независимо от того, кто является аутентифицированным пользователем. Это может позволить вашему веб-сервису ограничить определенные функции определенными клиентами. Для этого вы можете использовать API ключи и секреты, см. Этот ответ для некоторых идей на этот счет.
Аутентификация в фейсбуке
Приведенный выше рабочий процесс не работает для подключения к Facebook, поскольку при входе через Facebook используется сторонняя организация, сама Facebook. Процедура входа требует, чтобы пользователь был перенаправлен на веб-сайт Facebook, где учетные данные вводятся вне нашего контроля.
Итак, давайте посмотрим, как все меняется:
https://example.com
https://example.com/auth/facebook
.https://example.com/auth/facebook
Маршрут обрабатывается passport.js (см документации )https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
маршрута вызовет функцию обратного вызова, которая получает токен доступа Facebook и некоторую информацию о пользователе от Facebook, включая адрес электронной почты пользователя.https://example.com/api
будут включать токен доступа Facebook для аутентификации или собственный токен доступа приложения, сгенерированный из токена Facebook через функцию «get_access_token» в REST API.Я надеюсь, что это отвечает на большинство вопросов. Конечно, вы можете заменить Facebook на Twitter, Google или любой другой сервис аутентификации на основе OAuth.
Мне было бы интересно узнать, есть ли у кого-то более простой способ справиться с этим.
источник
Every single request they send to the web service will include the username and password
, и все же ты говоришьyou can have a "get_access_token" function in your RESTful service
. Кажется противоречивым утверждать, что REST должен быть без сохранения состояния, но хранение токенов доступа на стороне сервера - это нормально, поскольку этот акт хранения токенов доступа означает, что сервер теперь находится в состоянии. Буду признателен за любые разъяснения или обоснования по этому поводу. Спасибо! :)Я высоко ценю объяснение @ Мигеля с полным потоком в каждом случае, но я хотел бы добавить некоторые в части аутентификации Facebook.
Facebook предоставляет Javascript SDK который можно использовать для получения токена доступа непосредственно на стороне клиента, который затем передается на сервер и используется для дальнейшего извлечения всей пользовательской информации из Facebook. Таким образом, вам не нужно никаких перенаправлений в принципе.
Кроме того, вы можете использовать ту же конечную точку API для мобильных приложений. Просто используйте Android / iOS SDK для Facebook, получите Facebook access_token на стороне клиента и передайте его на сервер.
Что касается природы без сохранения состояния, как объяснено, когда get_access_token используется для генерации токена и его передачи клиенту, этот токен также сохраняется на сервере. Так что это так же хорошо, как токен сеанса, и я верю, что это делает его состоянием?
Просто мои 2 цента ..
источник
Вот удивительная статья, которую я нашел, которая может помочь вам пройти аутентификацию:
Простая идентификация узла: настройка и локальная
источник