FastAPI - (11)

  • FastAPI는 가장 빠르게 성장하는 API프레임워크
  • swagger UI
  • Udemy 강의 정리

인증

image-20240320125222791

Authentication(인증)

image-20240320125210524

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

    image-20240320125155457

Securing an endpoint(앤드포인트 보안)

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

    image-20240320125141139

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

    image-20240320125128196

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

    image-20240320125111745

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

    image-20240320125056297

  • 코드 작성

    image-20240320125042059

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

    image-20240320125019897

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

    image-20240320125003081

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

    image-20240320124947222

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

    image-20240320124928660

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

    image-20240320124910824

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

    image-20240320124853415

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

    image-20240320124840350

    → 엔드포인트가 정확히 동일해야 한다

    → 다른 의미로 정의해도 사용 할 수가 없다

    image-20240320124822863

    → tokenUrl와 POST의 경로가 일치해야한다

  • 비밀번호 요청 양식
    • 비밀번호 요청 양식 모듈을 불러온다

    image-20240320124807945

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

    image-20240320124752919

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

    image-20240320124734678

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

    image-20240320124718004

  • 라우터로 경로 지정

    image-20240320124702096

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

    image-20240320124640515

  • 로그인하기

    image-20240320124607612

    image-20240320124623954

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

    image-20240320124543283

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

    image-20240320124524745

User authentication(사용자 인증)

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

    image-20240320124506358

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

    image-20240320124446113

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

    image-20240320124428523

  • 사용자는 토큰이 연결된 현재 사용자를 검색하는 데 사용한다
  • 그러나 해당 사용자를 수신하거나 해당 사용자를 검색하는 과정에서 토큰도 확인한다
  • 문자열 유형의 토큰이 있다
  • 무엇을 스캔할지에 따라 다르며 사용자를 검색하려면 데이터 베이스가 필요하다
  • 코드에서 오류를 발견하면 발생하는 예외를 정의

→ credentials_exception으로 정의했다 → 헤더는 www-인증을 제공한다 → 사용자를 인증할 수 없는 경우 표준 HD 예외로 제공한다

  • 페이로드를 정의한다
    → JWT로 디코드한 다음 토큰을 전달한다 → 비밀키와 알고리즘을 전달한다 → 토큰에서 사용자 이름을 검색하는 표준방법

    image-20240320124406840

  • JWT 오류 발생 시

    → 오류에 대한 GW가 있다 → 해당 오류가 발생하면 예외, 자격 증명, 예외를 다시 발생시킨다. → 이 시도를 통과하면 계속해서 사용자를 검색 할 수 있다.

  • DB사용자를 가져와서 사용자를 기반으로 사용자를 검색하는 새로운 기능을 제곤해야 한다

    → 기본적으로 토큰의 유효성을 검사하고 토큰의 데이터를 기반으로 사용자 이름을 검색한다 → 예외가 없다면 사용자를 반환하는 것이다 → 사용자를 제대로 확보한 후에는 더 이상 토큰에 의존할 필요가 없다

  • 토큰 종속성 확인하기

    image-20240320124350585

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

    image-20240320124335426

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

    image-20240320124316483

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

    image-20240320124301185

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

    image-20240320124247965

Reference

개인 Code 기록 github

FastAPI 강의

FastAPI 공식페이지