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