Методы Фарадея :: RackBuilder - PullRequest
       15

Методы Фарадея :: RackBuilder

0 голосов
/ 11 января 2019

Чтобы использовать пользовательское промежуточное ПО из документов Фарадея, я вижу, что мне нужно использовать метод use. В моем случае мой пользовательский конструктор просто добавляет токен jwt auth в заголовок:

Faraday.new(url: wsconfig.base_url) do |builder|
  builder.use CustomMiddlewares::JwtAuthentication
  builder.request :url_encoded
  builder.response :json
  builder.adapter :net_http
end

jwt_authentication.rb

require 'jwt'

module CustomMiddlewares
  class JwtAuthentication < Faraday::Middleware
    def call(env)
      payload = RequestStore.store[:jwt_claims].to_h.merge({method: env.method, path: env.url.request_uri})
      token = jwt(payload)
      Rails.logger.debug { "      with token: #{token}" }
      env[:request_headers]["Authorization"] = "Token: #{token}"
      @app.call(env)
    rescue StandardError => e
      raise "problem in JwtAuthentication Middleware"
    end

    private

    def jwt(payload, expiration = 1.minute.from_now)
      payload = payload.dup
      payload['exp'] = expiration.to_i
      payload['iss'] = 'cgp'
      JWT.encode(payload, key, 'RS256')
    end

    def key
      OpenSSL::PKey::RSA.new(Rails.configuration.x.secrets.ws_config.jwt_private_key)
    end

  end
end

CustomMiddlewares::JwtAuthentication следует использовать только на этапе запроса, например url_encoded middleware, который добавляется методом request. Интересно, почему я не могу сделать то же самое с моим:

builder.request CustomMiddlewares::JwtAuthentication

Я получил:

CustomMiddlewares::VerbosingPseudonymizationWs is not registered on Faraday::Request (Faraday::Error)

1 Ответ

0 голосов
/ 11 января 2019

Если вы хотите использовать builder.request, вам сначала нужно зарегистрировать промежуточное программное обеспечение следующим образом:

Faraday::Request.register_middleware jwt: -> { CustomMiddlewares::JwtAuthentication }

После этого вы сможете звонить builder.request :jwt. Это связано с тем, что Faraday::RackBuilder#request фактически вызывает Faraday::RackBuilder#use с Faraday::Request.lookup_middleware(key) в качестве первого параметра.

См. https://github.com/lostisland/faraday/blob/master/lib/faraday/rack_builder.rb#L92 и https://github.com/lostisland/faraday/blob/master/lib/faraday/rack_builder.rb#L228

Это также означает, что нет никакой разницы между builder.request :jwt и builder.use CustomMiddlewares::JwtAuthentication. Разница между запросом и промежуточным программным обеспечением ответа заключается в том, что промежуточное программное обеспечение ответа должно наследоваться от Faraday::Response::Middleware, что обеспечивает выполнение только ответа (on_complete). См https://github.com/lostisland/faraday/blob/master/lib/faraday/response.rb#L8

То есть, даже при регистрации промежуточного программного обеспечения через builder.request он все равно может воздействовать на ответ, если реализует обратный вызов on_complete. И наоборот, вы не выполняете никакого кода для ответа, если не реализуете обратный вызов.

...