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