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 не имеет смысла.

Другие вопросы по тегам