client_secret
λ° code_verifier
λ 쿼리 λ¬Έμμ΄μ 맀κ°λ³μλ‘ μ μ‘λ λ νμ©λ©λλ€.
Request.client_secret
λ ν€λλ λ³Έλ¬Έμ μ‘΄μ¬νλμ§ νμΈν΄μΌ νκ³ Request.code_verifier
λ λ³Έλ¬Έμλ§ μλμ§ νμΈν΄μΌ νμ§λ§ 쿼리 λ¬Έμμ΄μ λ―Όκ°ν λ°μ΄ν°κ° μλλ―λ‘ νμΈν΄μΌ ν©λλ€.
μμ² μ νμ΄ POST
μ΄κ³ λ°μ΄ν°κ° HTTPS
μ¬μ©νμ¬ μ μ‘λ κ²κ³Ό κ°μ μΆκ° κ²μ¬κ° μνλ μ μμ΅λλ€.
client_secret
λλ code_verifier
κ° μΏΌλ¦¬ λ¬Έμμ΄λ‘ μ μ‘λλ©΄ μλͺ»λ μμ²μ΄ λ°μνμ¬ ν΄λΌμ΄μΈνΈκ° λ°μ΄ν°λ₯Ό μμ νκ² λ³΄λ΄λλ‘ ν΄μΌ ν©λλ€.
μλ νμΈμ @polamayster , λΉμ μ΄ μμ ν μ³μμ΅λλ€.
ꡬν λ°©λ²μ μ§μ νλ RFC μΉμ μ μΆκ°νκ³ μμ΅λλ€.
OAuth2.0 RFC μΉμ :
https://tools.ietf.org/html/rfc6749#section -2.3.1
2.3.1. Client Password
Clients in possession of a client password
MAY use the HTTP Basic authentication scheme (..)
Alternatively, the authorization server
MAY support including the client credentials in the request-body (..)
The parameters can only be transmitted in the request-body and
MUST NOT be included in the request URI.
PKCE RFC μΉμ :
https://tools.ietf.org/html/rfc7636#section -4.5
4.5. Client Sends the Authorization Code and the Code Verifier to the
Token Endpoint
In addition to the parameters defined in the OAuth 2.0 Access
Token Request (Section 4.1.3 of [RFC6749]), it sends the following parameter:
code_verifier
REQUIRED. Code verifier
https://tools.ietf.org/html/rfc6749#section -4.1.3
4.1.3. Access Token Request
The client makes a request to the token endpoint by sending the
following parameters (..) in the HTTP request entity-body:
κ·Έλμ λλ κ·Έ λ¬Έμ μ νλΉμ±μ λν΄ μμ¬μ μ¬μ§κ° μμ΅λλ€. μ΄λ€ PRλ νμν©λλ€!
λλ μ΄κ²μ λ°μλ€μ΄λ λ° κ΄μ¬μ΄ μμ κ²μ΄λ€. 곧 ν 리νμ€νΈλ₯Ό μ μΆν μμ μ λλ€.
μ΄ λμμ μ격 μ¦λͺ μ΄ νμν μμ²μ΄λ μΌλ°μ μΈ μμ²μ λν΄μλ§ μνλμ΄μΌ ν©λκΉ?
λ΄ μ΄ν΄μ oauthlib.common.Request
ν΄λμ€μλ __getattr__
λ©μλμ _params
μ¬μ (쿼리 λ¬Έμμ΄ λ° λ³Έλ¬Έ 맀κ°λ³μμμ μ
λ°μ΄νΈλ¨) λ° client_secret
μ μ‘μΈμ€/κ°μ Έμ€λ €λ λͺ¨λ μμ² μ΄ μμ΅λλ€ client_secret
λλ code_verifier
λ λ³Έλ¬Έ λ°/λλ ν€λμμλ§ μ‘°νν΄μΌ ν©λλ€(λ―Όκ°ν λ°μ΄ν° μ‘°νλ₯Ό μν΄ λ³λμ μμ±μ κ°λ κ²μ΄ ν©λ¦¬μ μΌ μ μμ).
μκ² μ΅λλ€. μ€λ ν보λ₯Ό μ μΆνκ² μ΅λλ€.
2019λ 4μ 20μΌ ν μμΌ μ€ν 12:38 Bohdan < [email protected] μμ±:
λ΄ μ΄ν΄μ oauthlib.common.Request ν΄λμ€μλ __getattr__μ΄ μμ΅λλ€.
λ©μλ λ° _params μ¬μ (쿼리 λ¬Έμμ΄ λ° λ³Έλ¬Έμμ μ λ°μ΄νΈλ¨
λ§€κ° λ³μ) λ°νλ €κ³ λͺ¨λ μμ² μ‘μΈμ€ / GET client_secret λλ
code_verifierλ λ³Έλ¬Έ λ°/λλ ν€λμμλ§ μ‘°νν΄μΌ ν©λλ€(μλ§λ
λ―Όκ°ν λ°μ΄ν° μ‘°νλ₯Ό μν λ³λμ μμ±μ΄ μ ν©ν¨)β
λΉμ μ΄ λκΈμ λ¬μκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/oauthlib/oauthlib/issues/666#issuecomment-485157051 ,
λλ μ€λ λλ₯Ό μμκ±°
https://github.com/notifications/unsubscribe-auth/ABKEVQNFJUFGDB5X24JBOJDPRNWKBANNCNFSM4HHD7NNQ
.
λ΄ μ΄ν΄μ
oauthlib.common.Request
ν΄λμ€μλ__getattr__
λ©μλμ_params
μ¬μ (쿼리 λ¬Έμμ΄ λ° λ³Έλ¬Έ 맀κ°λ³μμμ μ λ°μ΄νΈλ¨) λ°client_secret
μ μ‘μΈμ€/κ°μ Έμ€λ €λ λͺ¨λ μμ² μ΄ μμ΅λλ€client_secret
λλcode_verifier
λ λ³Έλ¬Έ λ°/λλ ν€λμμλ§ μ‘°νν΄μΌ ν©λλ€(λ―Όκ°ν λ°μ΄ν° μ‘°νλ₯Ό μν΄ λ³λμ μμ±μ κ°λ κ²μ΄ ν©λ¦¬μ μΌ μ μμ).
λ°λΌμ κ²μ¬λ urlμ΄ μ€μ λ λκ° μλλΌ μμ± μ‘μΈμ€ μκ°μ μ΄λ£¨μ΄μ ΈμΌ ν©λκΉ? μμ² μμ±μ΄ μ΄κΈ°ν μ ν λ²λ§ μ€μ λλ©΄ λͺ¨λ μμ± μ‘μΈμ€ λμ λ°λ‘ κ²μ¬λ₯Ό μνν μ μμ΅λλ€. κ° μμ± μ‘μΈμ€μμ μ¬μ ν κ²μ¬λ₯Ό μνν΄μΌ νλ€κ³ μκ°νλ©΄ μλ €μ£Όμμμ€.
μ΄ λ¬Έμ κ° λ ν¬κ³ μ 체 /token
μλν¬μΈνΈμ μ μ©λλ€λ κ²μ μκ³ μμ΅λλ€. μ΄ λμ μ URLμ 맀κ°λ³μλ₯Ό νμ©ν΄μλ μ λ©λλ€(MUST NOT). κ·Έκ²μ νμ©λμ΄μλ μλ©λλ€.
λ΄μ± μλν¬μΈνΈλ μ ν©νλ€κ³ μκ°ν©λλ€. IIRCμ λ°λ₯΄λ©΄
HTTP μ¬μ, POST μμ²μ νμ 쿼리 맀κ°λ³μλ₯Ό 무μν΄μΌ ν©λλ€. λ§μ½μ
μ°λ¦¬λ μν₯μ λ―ΈμΉμ§ μκ³ λͺ¨λ λ¬Έμ λ₯Ό μλμΌλ‘ ν΄κ²°ν©λλ€.
μ ν¨ν μ¬μ© μ¬λ‘. λ€λ₯Έ HTTP λμ¬κ° μ΄λ»κ² λμν΄μΌ νλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€.
κ·Έλ¬λ λλ POST νλμ λν΄ νμ ν©λλ€. κ·Έκ² λ§λμ§ λκ° νμΈν μ μλμ
λμκ°μΌ ν λ°©ν₯μ?
>
λͺ¨λ POSTμ λν λͺ¨λ 쿼리 맀κ°λ³μλ₯Ό κ±°λΆνλ κ²μ 맀λ ₯μ μΈ μ§λ¦κΈΈμ λλ€! κ·Έλ¬λ oauthlibμ ResourceEndpointμ μΌλΆ μ¬μ©μκ° μ¬μ ν URLμ 쿼리 μΈμλ₯Ό μΆκ°ν μ μλ€λ μ¬μ€μ΄ κ±±μ λ©λλ€(κΆμ₯λμ§λ μμ§λ§ κΈ°μ μ μΌλ‘ μ¬μ ν κ°λ₯ν¨).
리μμ€ μλν¬μΈνΈμ λν μ°λ € μ¬νμ λν΄ μ’ λ μμΈν μ€λͺ ν΄ μ£Όμκ² μ΅λκΉ?
λ΄κ° λ³Ό λ POST μμ²μ μμ μ μΆ λλ APIλ₯Ό ν΅ν΄ μ΄λ£¨μ΄μ§λλ€.
νΈμΆ(λͺ
μμ μ½λ μμ±). λκ΅°κ°κ° λΆλΆμ μΆκ°νλ μ΄μ λ₯Ό λͺ¨λ₯΄κ² μ΅λλ€.
λ°μ΄ν°λ₯Ό 쿼리 맀κ°λ³μλ‘, λΆλΆ λ°μ΄ν°λ₯Ό ν¬μ€νΈ λ°μ΄ν°λ‘ μ¬μ©ν©λλ€. μ¬μ€, λ μ½κ²
λ μ€ νλμ μμ ν μ λ
νμμμ€.
μ€μ λ‘ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μμ²μ νλ κ²½μ° ν¨μ¬ λ μ½μ΅λλ€.
λͺ¨λ κ²μ λΆν νλ λμ ν¬μ€νΈ λ³Έλ¬ΈμΌλ‘ μΆκ°νμμμ€.
μ€λͺ
μ€λ₯κ° νμλλ κ²½μ° POSTμ 쿼리 맀κ°λ³μλ₯Ό μΆκ°νλ μ¬μ©μ,
빨리 μκ° κ΅μ ν μ μμ΄μΌ ν©λλ€.
λλ μ μ©ν λ λ―Ήμ€μΈμ΄λ λ°μ½λ μ΄ν°λ₯Ό λ§λ€ μ μμ΅λλ€.
쿼리 맀κ°λ³μκ° μλ POST μμ²μ λν μ€λ₯μ
λλ€.
μ΄μ λν λ λ€λ₯Έ κ°λ₯ν μ루μ
μ΄ μμ΅λλ€. λμ μ κ²½μ°( AuthorizationEndpoint
, IntrospectEndpoint
, RevocationEndpoint
); μμ² λ°©λ²μ΄ POST
ν΄λΉ μμ² μ ν¨μ± κ²μ¬ λ°©λ²μ 쿼리 맀κ°λ³μ κ²μ¬λ₯Ό μΆκ°ν μ μμ΅λλ€. ( TokenEndpoint
, MetadataEndpoint
)μ κ²½μ° μ²΄ν¬μΈ μλ΅ μμ± λ°©λ²μ μΆκ°ν μ μμ΅λλ€.
λλ μΌκ΄μ±μ μν΄ λͺ¨λ μλ΅ μμ± λ°©λ² λ΄λΆμ κ²μ¬ λ©μ»€λμ¦μ μΆκ°ν μ μμ΅λλ€. μ’μ μκ° κ°λμ?
_request_ μ ν¨μ± κ²μ¬ λ°©λ²μ μ¬μ©νλ κ²μ΄ λ°λμ§νλ€κ³ μκ°ν©λλ€.
POST
λ TokenEndpoint
, IntrospectEndpoint
λ° RevocationEndpoint
μλ§ ν΄λΉλ©λλ€. λ€λ₯Έ κ²λ€μ GET
: AuthorizationEndpoint
, MetadataEndpoint
μ
λλ€.
μΌλ°μ μΈ μ견: λ―Όκ°ν νλμ μ§μ€ν΄μΌ ν©λκΉ(μ: λΈλ리μ€νΈ μ μ§) μλλ©΄ λͺ¨λ OAuth2 맀κ°λ³μλ₯Ό κ±°λΆν΄μΌ νλμ(μ°λ¦¬λ NONEμ΄ μΏΌλ¦¬ URIμ μκΈ°λ₯Ό μν©λλ€. λ§μ΅λκΉ?)
μ΄μμ μΌλ‘λ 쿼리 URIμ NONEμ μν©λλ€. λλ λΈλ리μ€νΈμ κ°μ§
κΈ°μ‘΄ μ¬μ© μ¬λ‘λ₯Ό μλ°ν μ μλμ§ νμΈν©λλ€. OAuth2κ° μμ λΏλ§ μλλΌ
맀κ°λ³μλ νμ©λμ§λ§ 쿼리 맀κ°λ³μλ μ ν νμ©λμ§ μμ΅λλ€.
>
μμ²μμ λμ μΌλ‘ κ²μ¬λ₯Ό μ΄λνλ©΄ ν΄λΉ λμ μ λν λͺ¨λ 쿼리 λ§€κ° λ³μλ₯Ό λΉνμ±ννλ λ° λ¬Έμ κ° μμ΅λλ€!
μκ² μ΅λλ€. μ νν μλν¬μΈνΈμμ λͺ¨λ 쿼리 맀κ°λ³μλ₯Ό λΉνμ±ννκ² μ΅λλ€. 그리κ³
λν http λ©μλλ₯Ό POSTλ‘ μ ννκ³ μμ΅λλ€. λ§μ΅λκΉ?
https://github.com/oauthlib/oauthlib/pull/667 μμ μμ λμμ΅λλ€.
μ΄ λ³κ²½μ λν μ΄μ λ μ΄ν΄νμ§λ§ client_secret
λ₯Ό 쿼리 맀κ°λ³μλ‘ λ³΄λ΄λ ν΄λΌμ΄μΈνΈμ λν μ£Όμ λ³κ²½μΈ κ² κ°μ΅λλ€. μ΄μ λ²μ κ³Όμ νΈνμ±μ΄λ μ£Όμ λ²μ μΆ©λμ μμνμ κ²μ
λλ€. μ΄ λμμ΄ μλλ κ²μ
λκΉ?
μ°λ¦¬λ νμ¬ django-oauth-toolkitμ μ¬μ©νκ³ μμΌλ©° ν΄λΌμ΄μΈνΈλ username
, password
, client_secret
, client_id
λ° grant_type
λ₯Ό μΏΌλ¦¬λ‘ λ³΄λ΄κ³ μμ΅λλ€. 맀κ°λ³μ. λͺ¨λ κ²μ POST
맀κ°λ³μλ‘ μ μ‘νλλ‘ μ ννλ©΄ unsupported_grant_type
μ€λ₯κ° λ°μν©λλ€.
POSTμ λν 쿼리 μ§μμ μνλ λμλ³΄λ€ λ λ§μ λΆμμ©μ
λλ€. λλ κ·Έκ²μ΄ λΉμ μ ν΄λΌμ΄μΈνΈλ₯Ό λ§κ°λ¨λ¦°λ€λ κ²μ μ΄ν΄νλ―λ‘ <3.1
λν 보μ λ¬Έμ κ° ν¬ν¨λλ―λ‘ μ΅λν 빨리 μ
κ·Έλ μ΄λνλ κ²μ κ³ λ €νμμμ€(λΉλ°μ μ¬λ¬ μλνμ§ μμ μμΉμ κ±Έμ³ λ‘κ·Έ, νλ‘μμ νμλ¨).
κ°μ₯ μ μ©ν λκΈ
μλ νμΈμ @polamayster , λΉμ μ΄ μμ ν μ³μμ΅λλ€.
ꡬν λ°©λ²μ μ§μ νλ RFC μΉμ μ μΆκ°νκ³ μμ΅λλ€.
OAuth2.0 RFC μΉμ :
https://tools.ietf.org/html/rfc6749#section -2.3.1
PKCE RFC μΉμ :
https://tools.ietf.org/html/rfc7636#section -4.5
https://tools.ietf.org/html/rfc6749#section -4.1.3
κ·Έλμ λλ κ·Έ λ¬Έμ μ νλΉμ±μ λν΄ μμ¬μ μ¬μ§κ° μμ΅λλ€. μ΄λ€ PRλ νμν©λλ€!