해결된 질문
작성
·
58
·
수정됨
1
30강을 완강후에
Postman을 통해 post로 http://127.0.0.1:8000/token으로 요청을 보냈는데 아래 처럼 응답으로 토큰이 날아오지 않습니다. 422 Unprocessable Content 에러가 나오구요~~
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") # http://<your_domain>/token
뭐가 문제일런지요? postman사용법에 맞게 된것 같지가 않은데요.....
@@@ 추가 질문
그리고, 더불어서 발급받은 토큰을 /docs에서 Authentication의 어디에 입력을 해서 테스트를 해야 하는지도 같이 안내바랍니다.
여기 client secret에 입력해서 테스트 하는것 같은데.... username, password를 입력해서 로그인하면 token은 잘 생성됩니다.
그리고 이렇게 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_id
와 client_secret
은
무시하고 비워두세요. 우리 프로젝트는 해당 방식(Authorization Code Flow)을 사용하지
않습니다.
4. Password flow 섹션에 있는 Username
과 Password
입력란만 채웁니다.
* 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
필드는 사용하지 않습니다.
안녕하세요!
강사해여입니다! 굉장히 흥미로운 부분을 스스로 발견하셨군요 🙂
/docs 페이지의 Authorize 버튼은 개발자의 편의를 위해 만들어진 기능입니다.
버튼을 누르고 아이디/비밀번호를 입력하면, Swagger UI가 백그라운드에서 자동으로
다음의 모든 일을 처리해 줍니다.
/token 엔드포인트로 x-www-form-urlencoded 형식의 POST 요청을 보냅니다.
응답으로 받은 access_token을 브라우저의 임시 저장 공간에
저장합니다.
이후 잠금 표시가 있는 API를 호출할 때마다, 저장해 둔 토큰을
Authorization: Bearer <토큰> 헤더에 자동으로 추가하여 요청을
보냅니다.
이 모든 과정이 자동화되어 있기 때문에, 개발자는 토큰 발급 과정을 신경 쓸 필요 없이 API의 로직이 잘 동작하는지만 빠르고 편하게 테스트할 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. moljin님.
질문하신 “Method Not Allowed” 오류는 주로 HTTP 요청 메서드가 잘못 설정되었을 때 발생합니다. 보통 토큰 생성(endpoint) 요청은 POST
메서드를 사용해야 합니다. 따라서, /token
경로로 GET
이 아닌 POST
요청을 보내야 합니다. 이를 확인하고 시도해보시길 권장드립니다.
FastAPI에서 OAuth2PasswordBearer
는 토큰 사용을 지원합니다. 텍스트만을 통해 문제를 진단하는 것은 어려운 점이 있으니, 다음의 단계를 따라 오류를 해결하는 것이 좋습니다.
토큰 엔드포인트 확인:
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
라고 설정했다면, 여러분의 FastAPI 서버를 통해 /token
경로로 POST
요청을 보내야 합니다.POST 요청 시도:
/token
에 대해 POST
요청을 보내는 방법을 사용해 보세요. 이때 필요한 인증 정보(예: 사용자 이름과 비밀번호)를 제공해야 합니다.토큰 발급 및 확인:
/docs
페이지에서 API 문서에 들어가서 “Authorize” 버튼을 클릭하고, 발급된 토큰을 입력란에 넣고 인증하시기 바랍니다. 보통, Bearer <Token>
형태로 입력합니다.추가적인 혈후와 정보는 이전에 유사한 문제에 대한 답변들이 Q&A 게시판에 있을 수 있으므로, 참고로 FastAPI JWT 인증 설정 방법을 확인해보시면 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
마지막 질문인 /docs에서 is_admin이 true인 관리자 권한에서 users/all 페이지의 read_all_users 함수 실행관련한 질문이 아직 해결되지 않았습니다. 확인부탁드립니다.
이번 질문에 대한 답변 감사합니다. 그런데, 답변 주신 것처럼 서버실행후 postman에서 /token 주소로 post요청을 보내지 않고, 그냥 username과 password에 입력값을 채우고 authorize버튼을 눌러도 그냥 로그인이 됩니다. postman에 /token 주소로 post요청하여 받은 access_token토큰이 굳이 필요없는데, postman에서 /token 주소로 post요청을 하는 것은 그냥 테스트용으로 하는 확인차원인가요?