Oauthlib: Client_secret 및 code_verifier(PKCE)λŠ” μ•ˆμ „ν•˜κ²Œ μ „μ†‘λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2019λ…„ 04μ›” 19일  Β·  19μ½”λ©˜νŠΈ  Β·  좜처: oauthlib/oauthlib

client_secret 및 code_verifier λŠ” 쿼리 λ¬Έμžμ—΄μ˜ λ§€κ°œλ³€μˆ˜λ‘œ 전솑될 λ•Œ ν—ˆμš©λ©λ‹ˆλ‹€.

Request.client_secret λŠ” ν—€λ”λ‚˜ 본문에 μ‘΄μž¬ν•˜λŠ”μ§€ 확인해야 ν•˜κ³  Request.code_verifier λŠ” λ³Έλ¬Έμ—λ§Œ μžˆλŠ”μ§€ 확인해야 ν•˜μ§€λ§Œ 쿼리 λ¬Έμžμ—΄μ€ λ―Όκ°ν•œ 데이터가 μ•„λ‹ˆλ―€λ‘œ 확인해야 ν•©λ‹ˆλ‹€.
μš”μ²­ μœ ν˜•μ΄ POST 이고 데이터가 HTTPS μ‚¬μš©ν•˜μ—¬ μ „μ†‘λœ 것과 같은 μΆ”κ°€ 검사가 μˆ˜ν–‰λ  수 μžˆμŠ΅λ‹ˆλ‹€.

client_secret λ˜λŠ” code_verifier κ°€ 쿼리 λ¬Έμžμ—΄λ‘œ μ „μ†‘λ˜λ©΄ 잘λͺ»λœ μš”μ²­μ΄ λ°œμƒν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ 보내도둝 ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Bug Contributor Friendly OAuth2-Provider

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @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도 ν™˜μ˜ν•©λ‹ˆλ‹€!

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

μ•ˆλ…•ν•˜μ„Έμš” @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
λ˜ν•œ λ³΄μ•ˆ λ¬Έμ œκ°€ ν¬ν•¨λ˜λ―€λ‘œ μ΅œλŒ€ν•œ 빨리 μ—…κ·Έλ ˆμ΄λ“œν•˜λŠ” 것을 κ³ λ €ν•˜μ‹­μ‹œμ˜€(비밀은 μ—¬λŸ¬ μ˜λ„ν•˜μ§€ μ•Šμ€ μœ„μΉ˜μ— 걸쳐 둜그, ν”„λ‘μ‹œμ— ν‘œμ‹œλ¨).

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