Могу ли я передать идентификатор id + Facebook в сервис Rails Devise для аутентификации пользователя? - PullRequest
4 голосов
/ 22 июня 2011

У меня есть веб-сервис Rails, работающий с Devise + OmniAuth. У меня есть пользователи, которые проходят аутентификацию на Facebook Connect на мобильном устройстве. Затем я хочу, чтобы мобильное устройство установило сеанс с нашими веб-службами. Что мне нужно передать на устройство с мобильного клиента, чтобы установить этот сеанс? Есть ли пример кода на стороне Rails о том, как обрабатывать этот токен id +, который передается из facebook -> mobile -> web service?

Ответы [ 2 ]

4 голосов
/ 03 июля 2011

Я не нашел хорошего способа сделать это. Я также не использую :omniauthable, я использую OmniAuth и Devise по отдельности, как видно из эпизода Railscast, где есть две таблицы users и authentications. Это своего рода хакерство и работает только для Facebook.

По сути, отправьте свой access_token с iPhone на сервер через SSL или что-то подобное. Сначала вы должны проверить с OmniAuth, и если вам предоставлен доступ, то вы можете вручную создать сеанс с OmniAuth, выполнив что-то вроде:

Я заставил что-то работать, хотя:

FB = OmniAuth::Strategies::Facebook.new("nothing") 

client = ::OAuth2::Client.new("nothing", "nothing", FB.client_options) 

cached_token = "app_id_part|session_id_part|token_part" # or maybe you sent it from the iPhone
access_token = ::OAuth2::AccessToken.new(client, cached_token)  

FB.instance_variable_set("@access_token", access_token) 

FB.auth_hash 
# You will either get a hash or get this error:
# OAuth2::AccessDenied: Received HTTP 401 during request.

После этого вы просматриваете информацию о пользователе, которую нужно найти, с помощью таблицы аутентификаций:

@user = Authentication.where(:uid => FB.auth_hash["uid"], :provider => "facebook").first.user

Теперь мы создаем сессию:

sign_in_and_redirect(:user, @user)

# or, perhaps

sign_in(@user, :bypass => true)
2 голосов
/ 02 февраля 2012

Мне было тяжело с этим, поэтому я опубликую свой ответ здесь для всех остальных.Это вдохновлено ответом Декса выше.

FB = OmniAuth::Strategies::Facebook.new("APP_ID", "APP_SECRET") 
client = OAuth2::Client.new("APP_ID", "APP_SECRET", FB.options.client_options) 
token = OAuth2::AccessToken.new(client,'ACCESS_TOKEN', FB.options.access_token_options)
FB.access_token = token
FB.auth_hash

Буду признателен за любые предложения по улучшению этого.

Приведенный выше фрагмент кода позволяет мне получить auth_hash, запросив facebook с access_token

Я использую этот драгоценный камень: github.com/mkdynamic/omniauth-facebook

...