Пустая сессия после Omniauth Twitter Callback - PullRequest
1 голос
/ 16 апреля 2011

Я пытаюсь создать приложение, использующее гем OmniAuth, чтобы пользователи Twitter могли войти в систему.

Я следовал инструкциям в уроках, и я почти уверен, что все сделал правильно.

Но при обратном вызове из Twitter я получаю это печально известное сообщение об ошибке:

NoMethodError
You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]

После более глубокого изучения драгоценного камня omniauth я выяснил, что в OAuth#callback_phase сеанс не содержит никакой информации о oauth

def callback_phase
    ::Rails.logger.info "session: #{session.inspect}"
    ::Rails.logger.info "consumer: #{consumer.inspect}"
    request_token = ::OAuth::RequestToken.new(consumer, session['oauth'][name.to_s].delete('request_token'), session['oauth'][name.to_s].delete('request_secret'))
    ...
end

Журнал после обратного вызова

session: {"session_id"=>"190523311f7a63fe796558691b1d4fff"}
consumer: #<OAuth::Consumer:0x103735b50 @secret="...", @http=#<Net::HTTP api.twitter.com:443 open=false>, @key="...", @options={:access_token_path=>"/oauth/access_token", :proxy=>nil, :http_method=>:post, :site=>"https://api.twitter.com", :request_token_path=>"/oauth/request_token", :scheme=>:header, :oauth_version=>"1.0", :signature_method=>"HMAC-SHA1", :authorize_path=>"/oauth/authenticate"}>

Похоже, что содержимое сеанса не заполнено или теряется на пути от твиттера к omniauth.

У кого-нибудь есть идеи, что может вызвать поведение?

Мой Gemfile:

gem 'mongrel', '1.2.0.pre2'
gem "rails", "~> 3.0.6"
gem "mysql"
gem 'omniauth'
gem 'settingslogic' # config/application.yml
gem 'will_paginate', '~> 3.0.beta'

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 24 мая 2011

В моем session_store.rb у меня было что-то вроде этого:

# Be sure to restart your server when you modify this file.
PersonalAccount::Application.config.session_store :cookie_store, :key => '_app_session', :secure => true

Но в моей среде разработки я не использовал SSL, поэтому OmniAuth не смог сохранить свой сеанс.

Удаление:secure => true решил мою проблему.

...