Подтвердить что ты не робот

Rails Devise OmniAuth Facebook Вход с iOS

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

В настоящее время у меня есть приложение iPhone, прошедшее аутентификацию с помощью моего Rails API через Basic Auth. Это просто ваш простой, готовый к запуску комплексный пакет. Затем я последовал инструкциям по настройке omniauth-facebook для разработки и получил эту работу на стороне браузера.

Часть, которую я не могу понять, как это сделать, - как отправить токен, полученный на стороне iPhone (через SDK Facebook iOS) на сервер. Я хочу, чтобы сервер проверял таблицу пользователей, чтобы узнать, зарегистрирован ли пользователь Facebook, и создать учетную запись для него, если он этого не сделал. Затем я подумал, что сервер будет генерировать случайный пароль и отправить его обратно на клиентское устройство, чтобы я мог сохранить одну и ту же базовую стратегию аутентификации. Является ли это правильным способом реализации единого входа для веб-приложения и приложения для iPhone? Как можно было бы изменить пакеты на стороне сервера, чтобы поддерживать аутентификацию через токен, отправленный с телефона?

4b9b3361

Ответ 2

Изучали ли вы приложение для Oauth2?

Я не делал этого сам, но после некоторого рытья он выглядит как opro и привратник - два возможных решения проблемы.

https://github.com/opro/opro https://github.com/doorkeeper-gem/doorkeeper

выглядит как opro работает очень хорошо с помощью:

#inside initializers/opro.rb
Opro.setup do |config|
  config.auth_strategy = :devise
end

Определенно интересно посмотреть, как это получается для вас

Ответ 3

Думаю, у вас есть правильный план. Мы сделали именно это в нашем приложении и веб-сервисе.

Приложения используют REST API, базовую аутентификацию по HTTPS, пароль, созданный сервером, и все это реализовано без Devise. В контроллере есть метод, на который наследуются все контроллеры API, то есть before_action для всех методов API, и он вызывает "authenticate_or_request_with_http_basic"

class ApiController < ActionController::Base
  before_action :authenticate_api
  def authenticate_api
    authenticate_or_request_with_http_basic do |username, password|
      # check server-generated password
    end
  end
end

Таким образом, обработка большинства запросов.

У нас также есть действие контроллера API для регистрации с устройства один раз, чтобы получить этот пароль с сервера:

class UsersController < ApiController
  skip_before_action :authenticate_api, only: [:register_fb]

  def register_fb
    graph = Koala::Facebook::API.new(params.require("access_token"))
    profile = graph.get_object("me?fields=email,first_name,last_name")
    # then go on to look up user if already exists, or create
    # ...  return server-generated password
  end
end

Веб-приложение, однако, все контроллеры наследуют от WebappController и используют его.

Таким образом, у нас есть два пароля для объекта User (один для Интернета, один для мобильного) и идентификатор facebook, а также наш собственный идентификатор пользователя, который используется для аутентификации.