Ответ 1
Вы можете посмотреть здесь:
Открытый исходный код: анонс devise-iOS для упрощенного Auth
Это выглядит относительно безболезненным способом работы с Rails/Devise и iOS. Я определенно планирую использовать его в своем следующем проекте.
Я искал твердое решение этой проблемы и натолкнулся на этот SO вопрос о том, какие совпадения имеют мое затруднительное положение, но не совсем.
В настоящее время у меня есть приложение iPhone, прошедшее аутентификацию с помощью моего Rails API через Basic Auth. Это просто ваш простой, готовый к запуску комплексный пакет. Затем я последовал инструкциям по настройке omniauth-facebook для разработки и получил эту работу на стороне браузера.
Часть, которую я не могу понять, как это сделать, - как отправить токен, полученный на стороне iPhone (через SDK Facebook iOS) на сервер. Я хочу, чтобы сервер проверял таблицу пользователей, чтобы узнать, зарегистрирован ли пользователь Facebook, и создать учетную запись для него, если он этого не сделал. Затем я подумал, что сервер будет генерировать случайный пароль и отправить его обратно на клиентское устройство, чтобы я мог сохранить одну и ту же базовую стратегию аутентификации. Является ли это правильным способом реализации единого входа для веб-приложения и приложения для iPhone? Как можно было бы изменить пакеты на стороне сервера, чтобы поддерживать аутентификацию через токен, отправленный с телефона?
Вы можете посмотреть здесь:
Открытый исходный код: анонс devise-iOS для упрощенного Auth
Это выглядит относительно безболезненным способом работы с Rails/Devise и iOS. Я определенно планирую использовать его в своем следующем проекте.
Изучали ли вы приложение для 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
Определенно интересно посмотреть, как это получается для вас
Думаю, у вас есть правильный план. Мы сделали именно это в нашем приложении и веб-сервисе.
Приложения используют 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, а также наш собственный идентификатор пользователя, который используется для аутентификации.