REST API для веб-сайта, который использует Facebook для аутентификации

У нас есть сайт, где только способ войти и аутентифицировать себя на сайте-Это Facebook (это был не мой выбор). При первом входе в Facebook для вас автоматически создается учетная запись.

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

этот вопрос о том, как аутентифицироваться на нашем веб-сайте из приложения / API и разбивается на 2 части:

  1. Как правильно обрабатывать аутентификацию REST из API на веб-сайт, который использует только Facebook OAuth в качестве метода аутентификации?

    Я много читал и исследовал стандартные методы аутентификации для REST API. Мы не можем использовать такие методы, как базовая аутентификация по HTTPS, поскольку нет учетных данных для пользователя как такового. Что-то вроде этой кажется, только для проверки подлинности приложения с помощью прикладной программный интерфейс.

    В настоящее время лучший способ, который я могу думать, это вы нажмете /авторизовать конечную точку на нашем API, он перенаправляет на Facebook OAuth, а затем перенаправляет обратно на сайт и предоставляет "токен", который пользователь API может использовать для аутентификации последующих запросов.

  2. для официального приложения, которое мы создаем, нам не обязательно использовать публичный API таким же образом. Каков был бы лучший способ поговорить с нашим сайтом и аутентифицироваться пользователи?

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

Я чувствую, что мне не хватает чего-то очень очевидного или не совсем понимаю, как должны работать общедоступные API REST, поэтому любые советы и помощь будут очень признательны.

3 ответов


обновление: см. ниже

Я много думал об этом вопросе. Мне еще не совсем ясно, но вот маршрут, по которому я думаю идти. Я создаю REST API для своих пользователей только auth с Facebook connect.

на клиенте:

  1. используйте API Facebook для входа в систему и получения кода OAUTH2.
  2. обменяйте этот код на маркер доступа.
  3. в каждом вызове моего пользовательского API я буду включать Facebook идентификатор пользователя и маркер доступа.

на API (для каждого метода, который требует аутентификации пользователя):

  1. сделайте запрос на график / me Facebook, используя маркер доступа сверху.
  2. убедитесь, что возвращенный идентификатор пользователя Facebook соответствует идентификатору пользователя, переданному в мой API сверху.
  3. если токен доступа истек, требуется дополнительная связь.

мне еще предстоит проверить это. Как это звук?

--- обновление: 27 июля 2014 года, чтобы ответить на вопрос - - -

Я использую вышеупомянутый обмен только один раз при входе в систему. Как только я определяю, какой пользователь входит в систему, я создаю свой собственный маркер доступа, и этот маркер используется с этого момента. Новый поток выглядит так...

на клиенте:

  1. используйте API Facebook для входа в систему и получения кода OAUTH2.
  2. обменяйте этот код на маркер доступа.
  3. запрос доступ к токену из мой API, включая токен Facebook в качестве параметра

на API

  1. получить запрос маркера доступа.
  2. сделайте запрос на / me Facebook graph с помощью маркера доступа facebook
  3. убедитесь, что пользователь Facebook существует и соответствует пользователю в моей базе данных
  4. создайте мой собственный токен доступа, сохраните его и верните клиенту, который будет использоваться с этого момента

Это моя реализация с использованием Jwts (JSON Web Tokens), в основном похожая на обновленный ответ Криса. Я использовал Facebook JS SDK и JWT.

вот моя реализация.

  1. клиент: используйте Facebook JS SDK для входа и получения маркера доступа.

  2. клиент: запросить JWT из моего API, позвонив /verify-access-token конечной точки.

  3. MyAPI: получает маркер доступа, проверьте это, позвонив /me конечная точка API Facebook.

  4. MyAPI: если маркер доступа действителен, находит пользователя из базы данных, регистрирует пользователя, если он существует. Создайте JWT с требуемыми полями в качестве полезной нагрузки, установите срок действия, подпишите секретным ключом и отправьте обратно клиенту.

  5. клиент: хранит JWT в локальном хранилище.

  6. клиент: отправляет токен вместе с запросом для следующего вызова API.

  7. MyAPI: проверьте токен с помощью секретного ключа, если токен действителен, замените токен на новый, отправьте его обратно клиенту вместе с ответом API. (Нет внешних вызовов API для проверки маркера здесь После) [если маркер недействителен / истек запрос клиента для аутентификации снова и повторить с 1]

  8. клиент заменяет сохраненный токен на новый и использует его для следующий вызов API. После истечения срока действия токена Токен истекает, отменяя доступ к API.

каждый токен используется один раз.

подробнее о безопасности и JWT

насколько безопасен JWT

если вы можете декодировать JWT, как они защищены?

JSON Web Tokens (JWT) как маркеры идентификации пользователя и аутентификации


Я пытаюсь ответить на тот же вопрос и в последнее время много читаю...

У меня не будет "ответа", но для меня все становится немного яснее. Вы читали комментарии в статья, которую вы упомянули? Я нашел их очень интересными и полезными.

в результате, и в свете того, как все развивалось с момента написания первой статьи, вот что я думаю, я буду do:

  • HTTPS везде - это позволяет забыть о HMAC, подписи, nonce, ...

  • Использовать OAuth2, Которые:

    • когда запросы аутентификации поступают из моих собственных приложений / веб-сайта, используйте этот " трюк "(или его вариант), описанный в ответ на статью упоминал ранее.

    • в моем случае у меня есть два типа пользователей: те, кто имеет классические учетные данные для входа/пароля и те, кто подписался на Facebook Connect.
      Поэтому я бы предоставил обычную форму входа с кнопкой" Войти с Facebook". Если пользователь входит в систему со своими" классическими " учетными данными, я бы просто отправил их в свою конечную точку OAuth2 с grant_type=password.
      Если он решит войти через Facebook, Я думаю, что это будет двухэтапный процесс:

      • во-первых, используйте Facebook iOS SDK, чтобы открыть FBSession
      • когда это будет сделано, и приложение будет возвращено управление, должен быть способ получите идентификатор Facebook для этого пользователя. Я бы отправил этот идентификатор один в мою конечную точку OAuth2 с грант расширением понимается моим сервером как "использование идентификатора пользователя FB".

обратите внимание, что я все еще сильно исследую все это, так что это может быть не идеальный ответ... может быть, даже не правильный! Но я думаю, что это было бы хорошей отправной точкой. Идея использования "гранта расширения" для Facebook аутентификация может включать в себя необходимость регистрации, чтобы делать все правильно? Я не совсем уверен.

в любом случае, я надеюсь, что смог помочь вам хоть немного, и что, по крайней мере, он может начать обсуждение, чтобы найти лучшее решение для этой проблемы :)

обновление
Логин Facebook не является решением, как указано в комментариях: любой может отправить произвольный идентификатор пользователя и войти как этот пользователь в API.

Как насчет того, чтобы сделать это как это:

  • показать форму входа с кнопкой "Facebook login"
  • если этот метод входа выбран, действуйте как Facebook SDK: откройте веб-страницу с вашего сервера аутентификации, который инициирует вход в Facebook.
  • после входа пользователя в систему Facebook будет использовать URL-адрес перенаправления для подтверждения; сделайте этот URL-адрес точкой другой конечной точки вашего сервера аутентификации (возможно, с дополнительным параметром, указывающим, что вызов пришел из приложение?)
  • при попадании в конечную точку аутентификации аутентификация может безопасно идентифицировать пользователя, сохранить его сеанс FB User ID/FB и вернуть маркер доступа в ваше приложение с помощью пользовательской схемы URL, как это сделал бы Facebook SDK

выглядит лучше?