Udemy FastAPI 강의 - (11)
FastAPI - (11)
- FastAPI는 가장 빠르게 성장하는 API프레임워크
- swagger UI
- Udemy 강의 정리
인증

Authentication(인증)

- 인증과 일반적인 보안을 살펴보자
- 복잡한 주제
- 코드 기반의 많은 부분이 모든 애플리케이션의 보안 부분에 특별히 전용되는 것은 드문일이 아니다
- FastAPI만 다루는 것이 아니라 애플리케이션을 위한 완벽한 보안 솔루션에 대해 이야기 하는 것
- FastAPi에서 교장에 대한 명세의 실질적인 구현
- OAuth2와 사용자이름 및 비밀번호를 인증
- 사용자이름과 비밀번호를 만든다.
- 인증을 위한 엔드포인트가 있고 사용자에게 토큰을 생성한다
- 토큰을 검색하기 위해 두번째 엔드포인트을 호출하면 토큰을 로컬에 저장한다
- 토큰이 필요한 모든 보안 요청에 대해 사용하게 된다
- 정확히 어떤 요청이 보호되어야 하고 어떤 요청이 공개되어야 하는지는 API에서 정의한다

Securing an endpoint(앤드포인트 보안)
- 시스템에서 하나 이상의 메서드 · 엔드포인트를 보호하기 위한 매우 기본적인 기능을 구현
- 사용자 생성 및 열릴 지점을 갖게 된다.
- Article를 검색하기 위해 사용자를 생성할 수 있다
- 코드
- 새로운 폴더 auth를 생성
- oauth2.py 생성

-
FastAPI에 있는 보안 패키지를 가져온다

- 매개변수를 구현
- 스키마를 강조하기 위해 이 게시물을 호출
- 비밀번호 전달자의 호스트 지정
- 토큰검색을 위한 엔드포인트 제공
- 실제로 토큰 URL로 token으로 지정
- 엔드포인트를 생성하지는 않는다 엔드포인트는 스키마에 대한 토큰을 수신하는데 필요

- article에 인증 보안을 적용
- article.py에서 불러오기

-
코드 작성

- 코드 실행
- 오른쪽에 자물쇠 형식으로 보안이 유지되어 있다는 표시
- 인증되지 않아서 열려 있다

- 실행하면 에러 발생(승인이 되지 않았기 때문)

- 승인하는 방법
- 위쪽에 Authorize을 클릭

- 사용자 이름과 암호가 필요하다
- Generating access token(엑세스 토큰 생성)
- JWT 토큰 코드 입력(자료 제공)

- jose패키지 다운로드
- JSON웹 토큰에 엑세스 하려면 설치
- pip install python-jose(터미널에서 실행)
- 비밀키 생성
- 비밀키는 기본적으로 생성될 코든에 서명할 수 있는 키
- 비밀키는 무작위이지만 고유해야 한다
- 임의의 비밀 키를 생성하는 방법
- 터미널에서 명령어 입력
openssl rand -hex 32

- 토큰 엔드포인트 구현
- auth 폴더에 authentication.py를 생성

- API라우터로 경로 지정
-
POST로 4개의 슬래시 토큰이 있다

→ 엔드포인트가 정확히 동일해야 한다
→ 다른 의미로 정의해도 사용 할 수가 없다

→ tokenUrl와 POST의 경로가 일치해야한다
- 비밀번호 요청 양식
- 비밀번호 요청 양식 모듈을 불러온다

- 기본적으로 여기에 있는 형식이며, FastAPI통해 자동으로 수행한다
- 전반적인 코드

- 데이터 베이스에 있는 DB를 가져온다
- 사용자 이름으로 데이터 베이스에서 사용자를 가져온다
- 비밀번호는 실제로 Hash되고 있다(전에 작업을 해놔서)
- DB에쿼리로 모델에 저장된 DBUser에서 사용자 모델에 대해 반환 해서 첫 번째 요소를 가져온다
- 사용자 확인이 안될경우 HTTP예외 처리를 한다
- 또한 비밀번호(Hash)도 올바르지 않다면 HTTP예외 처리를 한다
- 둘다 통과하면 토큰을 생성 할 수 있다
- access_token를 정의해야 토큰을 생성하고 데이터를 전달한다
- 인증 타입을 지정한다(bearer)

- ID와 이름을 반환한다
- main.py 수정
- 인증이 정의된 모듈 호출

-
라우터로 경로 지정

- 확인하기
- 사용자 이름과 비밀번호를 생성한다

-
로그인하기


- 이러면 권한을 부여하면 권한을 얻게 된다
- 엑세스 토큰 제공
- 승인을 사용하면 엑세스 토큰이 제공된다

- 권한 부여된 것으로 열어보기
- 인증이 되었으므로 실제로 테이블을 열고 Article에 대한 데이터베이스를 열 수 있도록 하는 것이다

User authentication(사용자 인증)
- 누락된 핵심 구성 요소 → API에서 토큰을 제공
- API에 대한 토큰에 대한 사용자
- 해당 토큰이 유효한 비밀키를 기반으로 유효한지 확인 하기 위해 해당 토큰을 확인

- 첫 번째는 토큰 검증 기능을 구현
- 전달되는 사용자 자격 증명을 기반으로 해당 토큰을 확인하는 방법
- 두 번째는 해당 토큰과 관련된 사용자를 검색하고 해당 사용자를 무엇이든 제공
- 엔드포인트 함수가 호출된다
- 마지막으로 더 많은 엔드 포인트를 확보
- 코드

- JWTError : JWT 에러관련 모듈
- Depends : 종속성 관련 모듈
- Session : DB정보의 세션
- get_db : 저장된 DB 모듈
-
토큰 확인을 위한 함수를 정의

- 사용자는 토큰이 연결된 현재 사용자를 검색하는 데 사용한다
- 그러나 해당 사용자를 수신하거나 해당 사용자를 검색하는 과정에서 토큰도 확인한다
- 문자열 유형의 토큰이 있다
- 무엇을 스캔할지에 따라 다르며 사용자를 검색하려면 데이터 베이스가 필요하다
- 코드에서 오류를 발견하면 발생하는 예외를 정의
→ credentials_exception으로 정의했다 → 헤더는 www-인증을 제공한다 → 사용자를 인증할 수 없는 경우 표준 HD 예외로 제공한다
-
페이로드를 정의한다
→ JWT로 디코드한 다음 토큰을 전달한다 → 비밀키와 알고리즘을 전달한다 → 토큰에서 사용자 이름을 검색하는 표준방법
-
JWT 오류 발생 시
→ 오류에 대한 GW가 있다 → 해당 오류가 발생하면 예외, 자격 증명, 예외를 다시 발생시킨다. → 이 시도를 통과하면 계속해서 사용자를 검색 할 수 있다.
-
DB사용자를 가져와서 사용자를 기반으로 사용자를 검색하는 새로운 기능을 제곤해야 한다
→ 기본적으로 토큰의 유효성을 검사하고 토큰의 데이터를 기반으로 사용자 이름을 검색한다 → 예외가 없다면 사용자를 반환하는 것이다 → 사용자를 제대로 확보한 후에는 더 이상 토큰에 의존할 필요가 없다
-
토큰 종속성 확인하기

- 필요한 패키지 불러오기
- 토큰 대신 정의했던 사용자 유형 기반으로 바뀐다

- 확인하기
- 권한 로그인을 한 다음 입력값 작성 후 확인

- 페이지를 새로고침을 하게 되면 인증 토큰을 잃어 버리게 된다
-
사용자의 다른 방법에 대해 동일한 권한을 추가

-
이 코드를 복사하여 다른코드에 넣으면 된다.
