在开始使用Omniauth进行身份验证之前,如何在会话中捕获引用URL?

时间:2018-02-13 17:34:04

标签: ruby-on-rails session rubygems ruby-on-rails-5 omniauth

我正在使用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标头。我希望在用户点击链接但在验证序列开始之前记录此信息。我该怎么做?

1 个答案:

答案 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

更改配置代码后,您可能需要重新启动应用程序服务器。

使用设计

  1. 如果您还没有覆盖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' }
    
  2. 在刚刚创建的新控制器中添加before_filter。默认情况下,/ auth /:provider端点使用passthrough方法。

    prepend_before_action :store_referrer, only: [:passthrough] 
    
  3. 将引荐来源存储在会话中。这是必要的,因为您尚未对用户进行身份验证

    session[:preauth_referrer] = request.referrer
    
  4. 因此完整的控制器看起来如下所示:

    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) %>