【问题标题】:Session variable not initialized on callback from OmniAuth OpenID会话变量未在来自 OmniAuth OpenID 的回调中初始化
【发布时间】:2013-10-11 02:19:29
【问题描述】:

我需要允许我的应用程序的用户在他们已经登录后将 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 哈希分配给会话变量,它会删除之前存在的任何会话。例如,如果我在上面的 process_omniauth 块中运行 session[:omniauth] = auth_hash,则此信息在会话中可用于我的应用程序的其他部分,但如果我这样做,user_id 似乎已被遗忘!

有什么想法吗?

【问题讨论】:

标签: ruby-on-rails session omniauth


【解决方案1】:

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

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

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

OmniAuth - current session not loaded on OpenID callback.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多