【发布时间】: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 似乎已被遗忘!
有什么想法吗?
【问题讨论】:
-
@BrianMorearty - 如果您想将解决方案概括为您自己的答案,我将删除我的答案。 (请参阅meta.stackexchange.com/questions/90263/… 详细说明为什么这会有所帮助。)谢谢!
-
@DreadPirateShawn 谢谢。我已将评论移至答案部分。
标签: ruby-on-rails session omniauth