1

我正在使用 Omniauth 来验证我的 JSON API。

提交到 /auth/identity/register 后,我想返回结果而不重定向用户。如何才能做到这一点?

为了允许 OmniAuth::Strategies::Identity.registration_phase 接受 JSON 数据,我通过将第一行替换为以下内容来修补它:

    if !env["rack.input"].nil?
      attributes = JSON.parse(request.env["rack.input"].read)
    else
      attributes = (options[:fields] + [:password, :password_confirmation]).inject({}){|h,k| h[k] = request[k.to_s]; h}
    end

这工作正常,在失败的情况下,我设置 on_failed_registration 来处理它 - 但在成功的情况下,我只想返回 200 的结果而不是重定向。

我试图按照以下方式对 OmniAuth::Strategies::Identity.callback_phase 进行monkeypatch,但没有成功(即使它正在打印我的puts,它仍然会重定向):

  def callback_phase
    binding.pry
    return fail!(:invalid_credentials) unless identity
    if !env["action_dispatch.request.content_type"].to_s.match(/json/).nil?
      puts 'Not redirecting because this is JSON.'
      return
    else
      super
    end
  end
4

1 回答 1

0

shioyama - 我希望这对你有帮助,这就是我正在做的事情。

module OmniAuth
  module Strategies
    # The identity strategy allows you to provide simple internal
    # user authentication using the same process flow that you
    # use for external OmniAuth providers.
    class Identity

      def registration_phase
        if env['CONTENT_TYPE'].match(/x-www-form/).nil?
          attributes = JSON.parse(request.env["rack.input"].read)
        else
          attributes = (options[:fields] + [:password, :password_confirmation]).inject({}){|h,k| h[k] = request[k.to_s]; h}
        end
        @identity = model.create(attributes)
        if @identity.persisted?
          env['PATH_INFO'] = callback_path
          callback_phase
        else
          if options[:on_failed_registration]
            self.env['omniauth.identity'] = @identity
            options[:on_failed_registration].call(self.env)
          else
            registration_form
          end
        end
      end
    end
  end
end
于 2013-09-21T12:35:19.177 回答