Аутентификация пользователя с сервера iOS Rails 3 и Omniauth

В нашем приложении Rails 3 используется facebook-omniauth, что позволяет пользователям проходить аутентификацию с помощью facebook.

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

Суть ответа такова:

omniauth-facebook будет обрабатывать запросы конечной точки обратного вызова с параметром access_token без каких-либо проблем. Легко:)

Итак, чтобы проверить это, в моем браузере я выдаю следующий запрос:

/users/auth/facebook_api/callback?access_token=BAAB...

Но в моем журнале сервера я вижу:

(facebook) Callback phase initiated.
(facebook) Authentication failure! invalid_credentials: OAuth2::Error, : 
{"error":{"message":"Missing authorization code","type":"OAuthException","code":1}}

Я не могу понять, что я делаю неправильно. Является ли тот факт, что я пытаюсь сделать это через браузер, чтобы протестировать что-то? Любые другие идеи о том, как я могу повторно использовать логику auth для www для моего приложения ios?

UPDATE: Я не уверен, но я следую за это руководство, чтобы иметь несколько стратегий омниации facebook, один для www и другой для мобильных устройств.

+5
источник поделиться
1 ответ

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

def facebook_login
  graph = Koala::Facebook::API.new(params[:user][:fb_access_token])
  profile = graph.get_object('me')
  omniauth = build_omniauth_hash(profile)

  @user = User.find_or_create_for_facebook_oauth(omniauth)
end

На www мы уже имели метод под названием find_or_create_for_facebook_oauth, который взял результат от Omniauth и либо нашел пользователя, либо создал новый. Чтобы использовать этот метод для мобильных устройств, мне пришлось создать подобную структуру вручную, чтобы я мог передать ее в качестве аргумента.

def build_omniauth_hash(profile)
  struct = OpenStruct.new
  struct.uid = profile['id']
  struct.info = OpenStruct.new
  struct.info.email = profile['email']
  struct.info.image = "http://graph.facebook.com/#{profile['id']}/picture?type=square"
  struct.info.first_name = profile['first_name']
  struct.info.last_name = profile['last_name']
  struct.info.bio = profile['bio']
  struct.info.hometown = profile['hometown']['name'] if profile['hometown']
  struct.info.location = profile['location']['name'] if profile['location']
  struct
end
+7
источник

Посмотрите другие вопросы по меткам или Задайте вопрос