2

我需要允许我的应用程序的用户在他们已经登录后将 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如果我这样做,似乎已经忘记了!

有任何想法吗?

4

1 回答 1

2

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

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

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

OmniAuth - 当前会话未在 OpenID 回调上加载

于 2013-10-10T18:19:29.713 回答