Ruby on Rails: интеграция Authlogic с Facebook: связывайте учетные записи с пользовательским вводом вместо автоматического использования адреса электронной почты
Я занимаюсь разработкой веб-приложения на Ruby on Rails. Я использую authlogic для аутентификации. Мой сайт имеет свои логины, но я надеюсь также использовать Facebook. Я попробовал authlogic_facebook_connect (используя Facebooker). После большого количества икоты (документы на самом деле не были полностью сохранены), я получил authlogic_facebook_connect для работы, и все в порядке. Поведение "подключения" по умолчанию отлично работает, когда я сталкиваюсь с пользователями, которые никогда ранее не пользовались сайтом, но это приводит к множеству повторных входов в систему для людей, которые используют разные адреса электронной почты для Facebook и для моего сайта. Вот что я хочу:
Когда пользователь нажимает кнопку "Подключиться" на Facebook (и после того, как он проходит через этап авторизации Facebook, нажимая "Разрешить"), я хочу, чтобы всплывающее окно с вопросом, хочет ли он подключиться к уже существующей учетной записи на моем компьютере. сайт или если они хотят иметь автоматически созданную учетную запись для них.
Если они хотят, чтобы он был автоматически сгенерирован для них, у нас все хорошо, и мы действуем как обычно, но если - с другой стороны - они хотят связать свою учетную запись Facebook с учетной записью на моем сайте, я на самом деле хочу, чтобы они вошли в их локальные учетные данные и найти правильный аккаунт. Другими словами, я не хочу, чтобы мое решение автоматически определяло, какая учетная запись выглядит правильно, я хочу, чтобы пользователь сделал это.
Есть ли какой-нибудь гем / плагин / быстрый хак, который позволит мне осуществить это, используя authlogic_facebook_connect или OAuth или что-то еще?
--David
1 ответ
Кто-то другой может указать вам идеальный драгоценный камень для этого, но я могу вам сказать, что я работал над аналогичной проблемой, и было не так уж много работы над нашей собственной, основанной на драгоценном камне oauth2.
Вот набросок кода / потока, который я использую.
1) Пользователь нажимает "Подключиться к Facebook", и вы отправляетесь на подобное действие.
def to_facebook
options = {
:redirect_uri => facebook_callback_url,
:scope => "email,publish_stream" # whatever you want to do
}
client = OAuth2::Client.new(FACEBOOK_API_KEY, FACEBOOK_API_SECRET, :site => FACEBOOK_API_SITE)
redirect_to client.web_server.authorize_url(options)
end
2) Пользователь переходит на Facebook и дает вам все необходимые вам права доступа, затем Facebook вызывает обратный вызов, указанный вами facebook_callback_url
который должен привести вас к такому действию:
def facebook_callback
client = OAuth2::Client.new(FACEBOOK_API_KEY, FACEBOOK_API_SECRET, :site => FACEBOOK_API_SITE)
access_token = client.web_server.get_access_token(params[:code], :redirect_uri => facebook_callback_url)
do_my_custom_user_association(access_token)
end
Затем вы можете указать все, что вы хотите в do_my_custom_user_association
, вы должны иметь current_user
доступно из authlogic, если кто-то вошел в систему, так что вы можете перенаправить в поток, который позволяет вошедшему в систему пользователю выбирать, хотят ли они войти в свою текущую или другую учетную запись. Если текущего пользователя нет, вы можете отправить его в поток создания учетной записи с прикрепленными данными в Facebook.
Обратите внимание, что это всего лишь эскиз, есть ошибки, с которыми нужно справиться (например, параметр facebook_callback будет поражен параметром error_reason
если get_acccess_token
не получается) и я не рекомендую вам делать все взаимодействия oauth2 прямо в вашем контроллере, но основная идея есть.
Посмотрите http://developers.facebook.com/docs/authentication/ если какое-либо из взаимодействий oauth2 не имеет смысла.