Ruby on Rails: интеграция Authlogic с Facebook: связывайте учетные записи с пользовательским вводом вместо автоматического использования адреса электронной почты - PullRequest
3 голосов
/ 22 декабря 2010

Я занимаюсь разработкой веб-приложения на Ruby on Rails.Я использую authlogic для аутентификации.У моего сайта есть свои логины, но я надеюсь также использовать Facebook.Я попробовал authlogic_facebook_connect (используя Facebooker).После большого количества икоты (документы на самом деле не были полностью сохранены), я получил authlogic_facebook_connect для работы, и все в порядке.Поведение «подключения» по умолчанию отлично работает, когда я сталкиваюсь с пользователями, которые никогда ранее не пользовались сайтом, но это приводит к множеству повторяющихся входов в систему для людей, которые используют разные адреса электронной почты для Facebook и для моего сайта.Вот что я хочу:

Когда пользователь нажимает кнопку «Подключиться» в Facebook (и после того, как он проходит через этап авторизации Facebook, нажимая «Разрешить»), я хочу, чтобы всплывающее окно спрашивало пользователя, если онихотите подключиться к уже существующей учетной записи на моем сайте или если они хотят автоматически создать учетную запись для них.

Если они хотят, чтобы он был автоматически сгенерирован для них, у нас все хорошо, и мы действуем как обычно, но если - с другой стороны - они хотят связать свою учетную запись Facebook с учетной записью на моем сайте, яна самом деле хотят, чтобы они вводили свои локальные учетные данные и находили правильную учетную запись.Другими словами, я не хочу, чтобы мое решение автоматически выясняло, какая учетная запись выглядит правильно, я хочу, чтобы пользователь сделал это.

Есть ли какой-нибудь гем / плагин / быстрый хак, который позволил бы мне осуществить это, используя authlogic_facebook_connect или OAuth или что-то еще?

- Дэвид

1 Ответ

3 голосов
/ 22 декабря 2010

Кто-то еще может указать вам идеальный камень для этого, но я могу вам сказать, что я работал над аналогичной проблемой, и было не так уж много работы, чтобы развернуть нашу собственную, основанную на геме 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 не имеет смысла.

...