Rails 3 - Zaloguj się do innej witryny i zachowuj plik cookie w sesji
Przygotowuję małą aplikację, która pozwoli użytkownikowi zalogować się do pół-popularnego serwisu społecznościowego, który nie ma wystarczającego API, więc używam gemu mechanizującego do zautomatyzowania kilku funkcji, które chciałem dodać nikogo do korzystania, na przykład wiadomości masowe.
Ze względu na ograniczenia API jestem zmuszony to zrobić, udając, że jestem użytkownikiem interakcji z interfejsem http witryny.
Mam problem, gdy użytkownik zaloguje się do mojej witryny, jak mogę zachować plik cookie z witryny społecznościowej w sesji, aby nie musieli wprowadzać poświadczeń przy każdym załadowaniu strony?
Próbowałem zebrać plik cookie z instancji mechanizującej, ale otrzymałem błędy dotyczące mutexów bez metody Marshal.
EDIT - rozwiązany
Okazało się być dość proste, ale dokumentacja na pewno nie pomogła w tej sprawie, tylko z powodu niekompletności.
Oto, co zrobiłem, aby złapać pliki cookie i przywrócić je do przyszłych żądań (wiele między kodowaniem i sprawdzaniem błędów wykluczonych ze względu na zwięzłość):
users_controller.rb
def create
session.delete(:agent) if session[:agent]
agent = Mechanize.new
page = agent.get('www.socialnetwork.com/login')
login_form = page.form
login_form.email = params[:login][:email]
login_form.password = params[:login][:password]
page = agent.submit(login_form, login_form.buttons.first)
cookies = agent.cookie_jar.store.map {|i| i}
session[:agent] = Marshal.dump cookies
redirect_to root_path
end
application_controller.rb
before_filter :set_agent
def set_agent
if session[:agent]
@agent = Mechanize.new
cookies = Marshal.load session[:agent]
cookies.each {|i| @agent.cookie_jar.store.add i}
end
end