【问题标题】:Passing additional parameters for google authentication - rails为 google 身份验证传递附加参数 - rails
【发布时间】:2011-07-25 19:46:16
【问题描述】:

如何通过 Rack::OpenID 传递其他参数,例如 openid.ns.papeopenid.pape.max_auth_age 以进行 Google 身份验证

def new 
  response.headers['WWW-Authenticate'] = Rack::OpenID.build_header(
      :identifier => "https://www.google.com/accounts/o8/id",
      :required => ["http://axschema.org/contact/email"],
      :return_to => accounts_url,
      :method => 'POST')
    head 401
end

我只想强制新会话进行身份验证
我是 Rails openid 的新手
提前致谢。

【问题讨论】:

    标签: ruby-on-rails-3 openid rack google-authentication


    【解决方案1】:

    经过大量谷歌搜索后,我找到了在Rack::OpenID 中传递openid.ns.pape 参数的灵魂。解决方案在我的personal blog 中发布。

    我刚刚做了一个猴子补丁来解决这个问题。这是补丁

    require 'openid/extensions/pape'
    
    module Rack
      class OpenID
    
        private
          def begin_authentication(env, qs)
            req = Rack::Request.new(env)
            params = self.class.parse_header(qs)
            session = env["rack.session"]
    
            unless session
              raise RuntimeError, "Rack::OpenID requires a session"
            end
    
            consumer = ::OpenID::Consumer.new(session, @store)
            identifier = params['identifier'] || params['identity']
            immediate = params['immediate'] == 'true'
    
            begin
              oidreq = consumer.begin(identifier)
              add_simple_registration_fields(oidreq, params)
    
               unless params['pape'].nil?
                add_pape(oidreq,params['pape'])
              end
    
              add_attribute_exchange_fields(oidreq, params)
              add_oauth_fields(oidreq, params)
              url = open_id_redirect_url(req, oidreq, params["trust_root"], params["return_to"], params["method"], immediate)
              return redirect_to(url)
            rescue ::OpenID::OpenIDError, Timeout::Error => e
              env[RESPONSE] = MissingResponse.new
              return @app.call(env)
            end
          end
    
    
         def add_pape(oidreq,max_auth_age)
            papereq = ::OpenID::PAPE::Request.new
            papereq.add_policy_uri(::OpenID::PAPE::AUTH_PHISHING_RESISTANT)
            papereq.max_auth_age = max_auth_age
            oidreq.add_extension(papereq)
            oidreq.return_to_args['did_pape'] = 'y'
        end
      end
    end
    

    因为我在 Rails 应用程序中需要它,所以我将上面的代码保存在初始化程序 (config/initializers/rack_openid_patch.rb) 文件夹中。如果您不使用rails,我认为您需要保存它并在您的项目中手动要求。

    现在您需要将 pape 选项添加到 Rack::OpenID.build_header

    max_auth_age = 0
    response.headers['WWW-Authenticate'] = Rack::OpenID.build_header(
          :identifier => "https://www.google.com/accounts/o8/id",
          :required => ["http://axschema.org/contact/email"],
          :return_to => accounts_url,
          :pape => max_auth_age,
          :method => 'POST')
    head 401
    

    确保您设置 max_auth_age = 0,以强制对新会话进行 google 身份验证

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 2016-10-12
      • 1970-01-01
      相关资源
      最近更新 更多