https://github.com/oauthlib/oauthlib/issues/495 ๊ฐ ๋ณํฉ๋ ์ดํ requests/requests-oauthlib์ ํจ๊ป ์ฌ์ฉํ ๋ ๋ง์คํฐ์์ ํ๊ท๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ถํ ๋ถ์ฌ/์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ง ๊ด๋ จ๋ฉ๋๋ค.
requests-oauthlib์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
sess = OAuth2Session(client_id)
token = sess.fetch_token(token_url, client_secret=client_secret, authorization_response=request.url)
๊ทธ๋ฌ๋ ๋ณ๊ฒฝ ์ดํ ์ธ์
์ client_id
๋ ๋ฌด์๋ฉ๋๋ค. https://github.com/oauthlib/oauthlib/pull/505 ๊ฐ ์ ์ค ์ผ์ด์ค๋ฅผ ์์ ํ์ง๋ง ๋ค๋ฅธ ์ผ์ด์ค๋ฅผ ๋ง๊ฐ๋จ๋ ธ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์-์ ์๋ฃจ์
์ ์ฐพ์์ผ ํฉ๋๋ค.
https://github.com/requests/requests-oauthlib/blob/master/requests_oauthlib/oauth2_session.py#L196 -L198์์ ์์ฒญ-oauthlib ์ฝ๋ ํธ์ถ ๋ฐ ์ฌ๊ธฐ์์ oauthlib ๋ฌธ์
https://github.com/oauthlib/oauthlib/blame/master/oauthlib/oauth2/rfc6749/clients/web_application.py#L128.
๋ด ์ฒซ ๋ฒ์งธ ์๊ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก WebApplicationClient
์์ฑ์์ ์ค์ ๋ self.client_id
์ฌ์ฉํ๋๋ก prepare_request_body
์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ฆฌ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฐ ๋ค์ &client_id=xx
๋ฅผ prepare_request_body
์ถ๋ ฅ์ ์ถ๊ฐํ๋๋ก ์ธ๋ผ์ธ ๋ฌธ์๋ฅผ ์ ์ ํ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์๋ ์์ ์ฌํญ์ ๋์ฒดํ๊ธฐ ์ํด ์ธ์์์ client_id
๋ฅผ ์ ๊ฑฐํ๊ณ prepare_request_body
์ ๊ฐ์ด include_client=True/False
prepare_request_body
์ ์ธ์๋ฅผ ์ถ๊ฐํ์ฌ client_id
์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. client_secret
๋ฅผ ๋ณธ๋ฌธ์ ํฌํจํ๊ฑฐ๋ ๋ ๋ค ํฌํจํ์ง ๋ง์ญ์์ค.
์๊ฐ?
ํฌ์ผ @Diaoul @skion @thedrow
์ด๊ฑด ์ด๋ค๊ฐ์:
args์์ client_id๋ฅผ ์ ๊ฑฐํ๊ณ include_client=True/False์ ๊ฐ์ ์ ์ธ์๋ฅผ prepare_request_body์ ์ถ๊ฐํ์ฌ ๋ณธ๋ฌธ์ client_id์ client_secret์ ๋ชจ๋ ์ถ๊ฐํ๊ฑฐ๋ ๋ ๋ค ํฌํจํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ์ฌ ํด์
์ค์ ๋ก ๋ด ํ ์คํธ ์ค ํ๋์์ ์ด์ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ฐ์์์ผฐ์ง๋ง https://github.com/requests/requests-oauthlib/issues/330 ์์ requests/oauthlib์ ๋ํด ์ ์ถํ์ต๋๋ค.
๋๋ ๋ฌธ์ ๊ฐ ์ค์ ๋ก requests_oauthlib์ ์๋ชป์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ๋ฌธ์ - ์ค์ ๋ก ํ์ด์ง๋ฅผ ๋ก๋ํ ๋ ์ ์ฒด ๋ฌธ์์ ์ฒซ ๋ฒ์งธ ์ - OAuth2Session
์์ฑ์์์ client_id
์ง์ ์ ์ง์ํฉ๋๋ค. 200ํ์ ๋
ผ๋ฆฌ๋ kwargs์์ client_id
๊ฐ์ ธ์ค์ง๋ง ์ด๋ฏธ ๊ตฌ์ฑ๋ WebApplicationClient
์ธ์คํด์ค์์ ๊ฐ์ ธ์ค๊ธฐ ์ํ ํด๋ฐฑ์ด ์์ต๋๋ค.
@jvanasco , ํ์ฌ ๋ฌธ์ #585๋ requests-oauthlib ๋จ๋ ์ผ๋ก ๋๋ oauthlib์ PR #505๋ฅผ ๋๋๋ ค์ ์์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ์๋ฃจ์ ๋ https://github.com/oauthlib/oauthlib/pull/505#issuecomment -351221107์์ @skion ์ด ์ธ๊ธํ ๋์์ ์์ ํ ์ ์์ต๋๋ค.
์ฌ์์ ๋ฐ๋ฅด๋ฉด client_id ๋งค๊ฐ๋ณ์๋ ์ธ์ฆ๋์ง ์์ ํด๋ผ์ด์ธํธ์ ๋ํด ์ ์ก๋์ด์ผ ํ์ง๋ง ๊ธฐ๋ฐ ํด๋ผ์ด์ธํธ์ ๋ํ ํ ํฐ ์์ฒญ ๋ณธ๋ฌธ์์๋ ์ ์ก๋์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆํ๋ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ด HTTP ๊ธฐ๋ณธ ์ธ์ฆ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ WebApplication ํด๋์ค๋ ํญ์ ์ด๋ฅผ ํฌํจํ๋ฉฐ(์ผ๋ถ ์๋ฒ๊ฐ ์ค๋จ๋จ) ์ด๋ฅผ ์ ๊ฑฐํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
Oauthlib๋ requests-oauthlib๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ฐ์ํ๊ณ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ด ํ ๋ก ์์ ํด๊ฒฐ์ฑ ์ ์ฐพ์ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๊ฑฐ๋ํ ์ฐจ๋จ๊ธฐ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๊ฒ ์ต๋๊น client_id=False
์์ prepare_request_body()
CLIENT_ID๊ฐ ์๋์ ํ์ํ๊ธฐ ์ํด ๋์์ด ํ์ธํ ์ ์์ต๋๋ค? ๊ทธ๋ ๋ค๊ณ ํด๋ 126ํ ๊ทผ์ฒ์์ ์ด ์ถ์
ํจ์ ์ด๋ํ ๊ฒ์
๋๋ค.
client_id = None if client_id=False else self.client_id
์, ์๊ฒ ์ต๋๋ค.
client_id๋ฅผ ๋ณด๋ด์ผ ํ๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ ๋ํ ๊ธฐ์กด ๋จ์ ํ ์คํธ๊ฐ ์์ต๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ชฉ๋ก์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ชฉ๋ก์ด ์๋ ์ฌ๋์ด ์์ต๋๊น? ์ง๊ธ ๋น์ฅ ๋ด ์์ ์ค ์ผ๋ถ๋ฅผ ์ฐจ๋จํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ์ ์์ฒญ oauthlib๋ฅผ ์์ ํ๋ ๋ฐ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค.
@JonathanHuot
args์์ client_id๋ฅผ ์ ๊ฑฐํ๊ณ include_client=True/False์ ๊ฐ์ ์ ์ธ์๋ฅผ prepare_request_body์ ์ถ๊ฐํ์ฌ ๋ณธ๋ฌธ์ client_id์ client_secret์ ๋ชจ๋ ์ถ๊ฐํ๊ฑฐ๋ ๋ ๋ค ํฌํจํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ค์ ์ฝ์ด๋ณด๋ ๋น์ ์ ์ ์์ด ์ ๋ง ๋ง์์ ๋ญ๋๋ค. ํจ์๊ฐ ์ด๋ฏธ **kwargs
์ทจํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์๋ง๋ ๊นจ์ง์ง ์๋ ๋ฐฉ์์ผ๋ก ๊ทธ๊ฒ์ ํ ์ ์์ ๊ฒ์
๋๋ค.
ํ ๊ฐ์ง ์ฐธ๊ณ ์ฌํญ:
๋ณธ๋ฌธ์ client_id์ client_secret์ ๋ชจ๋ ์ถ๊ฐํ๋ ค๋ฉด
์ด๊ฒ์ ๊ณต๊ฐ ํด๋ผ์ด์ธํธ IIUC์ ๊ดํ ๊ฒ์ด๋ฏ๋ก client_secret
๊ฐ ๊ด๋ จ๋์ด ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. client_id
์ด ๋ณธ๋ฌธ์ ์ถ๊ฐ๋๋ ๊ฒ๋ฟ์
๋๊น? ์ด ๊ฒฝ์ฐ ์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ include_client_id=True/False
๋ฐ๊พธ๋ ๊ฒ๋ ๊ณ ๋ คํ ๊ฒ์
๋๋ค.
์ด ๊ฒฝ์ฐ ์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ include_client_id=True/False๋ก ๋ฐ๊พธ๋ ๊ฒ๋ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
๋ฌผ๋ก ! client_secret
๊ทธ๊ฒ์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ด์ฌํ์ง ์์ต๋๋ค WebApplicationClient
.
@jvanasco , PR์ ํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
1) https://github.com/oauthlib/oauthlib/pull/505 ๋๋๋ฆฌ๊ธฐ
2) ๋ณ๊ฒฝ ์๋ช
prepare_request_body()
์ ๊ฑฐํฉ๋๋ค client_id
์ถ๊ฐํฉ๋๋ค include_client_id=True/False
( True
(๊ธฐ๋ณธ๊ฐ) :์ด ์ถ๊ฐ self.client_id
)
๊ทธ๋ฐ ๋ค์ requests-oauthlib๋ https://github.com/requests/requests-oauthlib/blob/master/requests_oauthlib/oauth2_session.py#L196-L211์์ ๋ค์ ์ค ํ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
A) ๋ณธ๋ฌธ์ client_id
๋ง ํฌํจ
self._client.prepare_request_body(..)
B) client_id
๋ฐ client_secret
๋ฅผ auth
ํฌํจํ๊ณ ๋ณธ๋ฌธ์๋ ํฌํจํ์ง ์์(RFC ๊ธฐ๋ณธ ์๋ฃจ์
)
self._client.prepare_request_body(include_client_id=False, ..)
auth = requests.auth.HTTPBasicAuth(client_id, client_secret)
C) ๋ณธ๋ฌธ์ client_id
๋ฐ client_secret
(RFC ๋์ฒด ์๋ฃจ์
)
self._client.prepare_request_body(client_secret=client_secret, ..)
์ค๋ ๋ ํ๋ก์ ํธ์ ๋ํ PR์ ์์ฑํ๊ฒ ์ต๋๋ค.
OAuthlib์ ๋ํ PR ๋ฐ ํ ์คํธ๋ฅผ ๊ฑฐ์ ์๋ฃํ์ต๋๋ค. ์ง๋ฌธ์ด ์์ต๋๋ค๋ง...
client_id
์ฌ์ ํ kwarg๋ก ํ์ฉ๋์ด์ผ ํฉ๋๊น? ์ด๋ ๋ถ๋ถ์ ์ผ๋ก ํ์ ํธํ์ฑ์ ์ํ ๊ฒ์ด์ง๋ง ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ด ๋ฐฉ๋ฒ์ด ๋ค์ ์๋ชป๋์๊ธฐ ๋๋ฌธ์ ์๋ํ ๋๋ก ์๋ํ๊ฒ ๋ง๋ค๊ฑฐ๋( prepare_request_body
์์ self.client_id๋ฅผ ์ฌ์ ์ํ๋๋ก ํ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ด) ์๋ชป๋ ์ฌ์ฉ์ ๋ํด ์์ธ๋ฅผ ๋ฐ์์ํค๋(์๋ฅผ ๋ค์ด client_id
๊ฐ ์ ๊ณต๋์์ง๋ง self.client_id
์ ์ผ์นํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
client_id
๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ฌ์ ์ํ๋ ค๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชปํ๋ฏ๋ก ๋ค๋ฅผ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋ฐ ํฌํํ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋ ๋ํ, ๋ก๊ทธ์ธํด์ผ DeprecationWarning
์ ๊ฒฝ์ฐ client_id
kwarg ๋ชจ๋ ์ ๊ณต๋์๋ค?
PR #593์ด ์ ์ถ๋์์ต๋๋ค. client_id
๊ฐ ์ ์ถ๋๋ฉด DeprecationWarning ์ ๋ฐ์์ํค๊ณ self.client_id
์ ๋ค๋ฅด๋ฉด ValueError ๋ฅผ ๋ฐ์์ํต๋๋ค. @JonathanHuot๊ฐ ์์ธํ ์ค๋ช
ํ ์ธ ๊ฐ์ง ์๋๋ฆฌ์ค๋ฅผ ์ค์ํ๋์ง ํ์ธํ๋ ์๋ก์ด ํ
์คํธ๋ ์์ต๋๋ค.
๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์์ฑํ ๋ requests-oauthlib PR ํ๋ณด์ ๋ํ ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๊ทธ๊ฒ์ ํญ์ ํธ์ถ prepare_request_body
๊ฐ์ง username=username, password=password
. ์ด๊ฒ์ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ ๋๊ตฐ๊ฐ๊ฐ RFC์ ๋ ์ต์ํ๊ณ ๋ค์์ ๋ํ ๋ต์ ์๊ณ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
username
+ password
๊ฐ request.body ์ ๋งค๊ฐ๋ณ์์ฌ์ผ ํฉ๋๊น?username
+ password
๊ฐ HTTP ๊ธฐ๋ณธ ์ธ์ฆ ํค๋์ ๋ํ๋๋ฉด ์์ฒญ ๋ณธ๋ฌธ์ ์ค๋ณต๋์ด์ผ ํฉ๋๊น?username
+ password
๋ณธ๋ฌธ ๋งค๊ฐ๋ณ์์ ํด๋ผ์ด์ธํธ ์ธ๋ถ์ ๋ณด๊ฐ ํฌํจ๋ HTTPBasicAuth ํค๋๋ฅผ ๋ชจ๋ ๊ฐ์ง ์ ์์ต๋๊น?์คํํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
username
๋ฐ password
๋ ํญ์ ์์ฒญ ๋ณธ๋ฌธ์ ์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ๊ถํ ๋ถ์ฌ(์์์ , ์ฝ๋, ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช
)์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.client_secret
)). ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช
์ HTTP ๊ธฐ๋ณธ ์ธ์ฆ์ด ์๋ ์ด์ผ ํฉ๋๋ค.๊ฐ์ฌ ํด์. ๋ ๊ฐ์ง๋ง ๋ช ํํ ํ๊ณ , ์ ๊ฐ ๋ค์ฏ ์ด์ธ ๊ฒ์ฒ๋ผ ์์ ๋กญ๊ฒ ์ด์ผ๊ธฐํด ์ฃผ์ญ์์ค. ์ด ํ ์คํธ์ ํ ์คํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๊ณ ์ถ์ต๋๋ค.
๋ช ์์ ์ผ๋ก ์ง์ ๋์ง ์๋ ํ ์กด์ฌํด์๋ ์ ๋ฉ๋๋ค. ๋ง์ต๋๊น?
์ด ์์ ์ธ๋ถ ์ฌํญ์ ๋ํด ์ฅํฉํ๊ณ ์ง์ฐฉํ๋ ์ ๋ฅผ ์ฉ์ํด ์ฃผ์ญ์์ค. j๊ฐ ์ฌ๋ฐ๋ฅธ ๋์์ ์ทจํ๊ณ ๋ ๋ค๋ฅธ ํ๊ท๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ ์คํธ๋ฅผ ์์ฑํ ์ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค.
@jvanasco , OAuth2 RFC์ ๋ํด ๋งํ ์ ์์ง๋ง requests-oauthlib
์ flask-oauthlib
์ด๋ป๊ฒ ๋ง๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ณ์.
๋ด๊ฐ ์ดํดํ์ง๋ง ํ์ฅ์ ํ์ค๊ณผ ๋์กฐํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค. ์ฆ, requests-oauthlib ๋ฐ ๋ค๋ฅธ ๊ณต๊ฐ ๊ณต๊ธ์ ๊ฒฝํ. ์ฌ๋ฌ ์์ฒญ-oauthlib ํ ๋ก https://github.com/requests/requests-oauthlib/issues/218 , https://github.com/requests/requests-oauthlib/issues/211 , https://github.com/requests /requests-oauthlib/issues/264 , ์ด๋ฏธ ๋ฐ์ํ์ต๋๋ค.
๋๋ ๊ทธ๋ค์ด client password
์ client secret
์ฌ์ด์ ํผ๋์ด ์์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ์ค์ ๋ก ์ ํํ ๊ฐ์ ๊ฒ์ ๋ํ ๋ ๊ฐ์ง ํํ์
๋๋ค.
https://github.com/requests/requests-oauthlib/pull/206 ๋ค์ ์๋ ๊ทผ๊ฑฐ๋ฅผ ๋ฐ๋ฅธ๋ค๋ฉด PR์ ๋ด์ฉ์ HTTPAuth(username, password)
์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ์๋ ์์ง๋ง HTTPAuth(client_id, client_secret
์ฌ์ผ ํฉ๋๋ค. (ํด๋ผ์ด์ธํธ์ ๋น๋ฐ๋ฒํธ).
requests-oauthlib์ ํ ๋ก ์ ์ฐธ์ฌํ @Lukasa , @chaosct , @ibuchanan ์ ์ฐ๋ฅด์ญ์์ค.
์์ฒญ๋! ์ ๋ง ๊ณ ๋ง์. ๋๋ ๊ทธ๊ฒ์ด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์๊ฐํ์ง๋ง ํ์ธํ๊ณ ์ถ์์ต๋๋ค.
์ด์ ์์ฒญ ๋ด์ฉ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฃผ์ ์์ฒญ ํ๋ก์ ํธ์ ๋ํ ์ปค๋ฐ์ด ๋ช ๊ฐ ์์ผ๋ฏ๋ก ์ ์ง ๊ด๋ฆฌ์๊ฐ PR ๋ฐ ๊ธฐ๋ฅ์์ ๋ฌด์์ ๋ณด๊ณ ์ถ์ดํ๋์ง ์๊ณ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ ์ด๋ฅผ ํ์๋ก ํ๋ ํน์ ์ ํ์ ๊ถํ ๋ถ์ฌ์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์์ฒญ ๋ณธ๋ฌธ์๋ง ์กด์ฌํ ์ ์์ต๋๋ค.
์, ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ํน์ ์ ํ์ ๋ณด์กฐ๊ธ์๋ง ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฒญ ๋ณธ๋ฌธ์ ๋ณด๋ด๋ ๊ฒ์ ๋ํ ๋ ๋ฒ์งธ ๋ถ๋ถ์์ ์ฌ์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
์์ฒญ ๋ณธ๋ฌธ์ ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ํฌํจ
๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
์ง์ ํ์ฉํ ์ ์๋ ํด๋ผ์ด์ธํธ๋ก ์ ํ๋์ด์ผ ํฉ๋๋ค(SHOULD).
HTTP ๊ธฐ๋ณธ ์ธ์ฆ ์ฒด๊ณ...
๊ทธ๋ฌ๋ ์๋ฒ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฝ์ต๋๋ค.
์ธ์ฆ ์๋ฒ๋ ๋ค์์ ์ง์ํ ์ ์์ต๋๋ค.
์์ฒญ ๋ณธ๋ฌธ์ ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ...
์ค์ ํด๋ผ์ด์ธํธ๋ ์์ฒญ ๋ณธ๋ฌธ์ ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ด์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ถ๋ถ์ ์ผ๋ก ๊ตฌํ๋ ์ผ๋ถ ์๋ฒ์ ๊ฒฝ์ฐ ์์ฒญ ๋ณธ๋ฌธ์์๋ง ์๋ฝํฉ๋๋ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ค๋ฉด ๋ด PR์ ์ธ์ฆ ํค๋๋ฅผ ์ถ๊ฐํ์ฌ์ด ํผ๋์ ํด๊ฒฐํ์ต๋๋ค.
๊ทธ๋์ ํด๋ผ์ด์ธํธ๋ ๋ ๋ค ๋ณด๋
๋๋ค.
๋๋ @JonathanHuot ๊ฐ ๋ ๋ฒ์งธ ์์ ์ ๋ํด ์ ํํ๋ค๊ณ ๋ฏฟ์ต๋๋ค.
@ibuchanan ๋ , ๊ทํ๊ฐ ์ธ๊ธํ ์ธ์ฉ๋ฌธ์ client credentials
์ฉ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ์ ๋ฆฌ์์ค ์์ ์(์ค์ ์ฌ์ฉ์)๊ฐ ์์ด์ง ์๋๋ก ๋งค์ฐ ์ฃผ์ํด์ผ ํฉ๋๋ค.
์ญํ ์ ์ฌ๊ธฐ rfc6749#1.1์ ๋ช
ํํ๊ฒ ์ค๋ช
๋์ด ์์ต๋๋ค.
์ด client credentials
๋ client_id
๋ฐ client_secret
์ฐธ์กฐํ๊ณ ๋ฆฌ์์ค ์์ ์๋ username
๋ฐ password
ํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ตํํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ํด๋น ์ญํ ๋ก RFC๋ฅผ ์ฝ๋ ๊ฒ์ ์ค์ ํด๋ผ์ด์ธํธ๊ฐ HTTP Basic์์ ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช
( client_id
, client_secret
)์ ๋ณด๋ด์ผ ํ๊ณ ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช
( username
, password
) ์์ฒญ ๋ณธ๋ฌธ์ (์ฌ๊ธฐ์ ๋์์ ์ฝ์ง ๋ง์ญ์์ค); rfc6749#4.3.2๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
client_id๊ฐ ์์ฒญ์ ์๋ ๊ฒฝ์ฐ ์ผ๋ถ ์๋ฒ๋ ์์ฒญ์ ๊ฑฐ๋ถํฉ๋๋ค(400).
์ ์ฒด. ๊ธฐ๋ณธ๊ฐ์ ์ฌ์์์ ๊ถ์ฅํ๋ ๊ฒ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ธ. oauthlib
๋ํ ํ์ฌ PR์ด ์์ ๋ฌธ์ ๋ฅผ ์ถฉ์กฑํ๋ค๊ณ ์๊ฐํฉ๋๋ค. include_client_id
ํ๋๊ทธ๋ client_id
์ ์ก ์ฌ๋ถ๋ฅผ ๋ช
์์ ์ผ๋ก ํ์ฉํฉ๋๋ค.
requests_oauthlib
์์ ์ด๊ฒ์ด ๋ด๊ฐ ์๊ฐํ๋ ๊ฒ์
๋๋ค.
username
๋ฐ password
๋ ๋ณธ๋ฌธ์๋ง ๋ํ๋ฉ๋๋ค(HTTP ๊ธฐ๋ณธ์ด ์๋). ๊ทธ ํ๋์ด ๋น ํธํ ์๋ฒ ํตํฉ์ ์ํด ํ์ํ ๊ฒฝ์ฐ, ๊ตฌํ์ ์ ์ถํ ์ ์์ต๋๋ค auth
๋๋ headers
์ ์ธ์ fetch_token()
.
client_id
๋ฅผ ์ฌ๋ฐ๋ฅธ ์์น์ ์ ๊ณตํ๋ ๊ฒ์ ์ฝ๊ฐ ์ฑ๊ฐ์ ์ผ์ด์ง๋ง ๋
ผ๋ฆฌ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ค์ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ํ์คํ ์ฝ๊ฐ์ ๊ฒํ ๊ฐ ํ์ํฉ๋๋ค.
๋ด๊ฐ @JonathanHuot ๋ฐ @ibuchanan ์ํด ๊ฐ์ง๊ณ ์ง๋ฌธ :
oauthlib
์ OAuth2 Client
๋ฐ requests_oauthlib
์ OAuth2Session
๋ client_secret
์ ์งํ์ง ์์ผ๋ฉฐ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ OAuth1์ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉฐ ์ด๊ฒ์ด #370์ ์ค์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. RFC๋ ์ด์ ๋ํ ํ์์ฑ์ ์ธ๊ธํ์ง ์์์ผ๋ฉฐ ๋๋ ์ด๋ค ๊ธฐ๋ก๋ ์ฐพ์ ์ ์์์ต๋๋ค.
๋์๊ฒ client_secret
๋ฅผ ์ ์ฅํ์ฌ ํด๋ผ์ด์ธํธ๋ฅผ ํ์ฅํ๊ณ fetch_token
๋ฐ request
client_secret
์ ๋ฌ์ ๋ํ OAuth2Session ์์กด์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค request
ํ์ฌ ํด๋ผ์ด์ธํธ ์์ฒด์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฐฌ์ฑํฉ๋๋ค. (์ด๋ https://github.com/requests/requests-oauthlib/issues/264์ ๋ณด๊ณ ๋ ๋ค๋ฅธ ๋ถ์ผ์น๋ ํด๊ฒฐํฉ๋๋ค.)
username/password ๋ฐ client_id/client_secret์ ๋ํ ํ ์คํธ ๋ณ์๋ฅผ ํ์คํํ๊ธฐ ์ํด oauthlib(#593)์ PR์ ์ฝ๊ฐ ๋ณ๊ฒฝํ์ต๋๋ค. ์์ผ๋ก ์ด ๋ ์ฌ์ด์ ํผ๋์ ์ผ์ผํค๋ ์ค์๋ฅผ ๋ฐฉ์งํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
requests-oauthlib์ ๋ํด ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ: https://github.com/requests/requests-oauthlib/compare/master...jvanasco :fix-oauthlib_client_id
์ด๊ฒ์ ์ข ๋ ๊ณผ๊ฐํฉ๋๋ค. ์ฝ๋์ ํ ์คํธ๋ฅผ ๋ณด๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํด์๋ ์ ๋๋ ๋ชจ๋ ์ข ๋ฅ์ ์ผ์ ์๋์ํค๋ ค๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์์ ์ ์ํํฉ๋๋ค.
username
๋ฐ password
์ LegacyApplicationClient
์ธ์คํด์ค์ ๋ํด์๋ง ๋ฐ์ํฉ๋๋ค. ํ์ํ ์ ์ผํ ์ข
๋ฅ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค(๋ง์ต๋๊น?). ๊ฒ์ฌ ์๋์ ์ฌ์ฉ์ ์ด๋ฆ/์ํธ๋ฅผ kwargs ์ฌ์ ์ ๋ณํฉํ๋ ์น์
์ด ์์ต๋๋ค. ํ
์คํธ ๊ฒฐ๊ณผ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๊ฐ ์ด ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์์์ ์์ฌํ๊ธฐ ๋๋ฌธ์ ํ์ฌ๋ ๋ด์ด์ฐ๊ธฐ๋์ด ์์ต๋๋ค.
client_id/auth ํค๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ผ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ธ์ฆ์ด ์ฌ๋ฐ๋ฅธ ์์น์์ ๋ฐ์ํ๋๋ก ๋ค์ ์์ฑ๋์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์๊ฒฉ ์ฆ๋ช ์ ๊ฐ์ ์ ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ์ ํ ๊ฐ๋ฅํฉ๋๋ค.
์ง๋ฌธ: client_secret
๊ฐ ํต๊ณผ๋์ง ์๋ ์ํฉ์ด ์์ต๋๊น? ์๋ฌด ์๊ฐ์ด ์ ๋์ง๋ง oAuth ํ๋ฆ์ด ๋ง์ด ์์ต๋๋ค.
๊ทธ๋์ requests-oauthlib ๋ฒ์ ์์:
| include_client_id
| auth
| ํ๋ |
| ------------------- | --------------- | -------- |
| ์์(๊ธฐ๋ณธ๊ฐ) | ์์(๊ธฐ๋ณธ๊ฐ) | client_id
์ฌ์ฉํ์ฌ Auth ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค. ๋ณธ๋ฌธ์ client_id๋ฅผ ๋ณด๋ด์ง ๋ง์ญ์์ค. ์ด๊ฒ์ RFC์์ ๊ถ์ฅํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๋์์
๋๋ค. |
| ์์(๊ธฐ๋ณธ๊ฐ) | ์ ๋ฌผ | Auth ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค. include_client_id=False
oauthlib์ prepare_request_body
ํธ์ถ |
| ๊ฑฐ์ง | ์ ๋ฌผ | Auth ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค. include_client_id=False
oauthlib์ prepare_request_body
ํธ์ถ |
| ์ฌ์ค | ์ ๋ฌผ | Auth ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค. include_client_id=True
oauthlib์ prepare_request_body
ํธ์ถ |
| ์ฌ์ค | ์์(๊ธฐ๋ณธ๊ฐ) | client_id
์ฌ์ฉํ์ฌ Auth ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค. include_client_id=True
oauthlib์ prepare_request_body
ํธ์ถ |
| ๊ฑฐ์ง | ์์(๊ธฐ๋ณธ๊ฐ) | client_id
์ฌ์ฉํ์ฌ Auth ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค. include_client_id=False
oauthlib์ prepare_request_body
ํธ์ถ |
๋๋ ๋ฌ๋ฆฌ ๋ช ์:
@jvanasco : oauthlib ๋ฐ requests-oauthlib ์ธก์์ ๋งค์ฐ ์ข์ ๋ณด์ ๋๋ค.
๊ทํ์ 3. ์ง๋ฌธ์ ๋ํด:
client_secret ์์ด ๊ณต๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค(๋๋ RFC์ ๊ด์ ์์ ๋น์ด ์์). ๋ฐ๋ผ์ ํ์ด์ฌ API๋ "๋น๋ฐ ์์"์ ์ง์ํด์ผ ํฉ๋๋ค.
์ค์ ์ฌ์ฉ ์ฌ๋ก๋ ์ข
์ข
์ธ์ฆ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ์ง๋ง ๋น๋ฐ์ ์์ ํ๊ฒ ์ ์งํ๋ ๊ฒ์ ๋ํ ๋ณด์์ ๋ณด์ฅํ ์ ์์ผ๋ฏ๋ก client_secret
์์ด client_id
๋ฅผ ์๋ฝํ๊ฑฐ๋ client_secret
(๋๋ RFC์ ๋์ผํ ๋น client_secret
); ๋๋ ๋ค๋ฅธ PKCE RFC๋ ์ฌ์ฉํ ์ ์์ต๋๋ค(https://oauth.net/2/pkce/ ์ฐธ์กฐ). ๊ทธ๋ฌ๋ ํ์๋ ์์ง oauthlib
์ธก์์ ๊ตฌํ๋์ง ์์์ต๋๋ค.
๊ฐ์ฌ ํด์. client_id
์์ด client_secret
client_id
๋ฅผ ์ ์ถํ ์ ์๋๋ก ๋ช ๊ฐ์ง ํ
์คํธ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค. ๋๋ฌด ๋ง์ ์ง๋ฌธ์ ํด์ ์ฃ์กํฉ๋๋ค. ์ด ์ฌ์์ ๊ฐ๋ฅํ ์ฌ๋ฐ๋ฅธ ๊ตฌํ์ด ๋๋ฌด ๋ง์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ์๋ํด์ผ ํ๋ ๋ ๊นจ์ง ๊ตฌํ๋ ์์ต๋๋ค).
@JonathanHuot ๊ธฐ์กด ๊ตฌํ์ client_secret
๋ํ ๋น ๋ฌธ์์ด ์ ์ก์ ์ง์ํ์ง ์์ต๋๋ค. ์ด ๋
ผ๋ฆฌ์์ ์ ๊ฑฐ๋์์ต๋๋ค. https://github.com/oauthlib/oauthlib/blob/master/oauthlib/oauth2/rfc6749/parameters.py#L90 -L125 -- ํนํ 122ํ
์ด๋ฅผ ์ง์ํ๋ ๊ฒ์ ํด๋น ๋ฃจํด ์งํ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
if ('client_secret' in kwargs) and ('client_secret' not in params):
if kwargs['client_secret'] == '':
params.append((unicode_type('client_secret'), kwargs['client_secret']))
๋น๋ฐ์ด ๋น ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ client_secret
์ ๋ํ ๋น ๋ฌธ์์ด์ ๋ณด๋ด์ง๋ง ๊ฐ์ด None
์ด๋ฉด client_secret
๋ณด๋ด์ง ์์ต๋๋ค.
RFC๊ฐ ๋ ๊ฐ์ง ๋ณํ ์ค ํ๋๋ฅผ ์ง์ํ๋ค๋ฉด... ํ๋์ ๋ณํ๋ง ์ง์ํ๋ ๋ง์ ๊นจ์ง ๊ตฌํ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ง์ํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์๋ ๋ฌธ์ ๋ oauthlib์์ ์์ ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋์์ https://github.com/requests/requests-oauthlib/pull/331 ์ด ์์ ๋ ๋๊น์ง ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
client_id
๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ฌ์ ์ํ๋ ค๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชปํ๋ฏ๋ก ๋ค๋ฅผ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋ฐ ํฌํํ ๊ฒ์ ๋๋ค.์ฐ๋ฆฌ๋ ๋ํ, ๋ก๊ทธ์ธํด์ผ
DeprecationWarning
์ ๊ฒฝ์ฐclient_id
kwarg ๋ชจ๋ ์ ๊ณต๋์๋ค?