Передача дополнительных параметров для аутентификации Google - rails - PullRequest
1 голос
/ 25 июля 2011

Как передать дополнительные параметры, такие как openid.ns.pape и openid.pape.max_auth_age, для аутентификации Google с помощью Rack :: OpenID

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

Я просто хочу запустить новый сеанс для аутентификации
Я новичок в рельсах openid
Заранее спасибо.

1 Ответ

1 голос
/ 28 сентября 2011

После долгих поисков я нашел способ передать параметр openid.ns.pape в Rack::OpenID. Решение опубликовано в моем личном блоге .

Я только что сделал патч Monkey для решения этой проблемы. Вот патч

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). Если вы не используете рельсы, я думаю, вам нужно сохранить это и потребовать вручную в вашем проекте.

Теперь вам нужно добавить опцию 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 аутентификацию для нового сеанса

...