我正在使用Rails 5.我使用Omniauth gem(但不是Devise)对以下站点进行身份验证(来自我的Gemfile)...
gem 'omniauth-oauth2', '~> 1.3.1'
gem 'omniauth-google-oauth2'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-linkedin-oauth2'
我的网页上的链接看起来像
<%= link_to image_tag("google_plus_icon.jpg", :height => 50, :border => 0, :alt => 'Google', :title => 'Google', :class => 'loginImg'), '/auth/google' %>
我的问题是,在身份验证序列开始于外部服务之前,我想在会话中捕获HTTP Referer标头。我希望在用户点击链接但在验证序列开始之前记录此信息。我该怎么做?
答案 0 :(得分:0)
我认为你最好的选择是做一些事情:
没有设计
我会添加一个块,该块将在策略的设置阶段运行。您需要将此添加到您要配置的每个策略中。
https://github.com/omniauth/omniauth/wiki/Setup-Phase
SETUP_PROC = lambda do |env|
request = Rack::Request.new(env)
session = request.env['rack.session']
session[:preauth_referrer] ||= request.referrer
end
use OmniAuth::Builder.new do
provider :google, :setup => SETUP_PROC
end
更改配置代码后,您可能需要重新启动应用程序服务器。
使用设计
如果您还没有覆盖OmniauthCallbacksController
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
end
# Then in routes.rb, as detailed at https://github.com/plataformatec/devise/wiki/omniauth:-overview
devise_for :users, controllers: { omniauth_callbacks: 'omniauth_callbacks' }
在刚刚创建的新控制器中添加before_filter。默认情况下,/ auth /:provider端点使用passthrough方法。
prepend_before_action :store_referrer, only: [:passthrough]
将引荐来源存储在会话中。这是必要的,因为您尚未对用户进行身份验证
session[:preauth_referrer] = request.referrer
因此完整的控制器看起来如下所示:
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
prepend_before_filter :store_referrer, only: [:passthrough]
# Other overrides go here, for example overriding the callback methods
private
def store_referrer
session[:preauth_referrer] = request.referrer
end
end
然后,当用户从身份验证重定向返回时,您可以根据需要将引用者与持久存储中的用户相关联。
作为脚注,我建议使用rails route url helpers而不是直接引用路径,所以像这样:
<%= link_to image_tag("google_plus_icon.jpg", :height => 50, :border => 0, :alt => 'Google', :title => 'Google', :class => 'loginImg'), user_omniauth_authorize_path(provider: :google) %>