会话变量未在OmniAuth OpenID的回调中初始化

时间:2012-11-22 21:50:49

标签: ruby-on-rails session omniauth

我需要允许我的应用程序的用户在他们已经登录后将OpenID与他们的帐户相关联。

在我推迟到OmniAuth之前访问的最后一个控制器中,我将用户ID设置为会话。相关代码是:

class UsersController < ApplicationController
  def confirm
    session[:user_id] = @user.id
  end
end

然后,用户会链接到/auth/openid。这按预期工作。这是OmniAuth初始化程序:

require 'openid/store/filesystem'
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :open_id, :store => OpenID::Store::Filesystem.new('/tmp'), :name => 'openid'
end

当用户从OpenID返回时,我将它们路由到会话控制器,就像这样(在routes.rb中):

match 'auth/:provider/callback', to: 'sessions#process_omniauth'

以下是sessions_controller.rb中的相关代码:

class SessionsController < ApplicationController
  def process_omniauth
    auth_hash = request.env['omniauth.auth']
    puts "SESSION: #{session}"
    # ...
  end
end

奇怪的是,session变量似乎没有使用前一个控制器的user_id进行初始化。

如果我在我的应用程序中转到其他页面,则user_id会按预期进行会话。

但是,如果我尝试将OmniAuth散列分配给会话变量,它会删除之前的会话。例如,如果我在上面的session[:omniauth] = auth_hash块中运行process_omniauth,则会在我的应用程序的其他部分的会话中提供此信息,但如果我这样做,user_id似乎已被遗忘这!

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。发现的是,当OmniAuth给我回电话时,sessionrequest.env['rack.session']都是空的,但request.env['action_dispatch.request.unsigned_session_cookie']包含所有会话密钥。

我还没弄清楚为什么会出现差异。

最终我在这里找到了答案:

OmniAuth - current session not loaded on OpenID callback