【问题标题】:How do I catch the referer URL in my session before embarking on an authentication with Omniauth?在开始使用 Omniauth 进行身份验证之前,如何在会话中捕获引用 URL?
【发布时间】:2018-02-13 17:34:03
【问题描述】:

我正在使用 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 标头。我想在用户单击链接但在身份验证序列开始之前记录这一点。我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    我认为你最好的选择是做几件事:

    没有设计

    我会为您的策略添加一个将在设置阶段运行的块。您需要将此添加到要配置的每个策略中。

    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
      

    所以完整的控制器如下所示:

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

    【讨论】:

    • 嗨,其实我没有使用 Devise。我编辑了我的问题以反映 htis。
    • 更新了我的答案以处理非设计用例。让我知道这是否有帮助。
    • 感谢您的更新。我当时不在城里,但现在当我尝试实现这个问题时,我应该把你列出的设置方法的代码(文件路径)放在哪里?
    • 您可以创建一个初始化程序(例如 config/initializers/omniauth.rb)并按照此处的配置说明进行操作:github.com/omniauth/omniauth。您可能需要使用完整的配置参考,而不仅仅是“使用”:Rails.application.config.middleware.use
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多