Faraday: κ²½κ³ : `Faraday::Connection#basic_auth`λŠ” 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2021λ…„ 08μ›” 31일  Β·  9μ½”λ©˜νŠΈ  Β·  좜처: lostisland/faraday

κΈ°λ³Έ 정보

  • 패러데이 버전: 1.7.1
  • 루비 버전: 3.0.2

문제 μ„€λͺ…

μ‚¬μš© 쀑단 κ²½κ³ λ₯Ό ν™•μΈν•˜κ³  λ¬Έμ„œν™”λœ κΈ°λ³Έ 인증 지침 κ³Ό μΌμΉ˜ν•˜λ„λ‘ μ½”λ“œλ₯Ό μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. λ¬Έμ„œν™”λœ μ½”λ“œμ—μ„œ μ—¬λŸ¬ 인수 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ¬Έμ„œκ°€ 잘λͺ»λ˜μ—ˆκ±°λ‚˜ 보석에 λ¬Έμ œκ°€ μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μž¬ν˜„ 단계

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'

λͺ¨λ“  9 λŒ“κΈ€

λ¬Έμ„œκ°€ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€ :) 방금 PR을 μ—΄μ–΄ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έλ™μ•ˆ λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

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

μ—¬λ³΄μ„Έμš”! 1.x 지원 쀑단 λ©”μ‹œμ§€μ™€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” λ¬Έμ„œ μ›Ή μ‚¬μ΄νŠΈμ˜ μ»¨ν…μŠ€νŠΈλŠ” "λͺ¨λ“  μ›Ή μ‚¬μ΄νŠΈ λ¬Έμ„œλŠ” 곧 μΆœμ‹œλ  2.0μž…λ‹ˆλ‹€."μž…λ‹ˆλ‹€. κΈ°μ‘΄ 방식이 제거된 λ²„μ „μž…λ‹ˆλ‹€.

μ»¨ν…μŠ€νŠΈλŠ” READMEμ—μ„œλ§Œ μ–ΈκΈ‰λ©λ‹ˆλ‹€. 이것은 μ›Ήμ‚¬μ΄νŠΈ μ „λ©΄μ—μ„œ ꡬ체적인 도움을 λ°›κ³  싢은 μ•½μ μž…λ‹ˆλ‹€.

ν•΄λ‹Ή 뢀뢄에 λŒ€ν•œ 링크:

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

@peterberkenbosch κ°€ μ •ν™•ν•©λ‹ˆλ‹€. Faraday 1.xμ—μ„œ 미듀웨어λ₯Ό μ‚¬μš©ν•˜λŠ” μ˜¬λ°”λ₯Έ 방법이며 λ¬Έμ„œμ—λŠ” λ‹€κ°€μ˜€λŠ” v2.0에 λŒ€ν•œ μ˜¬λ°”λ₯Έ μ‚¬μš©λ²•μ΄ λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€.

ν˜Όλž€μ„ λ“œλ € μ£„μ†‘ν•©λ‹ˆλ‹€. 이와 같은 λ¬Έμ œκ°€ 제기된 것은 이번이 처음이 μ•„λ‹™λ‹ˆλ‹€. 상황을 더 λͺ…ν™•ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ λΉ λ₯Έ μ†”λ£¨μ…˜μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€! 이제 λͺ¨λ“  것이 μ’‹μŠ΅λ‹ˆλ‹€. ❀️

μ•ˆλ…•ν•˜μ„Έμš” @iMacTia ,

이 λ¬Έμ œμ— μ—¬μ „νžˆ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
μ €λŠ” 패러데이 1.7.1κ³Ό 루비 2.7.2λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μ›λž˜ 이런 연결을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

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

μœ„μ˜ 이야기λ₯Ό λ°”νƒ•μœΌλ‘œ faraday.request(:token_auth, token)λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ „ν™˜ν•˜λ©΄ μš”μ²­μ— 헀더λ₯Ό μΆ”κ°€ν•˜λŠ” 데 도움이 될 κ²ƒμ΄λ―€λ‘œ λ‹€μŒμœΌλ‘œ μ „ν™˜ν–ˆμŠ΅λ‹ˆλ‹€.

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

μœ„μ˜ ν΄λΌμ΄μ–ΈνŠΈλŠ” 이런 μ‹μœΌλ‘œ μ‚¬μš©λ˜λ©° "errors"=>["Authentication Required"] 였λ₯˜κ°€ λ°œμƒ

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

λ˜ν•œ μ½”λ“œλ₯Ό λ””λ²„κΉ…ν–ˆλŠ”λ° μ–΄λ–»κ²Œ λ“  미듀웨어가 μš”μ²­μ— μ μš©λ˜μ§€ μ•Šμ•˜κ³  헀더에 Authorization κ°€ μ—†μŠ΅λ‹ˆλ‹€. 여기에 ν•˜λ‚˜μ˜ μš”μ²­ 개체 덀프가 μžˆμŠ΅λ‹ˆλ‹€.

#<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)>>

잘λͺ»λœ λ°©μ‹μœΌλ‘œ μ‚¬μš©ν–ˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ μƒˆ 버그λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆκΉŒ?

BTW, faraday.headers["Authorization"] = "token #{token}" 와 faraday.request(:token_auth, token) 의 차이점은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ‚΄ 초보자 루비 지식과 μ†ŒμŠ€ μ½”λ“œ 읽기λ₯Ό 기반으둜 token_auth λŠ” faraday.headers[]= ν•΄λ‹Ήν•˜λŠ” 헀더λ₯Ό μ„€μ •ν•˜λ €κ³  ν•©λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ¬Έμ„œμ—μ„œ 헀더λ₯Ό 직접 μ„€μ •ν•˜λŠ” λŒ€μ‹  미듀웨어λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

@xiaoxipang λ‹˜, 쒋은 질문이 많이 μžˆμŠ΅λ‹ˆλ‹€. μ œκ°€ λͺ¨λ‘ λ‹΅ν•  수 μžˆλŠ”μ§€ 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

잘λͺ»λœ λ°©μ‹μœΌλ‘œ μ‚¬μš©ν–ˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ μƒˆ 버그λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆκΉŒ?

μ˜¬λ°”λ₯΄κ²Œ μ‚¬μš©ν–ˆμ§€λ§Œ λ―Έλ“€μ›¨μ–΄μ˜ 좜λ ₯이 μ„œλ²„μ—μ„œ κΈ°λŒ€ν•˜λŠ” 것과 μ •ν™•νžˆ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
이 "토큰 인증"은 더 이상 μ‚¬μš©λ˜μ§€ μ•Šκ³  Bearer 토큰 및 기타 λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ λŒ€μ²΄λœ κ½€ 였래된 ν‘œμ€€μ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. κ·€ν•˜μ˜ μ˜ˆμ—μ„œ 헀더 좜λ ₯은 Authorization: Token token=token . token= 접두사에 μœ μ˜ν•˜μ‹­μ‹œμ˜€. κ·€ν•˜μ˜ μ„œλ²„κ°€ μ˜ˆμƒν•˜μ§€ λͺ»ν•˜λŠ” κ²ƒμœΌλ‘œ μƒκ°λ©λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λŒ€μ‹  λ‹€μŒμ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

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

μ΄λ ‡κ²Œ ν•˜λ©΄ 헀더가 Authorization: Token token (접두사 μ—†μŒ)둜 μ˜¬λ°”λ₯΄κ²Œ μ„€μ •λ©λ‹ˆλ‹€.
μ‹œλ„ν•΄ λ³΄μ‹œκ³  νš¨κ³Όκ°€ 있으면 μ•Œλ €μ£Όμ„Έμš”!

λ˜ν•œ μ½”λ“œλ₯Ό λ””λ²„κΉ…ν–ˆλŠ”λ° μ–΄λ–»κ²Œ λ“  미듀웨어가 μš”μ²­μ— μ μš©λ˜μ§€ μ•Šμ•˜κ³  헀더에 κΆŒν•œ λΆ€μ—¬κ°€ μ—†μŠ΅λ‹ˆλ‹€. 여기에 ν•˜λ‚˜μ˜ μš”μ²­ 개체 덀프가 μžˆμŠ΅λ‹ˆλ‹€.

μ΄μƒν•©λ‹ˆλ‹€. 방금 μœ„μ˜ μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν–ˆλŠ”λ° μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. λ””λ²„κΉ…μ—μ„œ struct Faraday::Request λ₯Ό 보면 헀더가 미듀웨어에 μ˜ν•΄ μ„€μ •λ˜κΈ° 전에 개체λ₯Ό λ„ˆλ¬΄ 일찍 보고 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
μš”μ²­μ„ μ‹€ν–‰ν•˜κ³  응닡을 ν™•μΈν•˜λ©΄ λΆ„λͺ…νžˆ 거기에 ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

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"}
    ...

λ˜λŠ” λ‹€λ₯Έ 방법은 μ–΄λŒ‘ν„° λ°”λ‘œ μ•žμ— faraday.response :logger 미듀웨어λ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ λͺ¨λ“  미듀웨어가 적용된 ν›„ μš”μ²­μ„ κΈ°λ‘ν•˜κ³  λΆ„λͺ…νžˆ 확인해야 ν•©λ‹ˆλ‹€.

BTW, faraday.headers["Authorization"] = "token #{token}"κ³Ό faraday.request(:token_auth, token)의 차이점은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ‚΄ 초보자 루비 지식과 μ†ŒμŠ€ μ½”λ“œ 읽기λ₯Ό 기반으둜 token_authλŠ” 헀더λ₯Ό μ„€μ •ν•˜λ €κ³  ν•˜λ©° μ΄λŠ” faraday.headers[]=와 λ™μΌν•©λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ¬Έμ„œμ—μ„œ 헀더λ₯Ό 직접 μ„€μ •ν•˜λŠ” λŒ€μ‹  미듀웨어λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

κ·Έ μ œμ•ˆμ˜ 주된 μ΄μœ λŠ” 미듀웨어가 일반적으둜 더 λ‚˜μ€ κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ token_auth 미듀웨어λ₯Ό μ‚¬μš©ν•˜λ©΄ 토큰 속성도 μ„€μ •ν•˜κ³  μžλ™μœΌλ‘œ ν˜•μ‹μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

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

λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ basic_auth λ―Έλ“€μ›¨μ–΄λŠ” μ‚¬μš©μž/패슀 쌍의 Base64 인코딩을 μžλ™μœΌλ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

μœ„μ˜ faraday.request(:authorization, 'Token', token) λ―Έλ“€μ›¨μ–΄λŠ” 헀더λ₯Ό μˆ˜λ™μœΌλ‘œ μ„€μ •ν•˜λŠ” 것 이상을 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 데 λ™μ˜ν•˜μ§€λ§Œ, 예λ₯Ό λ“€μ–΄ Faraday v2μ—μ„œ λ―Έλ“€μ›¨μ–΄λŠ” token μΈμˆ˜μ— λŒ€ν•΄ λžŒλ‹€/ν”„λ‘œμ‹œμ €λ₯Ό μˆ˜λ½ν•˜κ³  κ°κ°μ—μ„œ μžλ™μœΌλ‘œ ν•΄κ²°ν•©λ‹ˆλ‹€. μš”κ΅¬. 이λ₯Ό 톡해 TokenStorage 클래슀λ₯Ό κ°€μ§ˆ 수 있고 λ‹€λ₯Έ μš”μ²­ 간에 토큰을 λ™μ μœΌλ‘œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λ©΄ 각 μš”μ²­μ— 헀더λ₯Ό μˆ˜λ™μœΌλ‘œ μ‚½μž…ν•˜κ±°λ‚˜ 맀번 연결을 λ‹€μ‹œ 생성해야 ν•©λ‹ˆλ‹€.

이것이 κ·€ν•˜μ˜ μ§ˆλ¬Έμ— λŒ€ν•œ 닡변이 되기λ₯Ό λ°”λžλ‹ˆλ‹€. ν•˜μ§€λ§Œ κ°„λ‹¨νžˆ λ§ν•΄μ„œ 두 가지 방법을 λͺ¨λ‘ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μœΌλ―€λ‘œ κ°€μž₯ μ’‹μ•„ν•˜λŠ” 방법을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€ πŸ˜„

@iMacTia 도움과 μžμ„Έν•œ μ„€λͺ… 정말 κ°μ‚¬ν•©λ‹ˆλ‹€!

μ‹œλ„ν•΄ λ³΄μ‹œκ³  νš¨κ³Όκ°€ 있으면 μ•Œλ €μ£Όμ„Έμš”!

faraday.request(:authorization, "token", token) λŠ” μ €μ—κ²Œ νš¨κ³Όμ μž…λ‹ˆλ‹€.

λ˜λŠ” λ‹€λ₯Έ 방법은 faraday.response :logger 미듀웨어λ₯Ό μ–΄λŒ‘ν„° λ°”λ‘œ μ•žμ— μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄
λͺ¨λ“  미듀웨어가 적용된 ν›„ μš”μ²­ν•˜κ³  ν™•μ‹€νžˆ 확인해야 ν•©λ‹ˆλ‹€.

μ§€κΈˆλΆ€ν„° λ””λ²„κΉ…ν•˜λŠ” 방법을 μ•„λŠ” 것이 맀우 μ’‹μŠ΅λ‹ˆλ‹€. 그리고 그것을 μ‚¬μš©ν•¨μœΌλ‘œμ¨ 당신은 μ™„μ „νžˆ μ •ν™•ν•©λ‹ˆλ‹€.
faraday.request(:authorization, "token", token) μ‚¬μš©ν•  λ•Œ ν—€λ”λŠ” Authorization: "token token_value"
faraday.request(:token_auth, token) μ‚¬μš©ν•  λ•Œ ν—€λ”λŠ” Authorization: "Token token=\"token_value\""

μ΄μƒν•©λ‹ˆλ‹€. 방금 μœ„μ˜ μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν–ˆλŠ”λ° μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. λ””λ²„κΉ…μ—μ„œ Faraday::Request ꡬ쑰체λ₯Ό 보면 헀더가 미듀웨어에 μ˜ν•΄ μ„€μ •λ˜κΈ° 전에 개체λ₯Ό λ„ˆλ¬΄ 일찍 보고 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ„€, connection#run_request 에 breakpointλ₯Ό λ„£μ—ˆλŠ”λ° κ·Έ μˆœκ°„ 미듀웨어가 ν˜ΈμΆœλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. Faraday::Request::Authorization에 μƒˆλ‘œμš΄ 쀑단점을 μΆ”κ°€ν•˜κ³  이제 μž‘λ™ 방식을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

이것이 κ·€ν•˜μ˜ μ§ˆλ¬Έμ— λŒ€ν•œ 닡변이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ°„λ‹¨νžˆ λ§ν•΄μ„œ 두 가지 방법을 λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ κ°€μž₯ μ’‹μ•„ν•˜λŠ” 방법을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

λ„€ 그리고 λ‹€μ‹œ ν•œλ²ˆ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

μ§€κΈˆμ€ μ‚¬μš© 쀑단 κ²½κ³ λ₯Ό μ œκ±°ν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

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

μ—¬μ „νžˆ 1.7.1μ—μ„œ κ²½κ³ κ°€ λ°œμƒν•˜κ³  @mscoutermarshκ°€ μ–ΈκΈ‰ν–ˆλ“―μ΄ μƒˆ ꡬ문은 아직 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

@paukul

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

우리λ₯Ό μœ„ν•΄ 그것을 κ³ μ³€μŠ΅λ‹ˆλ‹€. κ·€ν•˜μ™€ λ™μΌν•˜κ²Œ λ³΄μ΄μ§€λ§Œ μ—¬μ „νžˆ κ²½κ³ λ₯Ό ν‘œμ‹œν•˜λŠ” 이유λ₯Ό λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰