Inflearn brand logo image

인프런 커뮤니티 질문&답변

moljin님의 프로필 이미지
moljin

작성한 질문수

FastAPI: Python으로 3배 빠르게, 2배 정확한, 10배 빠른 API 만들기

30강 질문: 토큰생성 관련

해결된 질문

작성

·

58

·

수정됨

1

30강을 완강후에

Postman을 통해 post로 http://127.0.0.1:8000/token으로 요청을 보냈는데 아래 처럼 응답으로 토큰이 날아오지 않습니다. 422 Unprocessable Content 에러가 나오구요~~

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") # http://<your_domain>/token
image.png

 뭐가 문제일런지요? postman사용법에 맞게 된것 같지가 않은데요.....

 @@@ 추가 질문

그리고, 더불어서 발급받은 토큰을 /docs에서 Authentication의 어디에 입력을 해서 테스트를 해야 하는지도 같이 안내바랍니다.

image.png

여기 client secret에 입력해서 테스트 하는것 같은데.... username, password를 입력해서 로그인하면 token은 잘 생성됩니다.

image.png

그리고 이렇게 username과 password로 로그인할 때 생성된 토큰으로 client secret에 입력해서 로그인하면 auth errorError: Unprocessable Content 라는 메시지가 뜹니다.

 

postman사용법이 미숙해서인지 postman에서 post /token으로 날려도 토큰이 반환되어 오질 않습니다. 당연히 docs에서 username, password로 로그인한 후에... 수정, 삭제 권한적용은 잘 적용됩니다.

답변 2

0

해여님의 프로필 이미지
해여
지식공유자

안녕하세요 🙂

강사 해여입니다!

 

가장 마지막에 올려주신 질문은 해결되었다는 말씀을 올려주신 것을 확인하였습니다!

 

혹시 이 질문도 해결이 되셨을까요?

아래 부분을 참고해보세요 🙂


문제의 원인은 요청 형식과 인증 UI의 올바른 사용법에 대한 오해 때문입니다.

---

FastAPI의 OAuth2PasswordRequestForm은 클라이언트가 JSON 형식이 아닌, 웹 폼(form)을

제출할 때 사용하는 application/x-www-form-urlencoded 형식으로 데이터를 보내줄 것이라고

예상합니다.

하지만 Postman에서 기본적으로 POST 요청의 Body를 설정하면 JSON으로 보내는

경우가 많기 때문에, 서버는 예상과 다른 형식의 데이터가 들어와 처리할 수 없다는 의미로 422

Unprocessable Content 에러를 반환하는 것입니다.


해결 방법 (Postman 설정):

1. Postman에서 새 요청을 열고, POST 메소드를 선택한 뒤 주소창에

http://127.0.0.1:8000/token을 입력합니다.

2. Body 탭을 선택합니다.

3. raw 대신 x-www-form-urlencoded를 선택합니다.

4. 아래 Key-Value 입력란에 다음과 같이 두 개의 필드를 추가합니다.

* KEY username, VALUE (등록한 사용자 이메일)

* KEY password, VALUE (등록한 사용자 비밀번호)

5. Send 버튼을 누릅니다.

이제 서버는 올바른 형식의 요청을 받았으므로, 성공적으로 인증을 처리하고 아래와 같이

access_token이 포함된 JSON 응답을 반환할 것입니다.

 

 

2. Swagger UI (/docs)에서 발급받은 토큰 사용법

올바른 사용법

1. 웹 브라우저에서 http://127.0.0.1:8000/docs로 접속합니다.

2. 오른쪽 상단에 있는 녹색 Authorize 버튼을 클릭합니다.

3. Available authorizations 라는 팝업창이 뜹니다. 여기서 client_idclient_secret

무시하고 비워두세요. 우리 프로젝트는 해당 방식(Authorization Code Flow)을 사용하지

않습니다.

4. Password flow 섹션에 있는 UsernamePassword 입력란만 채웁니다.

* Username: 등록한 사용자의 이메일 주소

* Password: 등록한 사용자의 비밀번호

5. 팝업창 하단의 Authorize 버튼을 클릭합니다. 인증이 성공하면 팝업창에 "Authorized"라고

표시되고, 자물쇠 아이콘이 잠금 상태로 바뀝니다. 이제 Close 버튼을 눌러 팝업을 닫습니다.

6. 이것으로 끝입니다! 이제부터 /docs 페이지에서 자물쇠가 걸려있는 API(예: GET /tasks, POST

/tasks 등)를 테스트하면, Swagger UI가 자동으로 모든 요청의 헤더에 `Authorization: Bearer

<발급된 토큰>`을 추가하여 보내줍니다.

이제 /tasks 엔드포인트의 "Try it out"을 클릭하고 "Execute"를 누르면, 인증이 필요한

요청이 성공적으로 전송될 것입니다. 별도로 토큰을 복사해서 붙여넣을 필요가 전혀 없습니다.


요약

* Postman: /token 요청 시 Body 타입을 raw (JSON)이 아닌 x-www-form-urlencoded로 설정하고,

username과 password를 Key-Value로 전달해야 합니다.

* Swagger UI /docs): Authorize 버튼을 눌러 나타난 팝업에서 username과 password로 한 번만

로그인하면, 그 이후의 모든 API 테스트 요청에 토큰이 자동으로 포함됩니다. client_secret

필드는 사용하지 않습니다.

 

 

moljin님의 프로필 이미지
moljin
질문자

마지막 질문인 /docs에서 is_admin이 true인 관리자 권한에서 users/all 페이지의 read_all_users 함수 실행관련한 질문이 아직 해결되지 않았습니다. 확인부탁드립니다.

 

이번 질문에 대한 답변 감사합니다. 그런데, 답변 주신 것처럼 서버실행후 postman에서 /token 주소로 post요청을 보내지 않고, 그냥 username과 password에 입력값을 채우고 authorize버튼을 눌러도 그냥 로그인이 됩니다. postman에 /token 주소로 post요청하여 받은 access_token토큰이 굳이 필요없는데, postman에서 /token 주소로 post요청을 하는 것은 그냥 테스트용으로 하는 확인차원인가요?

해여님의 프로필 이미지
해여
지식공유자

안녕하세요!

강사해여입니다! 굉장히 흥미로운 부분을 스스로 발견하셨군요 🙂


/docs 페이지의 Authorize 버튼은 개발자의 편의를 위해 만들어진 기능입니다.

버튼을 누르고 아이디/비밀번호를 입력하면, Swagger UI가 백그라운드에서 자동으로
다음의 모든 일을 처리해 줍니다.

  • /token 엔드포인트로 x-www-form-urlencoded 형식의 POST 요청을 보냅니다.

  • 응답으로 받은 access_token을 브라우저의 임시 저장 공간에

    저장합니다.

     

  • 이후 잠금 표시가 있는 API를 호출할 때마다, 저장해 둔 토큰을

    Authorization: Bearer <토큰> 헤더에 자동으로 추가하여 요청을

    보냅니다.

이 모든 과정이 자동화되어 있기 때문에, 개발자는 토큰 발급 과정을 신경 쓸 필요 없이 API의 로직이 잘 동작하는지만 빠르고 편하게 테스트할 수 있습니다.

moljin님의 프로필 이미지
moljin
질문자

말씀해주신 것은 몇번 해보니 그렇다는 것을 이해 햇습니다. 그럼 postman에서 /token으로 보내는 post요청은 테스트라고 보면 무방하겠군요. 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. moljin님.

질문하신 “Method Not Allowed” 오류는 주로 HTTP 요청 메서드가 잘못 설정되었을 때 발생합니다. 보통 토큰 생성(endpoint) 요청은 POST 메서드를 사용해야 합니다. 따라서, /token 경로로 GET이 아닌 POST 요청을 보내야 합니다. 이를 확인하고 시도해보시길 권장드립니다.

FastAPI에서 OAuth2PasswordBearer는 토큰 사용을 지원합니다. 텍스트만을 통해 문제를 진단하는 것은 어려운 점이 있으니, 다음의 단계를 따라 오류를 해결하는 것이 좋습니다.

  1. 토큰 엔드포인트 확인:

    • oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") 라고 설정했다면, 여러분의 FastAPI 서버를 통해 /token 경로로 POST 요청을 보내야 합니다.
  2. POST 요청 시도:

    • 툴(예: Postman)을 사용하여 /token 에 대해 POST 요청을 보내는 방법을 사용해 보세요. 이때 필요한 인증 정보(예: 사용자 이름과 비밀번호)를 제공해야 합니다.
  3. 토큰 발급 및 확인:

    • 응답으로 토큰이 반환된다면, 다음으로 /docs 페이지에서 API 문서에 들어가서 “Authorize” 버튼을 클릭하고, 발급된 토큰을 입력란에 넣고 인증하시기 바랍니다. 보통, Bearer <Token> 형태로 입력합니다.

추가적인 혈후와 정보는 이전에 유사한 문제에 대한 답변들이 Q&A 게시판에 있을 수 있으므로, 참고로 FastAPI JWT 인증 설정 방법을 확인해보시면 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

moljin님의 프로필 이미지
moljin

작성한 질문수

질문하기