developer-api.nest.com์ ์์ฒญํ๊ณ ์ ๋ฌ์ ํ ํฐ์ผ๋ก Authorization ํค๋๋ฅผ ์ค์ ํ๋ ์ค์
๋๋ค. ์ผ๋ถ ์์ฒญ์์ ํด๋น API๋ 307 ๋ฆฌ๋๋ ์
์ผ๋ก ์๋ตํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ํ์ ์์ฒญ์์ Authorization ํค๋๋ฅผ ๋ณด๋ด์ผํฉ๋๋ค. ๋๋ ์ธ์
๋ฟ๋ง ์๋๋ผ requests.get()
์ ์ฌ์ฉํด ๋ณด์์ต๋๋ค.
๋ฆฌ๋๋ ์ ์ ํ์ฉํ์ง ์๊ณ 307์ ๊ฐ์ง ํ ๋ค์ ์ง์ ์ ์์ฒญ์ ๋ฐํํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ด๊ฒ์ด ๋ฒ๊ทธ์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ธ์ ์ปจํ ์คํธ ๋ด์์ ์ด๋ฃจ์ด์ง ๋ชจ๋ ์์ฒญ์ โโ๋ํด Authorization ํค๋๊ฐ ์ ์ก ๋ ๊ฒ์ผ๋ก ์์ํด์ผํฉ๋๊น?
In [41]: s = requests.Session()
In [42]: s.headers
Out[42]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0'}
In [43]: s.headers['Authorization'] = "Bearer <snip>"
In [45]: s.get("https://developer-api.nest.com/devices/thermostats/")
Out[45]: <Response [401]>
In [46]: s.get("https://developer-api.nest.com/devices/thermostats/")
Out[46]: <Response [200]>
In [49]: Out[45].history
Out[49]: [<Response [307]>]
In [50]: Out[46].history
Out[50]: []
In [51]: Out[45].request.headers
Out[51]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0'}
In [52]: Out[46].request.headers
Out[52]: {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'User-Agent': 'python-requests/2.7.0 CPython/3.4.3 Darwin/15.2.0', 'Authorization': 'Bearer <snip>'}
๋ฆฌ๋๋ ์ ์ ์ด๋์ ์์ต๋๊น?
์, ๋ค๋ฅธ ๋๋ฉ์ธ. firebase-apiserver03-tah01-iad01.dapi.production.nest.com
๋ค, ๊ทธ๊ฒ์ ๋ค์ ์๋์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ํธ์คํธ๋ก ๋ฆฌ๋๋ ์ ๋ ๋ ์ธ์ฆ ํค๋๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋งค์ฐ ๊ณต๊ฒฉ์ ์ ๋๋ค. ์ด๊ฒ์ ์คํ ํธ์คํธ ๋ฆฌ๋๋ ์ ์์ ํค๋๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ CVE 2014-1829 ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ํ ์์ ๊ธฐ๋ฅ์ ๋๋ค.
๊ทธ๋ฌ๋ ํน์ ๊ด์ ์์๋ ์์ฒญ์ด ์๋ Session
์ Authorization ํค๋๋ฅผ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ฌ์ ํ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ์์น์ ์ผ๋ก ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ "๋ฆฌ๋๋ ์
์ด ์ด๋๋ก ๊ฐ๋์ง ์ ๊ฒฝ ์ฐ์ง ์๊ณ ํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค"์
๋๋ค. ๋๋ ์ฌ์ ํ _ ์๊ฐํ๋ค _ ๋๋์ด ์ ๊ทผ ๋ฐฉ์์ ์ ํธํ๋ค. ์ ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ํํ์ ๊ณต๊ฒฉ์๋ ๊ฐ๋ฐฉ๋์ง ์๋๋ก ๋ณด์ฅํ๋ค. ๋น๋ก์ด ํน์ ์ธ์คํด์ค๊ฐ ๋ค์ ๊น๋ค๋ก์ ์ง๋๋ผ๋ ๋ง์ด๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋๋ฌด ํธ์ง์ฆ ์ ์ด๋ผ๊ณ ํ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋๋ฌด ํธ์ง์ฆ ์ ์ด๋ผ๊ณ ํ์ ํ ์ ์์ต๋๋ค.
๋๋ ํ์ ์ ๋ ๊ฐ๋ฐฉ์ ์ด์ง๋ง ๊ธฐ๊บผ์ด ๊ฒฝ์ฒญํฉ๋๋ค.
์ฆ, rebuild_auth
์์ ์ผ๋ถ ์์
์ ์ํํด์ผํ๋ _allowed_ ๋๋ฉ์ธ ์ ์ฒด์ ์ด๋ฌํ ํค๋๋ฅผ ์ ์งํ๊ธฐ ์ํด ๋ณ๋์ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ์์ฑํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ง๊ธ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ์์ ์ฑ์ ๋ํด ๋ ผ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง "์์ ํ์ง ์์"๋์์ ์ ํํ ์์๋ ๋ฉ์ปค๋์ฆ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ํด๋น ํค๋๋ฅผ (์ด ๊ฒฝ์ฐ nest.com)์ ์ ์งํ๋๋ก ๊ธฐ๋ณธ ๋๋ฉ์ธ์ ์ค์ ํ๊ฑฐ๋ ํค๋๋ฅผ ๋ณด๋ผ ์์๋ ๋๋ฉ์ธ ๋ชฉ๋ก์ ์ค์ ํ ์ ์์ต๋๋ค.
๊ทธ๋๋ ์์ฒญ์ ํต์ฌ์ด ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ Auth ํด๋์ค / ํธ๋ค๋ฌ๊ฐ ์ด๋ฌํ ์ข
๋ฅ์ ์์
์ ๊ฐ์ฅ ์ ์๋ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ฌด์กฐ๊ฑด prepare_auth
ํธ์ถํ์ง ์๋๋ค๊ณ ํ์ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ด ์๋ ํ ๊ฒ์ด๋ผ๊ณ ํ์ ํ์ง ์์ต๋๋ค.
๋ฌด์กฐ๊ฑด prepare_auth
ํธ์ถํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์ค ๋ชจ๋ธ์์๋ ์๋ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๋น API๋ฅผ ์ฝ๊ฐ ๋น์ ์์ ์ผ๋ก ์ฌ์ฉํ๋๋ผ๋ ์ ์ก ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ์ด ์ญํ ์ ์ํ ํ ์ ์์ต๋๋ค.
๋๋ TA๊ฐ ์ฌ๊ธฐ์ ์ถ์ฒํ๊ธฐ์ ์ ๋์ ์ผ๋ก ์๋ชป๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
session.auth
์ ๊ฑฐํด์ผํฉ๋๋ค. ํน๋ณํ ์ ์ฉํ์ง ์์ต๋๋ค.์ธ์ ์ ์ธ์ฆ์ด ์ ๊ณต๋๋ฉด ์ธ์ ์ด ์์ฑํ๋ ๋ชจ๋ ์์ฒญ์ โโ๋ํด ์ ์ก๋์ด์ผํฉ๋๋ค.
๋๋ ๊ทผ๋ณธ์ ์ผ๋ก ๋์ํ์ง ์์ต๋๋ค. ์ธ์ ์ ๋จ์ผ ๋๋ฉ์ธ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค.
์๋ง๋ session.auth๋ฅผ ์ ๊ฑฐํด์ผ ํ ๊ฒ์ ๋๋ค. ํน๋ณํ ์ ์ฉํ์ง ์์ต๋๋ค.
์ ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋๋ ํํ ํ ๋น์ด ํ์ฉ๋์ง ์์ผ๋ฉด ๋ ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฐจ๋ผ๋ฆฌ ์ฌ์ฉํ ๋๋ฉ์ธ์ ์ง์ ํ๋ Auth ํด๋์ค๋ฅผ๋ณด๊ณ ์ถ์ต๋๋ค. ์์ฒญ์ ์ฌ์ฉํ ๋ ์ฌ๋๋ค์ด ๋๋ฉ์ธ์ ๋ํ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ํ ์ ์๋๋กํ๋ requests-toolbelt์์ AuthHandler ๋ฅผ ์ฑํ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ์ฝ๊ฐ ๋ ์์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋จ์ ์ ์ฌ์ฉ์๊ฐ ์ด๋ฌํ ์ข ๋ฅ์ ์ธ์ฆ์ ์ตํธ ์ธํด์ผํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ํ ๋ฆฌ๋๋ ์ ์ ์ํด ํค๋๋ฅผ ์ ์งํ ์ ์๋๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
@jtherrmann ์ด๊ฒ์ด ์ธ์ฆ ํค๋ ์ธ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์์ฒญ์ ํญ์ ์ํ๋ ํค๋๋ฅผ ๋ฃ๋ ์ธ์ ์์ค ์ธ์ฆ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
์ด์ ๋ํ ์ง์ ์ด๋ ์ถ๊ฐ ๊ณ ๋ ค ์ฌํญ์ด ์์ต๋๊น?
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค.
@ethanroy ์ธ์ ์์ค ์ธ์ฆ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ ์ ์ธ์ ์ถ๊ฐ ๊ณ ๋ ค ์ฌํญ์ ์์ต๋๋ค.
๊ด๋ จ : ์ธ์
์ด ์ธ์ฆ์ ๋ฆฌ๋๋ ์
ํ๊ณ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ get
๋ค์ ํธ์ถํ๋ฉด ์ธ์ฆ์ด ๋ค์ ์ ์ฉ๋๊ณ ์บ์ ๋ ๋ฆฌ๋๋ ์
์ด ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋์ ๋ ๋ฒ ๋
ธํฌํ๋ฉด ๋ค์ด๊ฐ๋๋ค. ์๋ ๋ ํ๋?
>>> s = requests.Session()
>>> s.headers.update({"Authorization": "Token {}".format(API_TOKEN)})
>>> s.get(url)
<Response [403]>
>>> s.get(url)
<Response [200]>
@GregBakker ๋ค, ๊ทธ๋ ์ต๋๋ค. ์๋ ๋ ํ๋์ ํฉ๋ฅ์ ์ ๋๋ค. ๊ทธ๋ฌ๋์ด ๋ฒ๊ทธ๋ ์๋ 403์ด ๋ฐ์ํ์ง ์์์ผ ํจ์ ๋ํ๋ ๋๋ค.
@Lukasa ๊ฐ "๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ธ์ ์์ค ์ธ์ฆ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ค์ ํ๋ ๊ฒ"์ด๋ผ๊ณ ๋งํ ๋, ์ด๊ฒ์ด ์ค๋๋ ์๋ํ๋ ๊ฒ์ ๋๊น? ๋ด๊ฐ ์ฝ๋์์๋ณด๊ณ ์๋ ๊ฒ์ ๋ฐํ์ผ๋ก ๋๋ต์ '์๋์ค'์ด์ง๋ง ๋น์ ์ ๋ง์ ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์๋์ง ๊ถ๊ธํ๊ฒ ๋ง๋ญ๋๋ค. ์ธ์ ์ธ์ฆ ์์ฑ์ ์ค์ ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น?
๊ทธ๋, ์๋ํด์ผ ๋ผ.
@jwineinger ๊ทธ๋์ ์ด๋ป๊ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ๋์์ต๋๊น? ์ฌ์ ํ ๋์ผํ๊ฒ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๊ฐ์ง Nest ๊ด๋ จ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
ํ๋๋ Authorization ํค๋๋ฅผ ์ฌ์ฉํ๋ ๋์ access_token๊ณผ ํจ๊ป auth
๋งค๊ฐ ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค. https://gist.github.com/tylerdave/409ffa08e1d47b1a1e23 ์์ ์ฐพ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ํค๋๋ก ์ฌ์ ์ ์ ์ฅํ๊ณ ๋ฆฌ๋๋ ์ ์ ๋ฐ๋ฅด์ง ์๊ณ ํค๋๋ฅผ ๋ค์ ์ ๋ฌํ๋ ๋ ๋ฒ์งธ ์์ฒญ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
headers = {'Authorization': 'Bearer ' + access_token, 'Content-Type': 'application/json'}
initial_response = requests.get('https://developer-api.nest.com', headers=headers, allow_redirects=False)
if initial_response.status_code == 307:
api_response = requests.get(initial_response.headers['Location'], headers=headers, allow_redirects=False)
์ด ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ฌ์ฉ์ ์ง์ requests.Session
๊ตฌํ์์ rebuild_auth
๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
from requests import Session
class CustomSession(Session):
def rebuild_auth(self, prepared_request, response):
return
s = CustomSession()
s.get(url, auth=("username", "password"))
@ sigmavirus24 @ gabriel-loo์ ์๋ฃจ์ ์ ์ด๋ค ๋ฌธ์ ๊ฐ ์์ต๋๊น? ๋ณด์ ๋ฌธ์ ?
@ j08lue ์. ์ค๋ ๋๋ฅผ ์ฝ์ผ์ญ์์ค. ์ ๋๋ฉ์ธ์ผ๋ก ์์ ๋ฆฌ๋๋ ์ ์ ์ํํ๊ธฐ ์ ์ ์ธ์ฆ์ ์ ๊ฑฐ ํ์ง ์๋ ๊ฒ๊ณผ ๊ด๋ จ๋ CVE๊ฐ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์ ๋ฅผ ์๊ฐํด๋ณด์ญ์์ค.
๋๋ api.github.com
์์ฒญ์ํ๊ณ ์๊ณ ๊ณต๊ฒฉ์๊ฐ ์์ ์ด ์ ์ดํ๋ another-domain.com
๋ก์ ๋ฆฌ๋๋ ์
์ ๋ฐ๋ฅด๋๋ก ๊ด๋ฆฌํ๊ณ ๋ด ๋ฆฌํฌ์งํ ๋ฆฌ (์์ฒญ ํฌํจ)์ ๋ํ ์ฐ๊ธฐ ์ก์ธ์ค ๊ถํ์ด์๋ ํ ํฐ์ ์ ๋ฌํฉ๋๋ค. ์ค์ ๋ก ๊ทธ๋ค์ด API๋ฅผ ํตํด ์ปค๋ฐ์ ํ ๋ ์์ฒญ์ ์ปค๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ๋ณด์ ์ํ๋ฅผ ์ฝํ์ํค๊ณ ์ ๊ทน์ ์ผ๋ก ํด๋ฅผ ๋ผ์น ์์๋ ์ฝ๋๋ฅผ ์์ฒญ์ ํฌํจ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ๋ฆฌ๋๋ ์
์์ ๋ฌด์กฐ๊ฑด ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ผ ๋ ๋ฐ์ํ ์์๋ ์ผ์
๋๋ค.
๊ทธ๋๋ ๋ฆฌ๋๋ ์ ์ด ์ ์ฑ์ด ์๋๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ค์ ๋ก ์๋น์ค์ ๋ํ ์๊ฒฉ ์ฆ๋ช ์ ๋ค๋ฅธ ํ์ฌ ๋ ์๋น์ค์ ์ ์ถํ๋ ๊ฒ์ด ํธํฉ๋๊น? ์๋ ์๋น์ค๋ ๊ทํ, ๊ทํ์ ๊ณ ๊ฐ ๋๋ ๋ค๋ฅธ ๊ฒ์ ๋ํ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ๋ฆฌ๋๋ ์ ๋ ์ ๋๋ฉ์ธ์ด ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ง ์์ง๋ง ์ ์ฌ์ ์ผ๋ก ์์์น ๋ชปํ ๋ฐ์ดํฐ๋ก ๊ธฐ๋กํ๋ ๊ฒฝ์ฐ์๋์ด๋ฅผ ๊ณต๊ฒฉํ๊ณ ํด๋น ๋ก๊ทธ๋ฅผ ๊ฒ์ ํ ์์๋ ์ฌ๋์ ์๋ ๋๋ฉ์ธ์ ๋ํ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ์ํฉ๋๋ค. ์ ๋ง ๊ทธ ์ํ์ ๊ฐ์ ํ์๊ฒ ์ต๋๊น?
@ sigmavirus24 ์ผ๋ฌ์คํธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ๊ถ๊ทน์ ์ผ๋ก ๋ฏผ๊ฐํ ํค๋๋ฅผ ๋ฆฌ๋๋ ์ ์ ์ ๋ฌํ๋ ๊ฒ์ ๊ธ์งํ๋ค๋ฉด์ด ์ค๋ ๋๊ฐ ์ฌ์ ํ ์ด๋ ค์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋๋ ๋น์ ์ด ์ป๋ ๊ฒ๋ณด๋ค ๋ ์ ์ ํ ์ค๋ฅ๋ฅผ ์๊ฐํ ์ ์์์ต๋๋ค (403), ์ฌ๊ธฐ์ ์กฐ์น๋ฅผ ์ทจํ ํ์๊ฐ์๋ ๋ฒ๊ทธ๊ฐ ์์ต๋๊น? ์๋๋ฉด ๋ฌด์ ์ ์ผ๋ ์ ๋ ์ จ๋์, @Lukasa?
์ต๊ทผ์ ๋น๊ณต๊ฐ API๋ก ์์ ํ ๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ณด์ ๋ฌธ์ ๋ ๋ฆฌ๋๋ ์ ์์ ์ธ์ฆ์ ์ ๊ฑฐํ๋ ์ด์ ๋ก ์์ ํ ์ดํด๋ฉ๋๋ค. @ gabriel-loo์ ๊ฐ์ ์๋ฃจ์ ์ ์ฌ๋๋ค์ด ๊ทธ๋ ๊ฒ ํ ์์์๋งํผ ์์ ํ ํ๊ฒฝ์ ์๋ค๊ณ ๋ฏฟ๋๋ค๋ฉด ๊ณ ๋ คํ ์์๋ ๊ฒ์ ๋๋ค. ๋๋ ์ธ์ ๋ ๋ฒจ ํธ๋ค๋ฌ. ๋๋ ๊ฐ๋ฅํ๋ค๋ฉด ์์์ ์ ์ํ๋๋ก ๋ฆฌ๋๋ ์ ์ ์์ ํ ๊ฑด๋ ๋ฐ์ด ํด๊ฒฐํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์ผ์ญ์์ค. ๋ฐ๋ผ์๋ณด๊ธฐ์ ๋ฐ๋ผ ์ด๊ฒ์ ์ค์ ๋ก ๋ฒ๊ทธ๊ฐ ์๋๋๋ค.
๊ทธ๋ฌ๋ ์ ๋ Python์ด ์๋ ๋ค๋ฅธ HTTP ํด๋ผ์ด์ธํธ _did_๊ฐ ์ธ์ฆ ํค๋๋ฅผ ํต๊ณผํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ ๋๋ก ์๋ํ๋ ์ด์ ๋ฅผ ํผ๋ํ๋ ๋ฐ ํ์ํ ๊ฒ๋ณด๋ค ๋ ๋ง์ ์๊ฐ์ ์๋ชจํ์ต๋๋ค. ํ ๊ฐ์ง ์ ์ : ์ฌ๊ธฐ์์ warnings
๋ฅผ ํตํด ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ์ฌ ํค๋๊ฐ ์๊ณ ์ ๊ฑฐ ๋ ๋ ํธ์ถ์์๊ฒ ๋ ๋ช
ํํ๊ฒ ์๋ฆฌ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ํธ์ถ์๊ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๊ธฐ๋ฅผ ์ํ์ง ์๋ ๊ฒ์ด ๋๋ฌธ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@tlantz ์ผ๋ฐ์ ์ผ๋ก ๊ฝค ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ผ ๊ฒ์ ๋๋ค. ํ๋ก์ ํธ (๊ทธ ์ข ์์ฑ ์ค ํ๋ ์ธ urllib3๋ฟ๋ง ์๋๋ผ)๋ก์์ ์์ฒญ์ ๊ฒฝ๊ณ ๋ชจ๋์ ํตํด ๋๋ ๋ก๊น ์ ํตํด ๋ชจ๋ ์ข ๋ฅ์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐํ ํ ๋ ์๋นํ ๋ถ๋ ธ๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค. ๋ํ ๊ฒฝ๊ณ ๋ชจ๋์ ์๋ฅผ ๋ค์ด ์ต์ ๋ฒ์ ์ OpenSSL์ ๋ํด ์ปดํ์ผ ๋ Python ๋ฒ์ ์ ์ฌ์ฉํ์ง ์๋ ๋ฑ ์ฌ๋๋ค์ด ์กฐ์น๋ฅผ ์ทจํด์ผํ๋ ์ฌํญ์์ํ ๊ฒ์ ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ด ๋์์ TLS ์ฐ๊ฒฐ์ ๋ํ ์ธ์ฆ์๋ฅผ ํ์ธํ ์์๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํด ์ง์ ์ฑ ์๊ณ ์ ๋นํ ๋ถ๋ง์ ํ๋ช
ํ ์ฌ์ฉ์ ๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ๋ ๋ถ๋ช
ํ ๋์์ด๋์ง ์์ต๋๋ค. ์ด๋ฅผ ์ผ๋์๋๊ณ DEBUG
์์ค์์ ์ด๊ฒ์ ๊ธฐ๋กํ๋ ๊ฒ์ด ๋ ์ข์ง ์์์ง ๊ถ๊ธํฉ๋๋ค. ๋๊ตฐ๊ฐ ๋ก๊น
(์ผ๋ฐ์ ์ผ๋ก ๊ด์ฐฎ์ ๊ดํ)์ ์ฌ์ฉํ๊ณ ์๊ณ ํด๋น ์์ค์ ํ์ฑํํ๋ฉด ํ์๋ฉ๋๋ค. ํ์ต๊ณผ, ๊ทธ ์์ฒด๊ฐ ๊ธฐ๋ก ๋ฐฉ๋ฒ ์์ ์์ฒญ ์ฃผ์ด, ์ด๊ฒ์ ๋๋ฒ๊ทธ ๋ก๊ทธ๋ก ์๋นํ ๋์ ๋๋ ๊ฒ์
๋๋ค. ๊ณต์ ํ ํธ๋ ์ด๋ ์คํ์ฒ๋ผ ๋ณด์
๋๊น?
๋ค, ์์ ํ ๊ณต์ ํ ๊ฑฐ๋ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. warnings
๋ํ ์ถ๋ก ์ด ๋์๊ฒ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋๋ 30 ๋ถ ๋์ ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ถ๊ฐ ํ ์ ์๋๋ก ์์ํด ๋น์ ์ดํ๋ ์๊ฐ์ผ๋ก ์๊ฐ logging
์ด์จ๋ ์์ ์์ ์ ๋ฌผ๊ฑด์ ์ฃผ๋ณ์ DEBUG
๋๋ ์๊ฐํ๋ค, ๊ทธ๋์ DEBUG
๋ฉ์์ง๋ฅผ ์ฌ๋๋ค์ด ์๋ํ์ง ์๋ ๊ฒ์ ์์ ๋ด๋ ค๊ณ ์ ์ฐ๋ ๊ฒฝ์ฐ์ 95 %๋ฅผ ์ฐจ์งํฉ๋๋ค.
์ธ์
์ ์ฌ์ฉํ์ฌ Authorization ํค๋๋ฅผ ๋ณด์ ํ์ง๋ง ๋ฆฌ๋๋ ์
์ผ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
์์ฒญ (2.18.4)
๋๋ฃ์ ์ ๋์ด ๋์๊ณผ ์ง์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น
ํ๋ ๋ฐ ์ต์ํ ๋ช ์๊ฐ์ ๋ณด๋์ต๋๋ค. ๋ด ์ฌ์ฉ ์ฌ๋ก๋ API ํธ์ถ์ api.my-example-site.org
์์ www.api.my-example-site.org
๋ก ๋ฆฌ๋๋ ์
ํ๋ ๊ฒ์
๋๋ค. ๋ฆฌ๋๋ ์
์์ ํค๋๊ฐ ์ ๊ฑฐ๋์์ต๋๋ค.
์ด๊ฒ์ด ์๋ ๋ ๋์์ด๋ผ๋ฉด (๋๋ ๊ฐ๊น์ด ์ฅ๋์ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ) ์ ์ด๋ ๋ฌธ์์ ์ถ๊ฐ ํ ์ ์์ต๋๊น? ๋๋ ๋ด๊ฐ ๋ญ ์๋ชปํ๊ณ ์๋์ง ์์ ๋ด๊ธฐ ์ํด ๋ฌธ์๋ฅผ ์ฝ๊ณ ๋ค์ ์ฝ์๊ณ , Request
ํด๋์ค์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ฝ์์ต๋๋ค. ๋ฌธ์์์์ด ๋์์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ๋ณด์๋ค๋ฉด ๋ช ๋ถ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ ๊ฒ์
๋๋ค (์ด ์ค๋ ๋๋ฅผ ์ฐพ์ ํ ๊ฑธ๋ฆฐ ์๊ฐ์
๋๋ค). ๊ทธ๋ฌ๋ ์๋ง๋ ์ฐ๋ฆฌ๋ ๋ฌธ์์ ์๋ชป๋ ๋ถ๋ถ์ ์ฝ์์ ๊ฒ์
๋๋ค.
@ndmeiri ๋ , ์ฌ์ฉ์ ์ง์ ํค๋ ์ ๋ชฉ ์๋์ ์์ฒญ์ ๋ํ ๋น ๋ฅธ ์์ ๊ฐ์ด๋์ ์ด์ ๋ํ ์ค๋ช ์ด ์์ต๋๋ค. ์ด ๊ธ์ ๋ฃ์ ๋ ์ข์ ์ฅ์๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ฉด, ์ฐ๋ฆฌ๋ ๊ทํ์ ์ ์์ ๊ฒํ ํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค. ์ด ํฐ์ผ๊ณผ ์ง์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๋ฌธ์ ๋๋ PR๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฐ์ฌ!
์๋ ํ์ธ์ @nateprewitt , ์ฌ์ฉ์ ์ ์ ํค๋ ์น์ ์ ์ง์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋ถ๋ช ํ ๋๋ โโ๋ฌธ์์ ๊ทธ ๋ถ๋ถ์ ํ์ธํ ์๊ฐ์ด ์์์ต๋๋ค.
์ธ์ฆ ์น์ ์ ์ฝ ์์ ๋๋ ์ฝ ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ํฌํจํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ํ์ฌ ์๋นํ ๋ฐ์์ง๋ง ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ์ํฉ์ด ์ง์ ๋๋ฉด PR์ ์ฌ๋ ๊ฒ์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ์๋ ๋ ๋์ ์ธ ๊ฒฝ์ฐ
@ndmeiri ์, ๋ฏผ๊ฐํ ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช ์ ์ ์ฌ์ ์ผ๋ก ์ ๋ขฐํ ์์๋ ์์ค๋ก ์ ์ถํ์ง ์๋๋ก ์๋ ๋ ๊ฒ์ ๋๋ค. (๋ช ํํ๊ฒ)
# 4983์ "์ ๋ขฐํ ์์๋ ๋๋ฉ์ธ"์ด ๋ ์ด์ sessions.py ๊ตฌํ์์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
๋ด๊ฐ _know_ ํน์ ๋ค๋ฅด์ง๋ง ์์ ํ URL๋ก ๋ฆฌ๋๋ ์ ํ๋ URL์ ์์ฒญํ๊ณ Authorization ํค๋์ ์ง์์ฑ์ ์ฌ์ฉํ์ฌ ๋ฆฌ๋๋ ์ ์ ํ์ฑํํ๋ ค๋ ์ํฉ์์ ์ด๋ป๊ฒํด์ผํฉ๋๊น?
์ ๋ฐ ์ด๋ป๊ฒ ์ด๋ฃฐ๊น์?
rebuild_auth
๋ฉ์๋๋ฅผ ํจ์น ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค : https://github.com/DHI-GRAS/earthdata-download/blob/master/earthdata_download/download.py#L27 -L49
@ j08lue ๊ฐ์ฌํฉ๋๋ค! ๊ทํ์ ์๊ฒฌ์ด ์ ๋ฌ๋๊ธฐ ์ ์ allow_redirects
์ False
๋ก ์ค์ ํ๊ณ ๋ด ์ฌ์ฉ ์ฌ๋ก์์ ์์๋๋ ๋ช ๊ฐ์ง ํน์ ๋ฆฌ๋๋ ์
์ ๋ช
์ ์ ์ผ๋ก ๋ฐ๋ฅด๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ด๊ฒ์ ์ ์๊ฒ ๋จ๊ธฐ์ ์ธ ์ํฉ์ด๋ฏ๋ก ์ด๊ฒ์ด ์ ์ ํ ์์ ํด๊ฒฐ์ฑ
์ด๊ธฐ๋ฅผ ๋ฐ๋ผ์ง ๋ง, ํ์ํ๋ค๋ฉด ์ฅ๊ธฐ์ ์ผ๋ก ๋ ๋์ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ ๊ฐ์ง Nest ๊ด๋ จ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
ํ๋๋ Authorization ํค๋๋ฅผ ์ฌ์ฉํ๋ ๋์ access_token๊ณผ ํจ๊ป
auth
๋งค๊ฐ ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. https://gist.github.com/tylerdave/409ffa08e1d47b1a1e23 ์์ ์ฐพ์์ต๋๋ค.๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ํค๋๋ก ์ฌ์ ์ ์ ์ฅํ๊ณ ๋ฆฌ๋๋ ์ ์ ๋ฐ๋ฅด์ง ์๊ณ ํค๋๋ฅผ ๋ค์ ์ ๋ฌํ๋ ๋ ๋ฒ์งธ ์์ฒญ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.