¿Cómo puedo persistentemente sobrescribir un atributo inicializado por Barras :: Builder?

StackOverflow https://stackoverflow.com/questions/4112718

  •  29-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de utilizar OmniAuth para manejar el flujo de OAuth para un pequeño-montarse Sinatra aplicación. Puedo conseguir 37signals Oauth al trabajo a la perfección, sin embargo yo estoy tratando de crear una estrategia para Freshbooks Oauth también.

Desafortunadamente Freshbooks requieren solicitudes de OAuth para ir a un subdominio específico del usuario. Estoy adquiriendo el subdominio como una entrada y entonces necesitará utilizar persistentemente la URL del sitio específico del cliente para todas las solicitudes.

Esto es lo que he probado hasta ahora. El problema es que el nuevo valor del sitio no persiste más allá de la primera solicitud.

Hay que ser una forma sencilla de lograr esto, pero estoy confundido.

  #Here's the setup -
  def initialize(app, consumer_key, consumer_secret, subdomain='api')
    super(app, :freshbooks, consumer_key, consumer_secret,
               :site               => "https://"+subdomain+".freshbooks.com", 
               :signature_method   => 'PLAINTEXT',
               :request_token_path => "/oauth/oauth_request.php",
               :access_token_path  => "/oauth/oauth_access.php",
               :authorize_path     => "/oauth/oauth_authorize.php"
          )
  end


  def request_phase
    #Here's the overwrite -
    consumer.options[:site] = "https://"+request.env["rack.request.form_hash"]["subdomain"]+".freshbooks.com"
    request_token = consumer.get_request_token(:oauth_callback => callback_url)
    (session[:oauth]||={})[name.to_sym] = {:callback_confirmed => request_token.callback_confirmed?, 
                                           :request_token => request_token.token, 
                                           :request_secret => request_token.secret}
    r = Rack::Response.new
    r.redirect request_token.authorize_url
    r.finish
  end
¿Fue útil?

Solución

Ok, aquí está un resumen de lo que he hecho para cualquier persona que viene a través de esta vía Google.

I no resolvió el problema en el camino pregunté que, en lugar Empujé el subdominio en la sesión y luego la sobrescribe cada vez que las necesidades de valor sitio para ser utilizados.

Aquí está el código:

  #Monkeypatching to inject user subdomain
  def request_phase
    #Subdomain is expected to be submitted as <input name="subdomain">
    session[:subdomain] = request.env["rack.request.form_hash"]["subdomain"]
    consumer.options[:site] = "https://"+session[:subdomain]+".freshbooks.com"
    super 
  end

  #Monkeypatching to inject subdomain again
  def callback_phase
    consumer.options[:site] = "https://"+session[:subdomain]+".freshbooks.com"
    super
  end

Tenga en cuenta que todavía tiene que establecer algo como el sitio cuando se ha inicializado, de lo contrario se producirán errores debido a OAuth no usar SSL para hacer las solicitudes.

Si desea ver el código real que estoy usando es en: https://github.com/joeharris76 / OmniAuth voy a empujar el tenedor hasta el proyecto principal una vez que la batalla hemos probado esta solución un poco más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top