Итак, я уже несколько дней вытаскиваю свои волосы, пытаясь понять, как добавить аутентификацию имени пользователя и пароля в мой API-интерфейс rails.
Вот краткий обзор моего текущего потока аутентификации:
-
Пользователь выбирает "login with Facebook" на мобильном клиенте, клиенте перенаправляет на приложение Facebook и запрашивает access_token
-
В случае успеха Facebook отвечает токеном доступа и клиентом перенаправляет обратно в мое приложение.
-
Клиент отправляет токен доступа в мой API
-
В моем API используется камень koala, чтобы проверить, действителен ли токен доступа.
-
Если токен действителен, Facebook отправляет данные пользователей в API где создается новый пользователь. Если пользователь уже существует, мой API отправляет данные пользователей.
Мой API обрабатывает маркер доступа на шаге 4, как показано ниже:
def self.authenticate_user_from_facebook(fb_access_token)
user = User.new
graph = Koala::Facebook::API.new(fb_access_token)
profile = graph.get_object('me')
#user['fb_id'] = profile['id']
#user['fb_token'] = fb_access_token
# Generate user hash
uhash = Hash.new
uhash['provider'] = 'facebook'
uhash['uid'] = profile['id']
uhash['info'] = Hash.new
uhash['info']['nickname'] = profile['username']
uhash['info']['name'] = profile['name']
uhash['info']['email'] = profile['email']
uhash['info']['first_name'] = profile['first_name']
uhash['info']['last_name'] = profile['last_name']
uhash['info']['verified'] = profile['verified']
uhash['info']['urls'] = Hash.new
uhash['info']['urls']['Facebook'] = profile['link']
uhash['credentials'] = Hash.new
uhash['credentials']['token'] = fb_access_token
uhash['extra'] = Hash.new
uhash['extra']['raw_info'] = Hash.new
#Save the new data
user = User.apply_auth(uhash)
return user
end
def self.apply_auth(uhash)
User.where(:uid => uhash['uid'], :provider => uhash['provider']).first_or_create do |user|
user.provider = uhash['provider']
user.uid = uhash['uid']
user.nickname = uhash['info']['nickname']
user.email = uhash['info']['email']
user.name = uhash['info']['name']
user.first_name = uhash['info']['first_name']
user.last_name = uhash['info']['last_name']
end
end
После создания пользователя они могут отправлять запросы на мой API с помощью маркера доступа, как показано ниже:
На шаге 2 API использует koala, чтобы проверить токен доступа пользователей. Это делается путем применения следующего before_filter ко всем контроллерам.
before_filter :current_user
и в моем приложении application_helper.rb
def current_user
@current_user ||= User.authenticate_user_from_facebook(params[:access_token])
end
Каждый раз, когда пользователь делает запрос на мой API, камень koala используется, чтобы проверить, действительно ли токен, затем обрабатывается запрос.
Теперь я пытаюсь добавить аутентификацию только с именем пользователя и паролем.
Вещи, которые я просмотрел
Я постоянно обращался к Railscast 235, 209, 250, 82 и читал на OAuth2. У меня есть общее представление о том, как работает аутентификация, но у меня возникли проблемы с его применением к текущему потоку аутентификации.
Определить аутентификацию токена Ссылаясь на Railscast 235, 209 и этот пост в блоге: http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/
Я могу понять, как входить в систему и проверять пользователя, который входит в систему с именем пользователя и паролем. Однако я смущен тем, как это будет связано с моим потоком входа в Facebook. Я не понимаю, как создать сеанс с разработкой для пользователя, у которого уже есть токен доступа, созданный Facebook.
OAuth2 Создание моего API-провайдера OAuth2 похоже на то, что это был бы хороший способ, но кажется глупым перенаправление на браузер, и я не знаю, можно ли перенаправить его обратно из браузера в мое приложение.
Аутентификация с нуля Это вариант, о котором я думаю, но я бы изобрел колесо.
Спасибо, что прочитал этот длинный пост! Любые советы приветствуются!