Faraday: ADVERTENCIA: `Faraday :: Connection # basic_auth` está obsoleto

Creado en 31 ago. 2021  ·  9Comentarios  ·  Fuente: lostisland/faraday

Información básica

  • Versión de Faraday: 1.7.1
  • Versión Ruby: 3.0.2

Descripcion del problema

Vio la advertencia de obsolescencia, el código actualizado para que coincida con las instrucciones de autenticación básicas documentadas . El código documentado arroja una serie de errores de argumentos.

No estoy seguro de si los documentos son incorrectos o si se trata de un problema con la gema.

pasos para reproducir

http = Faraday.new do |conn|
  conn.request(:authorization, :basic, 'username', 'password')
end

http.post("https://example.com")
ArgumentError: wrong number of arguments (given 4, expected 3)
from /Users/mscoutermarsh/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/faraday-1.7.1/lib/faraday/request/authorization.rb:43:in `initialize'

Todos 9 comentarios

Los documentos están equivocados :) Acabo de abrir un PR para solucionarlo.

Mientras tanto, debes usarlo así:

http = Faraday.new do |conn|
  conn.request(:basic_auth, 'username', 'password')
end

¡Hola! El contexto para el sitio web de documentación que no rima con el mensaje de desaprobación 1.x es: "todos los documentos del sitio web son el próximo 2.0". Esa versión donde se elimina la forma antigua.

El contexto solo se menciona en el README; esta es una debilidad con la que nos encantaría obtener ayuda concreta en el frente del sitio web.

Enlace a esa parte:

https://github.com/lostisland/faraday#attention

@peterberkenbosch es correcto, esa es la forma correcta de usar el middleware en Faraday 1.x, mientras que la documentación muestra el uso correcto para la próxima v2.0.

Lamento la confusión, esta no es la primera vez que se plantea un problema como este. Buscaré una solución rápida para aclarar las cosas.

¡Gracias! Todo bien ahora. ❤️

Hola @iMacTia ,

Todavía tengo problemas con este tema.
Estoy usando Faraday 1.7.1 y Ruby 2.7.2.

Originalmente creé una conexión como esta

client = Faraday.new(url: url) do |faraday|
    faraday.headers["Accept"] = "application/json"
    faraday.headers["X-Version"] = "2"
    faraday.headers["Authorization"] = "token #{token}"
    faraday.request(:json)
    faraday.response(:json, content_type: /\bjson$/)
    faraday.adapter(Faraday.default_adapter)
  end

Según la charla anterior, supongo que si cambio para usar faraday.request (: token_auth, token), debería ayudar a agregar encabezado en la solicitud, así que cambié a

client = Faraday.new(url: url) do |faraday|
    faraday.headers["Accept"] = "application/json"
    faraday.headers["X-Version"] = "2"
    faraday.request(:token_auth, token)
    faraday.request(:json)
    faraday.response(:json, content_type: /\bjson$/)
    faraday.adapter(Faraday.default_adapter)
end

El cliente anterior se usa de esta manera y obtuve el error "errors"=>["Authentication Required"]

client.get(path, {"sort"=>"created_at", "direction"=>"desc", "per_page"=>100})

También depuré el código y, de alguna manera, el middleware no tuvo efecto en la solicitud y no hay Authorization en el encabezado, aquí hay un volcado de objeto de solicitud

#<struct Faraday::Request http_method=:get, path="hide/the/path", params={"sort"=>"created_at", "direction"=>"desc", "per_page"=>100}, headers={"Accept"=>"application/json;", "X-Version"=>"2", "User-Agent"=>"Faraday v1.7.1"}, body=nil, options=#<Faraday::RequestOptions (empty)>>

¿Lo usé de manera incorrecta o debería crear un nuevo error?

Por cierto, ¿cuál es la diferencia entre faraday.headers["Authorization"] = "token #{token}" y faraday.request(:token_auth, token) ? Basado en mi conocimiento de ruby ​​novato y leyendo el código fuente, token_auth está tratando de establecer el encabezado, que es equivalente a faraday.headers[]= . Luego, en el documento, ¿por qué recomendamos usar middleware en lugar de establecer directamente el encabezado?

Hola @xiaoxipang , hay muchas buenas preguntas, déjame ver si puedo responderlas todas.

¿Lo usé de manera incorrecta o debería crear un nuevo error?

Lo usó correctamente, pero sospecho que la salida del middleware no es exactamente la que espera el servidor.
Esta "autenticación de token" parece un estándar bastante antiguo que ya no se usa y ha sido reemplazado por token de portador y otros mecanismos. La salida del encabezado en su ejemplo sería Authorization: Token token=token , tenga en cuenta el prefijo token= , que sospecho que su servidor no está esperando. Para solucionarlo, puede hacer lo siguiente:

client = Faraday.new(url: url) do |faraday|
    # This header is not necessary, it will be set by the json middleware
    # faraday.headers["Accept"] = "application/json"
    faraday.headers["X-Version"] = "2"
    faraday.request(:authorization, 'Token', token)
    faraday.request(:json)
    faraday.response(:json, content_type: /\bjson$/)
    faraday.adapter(Faraday.default_adapter)
end

Esto establecerá el encabezado correctamente en Authorization: Token token (sin prefijo).
¡Pruébelo y avíseme si funciona!

También depuré el código y, de alguna manera, el middleware no tuvo efecto en la solicitud y no hay autorización en el encabezado, aquí hay un volcado de objeto de solicitud

Eso es extraño, acabo de probar el código anterior y funciona como se esperaba para mí. Al ver el struct Faraday::Request en la depuración, sospecho que podría estar mirando el objeto demasiado pronto, antes de que el middleware establezca el encabezado.
Si ejecuta una solicitud y verifica la respuesta, definitivamente debería verla allí:

client.get('https://google.co.uk')
 => #<Faraday::Response:0x00007fdd01ad1340
  @on_complete_callbacks=[],
  @env=#<Faraday::Env
    @method=:get
    @url=#<URI::HTTPS https://google.co.uk/>
    @request=#<Faraday::RequestOptions (empty)>
    @request_headers={"X-Version"=>"2", "User-Agent"=>"Faraday v1.7.1", "Authorization"=>"Token token"}
    ...

U otra forma es agregar el middleware faraday.response :logger JUSTO ANTES de su adaptador, de esta manera registrará la solicitud después de que todo el middleware haya entrado en vigor y definitivamente debería verlo.

Por cierto, ¿cuál es la diferencia entre faraday.headers ["Authorization"] = "token # {token}" y faraday.request (: token_auth, token)? Basado en mi conocimiento de ruby ​​novato y leyendo el código fuente, token_auth está tratando de establecer el encabezado, que es equivalente a faraday.headers [] =. Luego, en el documento, ¿por qué recomendamos usar middleware en lugar de establecer directamente el encabezado?

La razón principal de esa sugerencia es que el middleware generalmente proporciona una mayor funcionalidad.
Por ejemplo, el middleware token_auth permite configurar las propiedades del token y formatearlas automáticamente:

faraday.request(:token_auth, 'token', {prop1: value1, prop2: value2})
# This produces `Authorization: Token token=token prop1=value1 prop2=value2

De manera similar, el middleware basic_auth realiza automáticamente una codificación Base64 de su par de usuario / contraseña.

Estoy de acuerdo en que el middleware faraday.request(:authorization, 'Token', token) anterior no hace mucho más que configurar manualmente el encabezado, pero por ejemplo en Faraday v2 ese middleware acepta un lambda / proc para el argumento token y lo resuelve automáticamente en cada uno solicitud. Eso le permite tener una clase TokenStorage y cambiar dinámicamente el token entre diferentes solicitudes. Con el otro enfoque, necesitaría inyectar manualmente el encabezado en cada solicitud o volver a crear la conexión cada vez.

Espero que esto responda a tu pregunta, pero en resumen, eres bueno para usar ambos métodos, así que usa el que más te guste 😄

@iMacTia ¡ Muchas gracias por la ayuda y la explicación detallada!

¡Pruébelo y avíseme si funciona!

faraday.request(:authorization, "token", token) me funciona.

U otra forma es agregar faraday.response: logger middleware JUSTO ANTES de su adaptador, de esta manera registrará el
request después de que todo el middleware haya entrado en vigor y definitivamente debería verlo.

Es muy bueno saber cómo depurar a partir de ahora. Y al usar eso, está completamente en lo correcto:
Cuando se usa faraday.request(:authorization, "token", token) , el encabezado es Authorization: "token token_value"
Cuando se usa faraday.request(:token_auth, token) , el encabezado es Authorization: "Token token=\"token_value\""

Eso es extraño, acabo de probar el código anterior y funciona como se esperaba para mí. Al ver la estructura Faraday :: Request en la depuración, sospecho que podría estar mirando el objeto demasiado pronto, antes de que el middleware establezca el encabezado.

Bien, puse un punto de interrupción en connection#run_request y, en ese momento, no se ha llamado al middleware. Agregué un nuevo punto de interrupción en Faraday :: Solicitud :: Autorización y ahora puedo ver cómo funciona.

Espero que esto responda a tu pregunta, pero en resumen, eres bueno para usar ambos métodos, así que usa el que más te guste.

¡Sí y gracias de nuevo!

Sin embargo, ¿cómo deshacerse de la advertencia de desaprobación por ahora?

      builder.request :basic_auth, <strong i="6">@client_id</strong>, <strong i="7">@client_secret</strong>

todavía me genera la advertencia en 1.7.1 y, como mencionó @mscoutermarsh , la nueva sintaxis aún no está disponible.

@paukul

http = Faraday.new do |conn|
  conn.request(:basic_auth, 'username', 'password')
end

Nos lo arregló. Tiene el mismo aspecto que el tuyo, no estoy seguro de por qué te sigue dando la advertencia.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

asf-stripe picture asf-stripe  ·  3Comentarios

t3hk0d3 picture t3hk0d3  ·  3Comentarios

mattmill30 picture mattmill30  ·  4Comentarios

jordansissel picture jordansissel  ·  5Comentarios

QuinnWilton picture QuinnWilton  ·  4Comentarios