我需要允许我的应用程序的用户在他们已经登录后将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
似乎已被遗忘这!
有什么想法吗?
答案 0 :(得分:2)
我遇到了同样的问题。发现的是,当OmniAuth给我回电话时,session
和request.env['rack.session']
都是空的,但request.env['action_dispatch.request.unsigned_session_cookie']
包含所有会话密钥。
我还没弄清楚为什么会出现差异。
最终我在这里找到了答案: