FastAPI JSON Web Token(JWT) 생성 - 48

2023. 1. 8. 01:28·Develop/FastAPI
728x90
SMALL
JWT를 생성하는 방법에 대해 알아보자

 

1. Python 라이브러리 설치

pip install "python-jose[cryptography"]

 

2. 라이브러리 가져오기

#OAuth2PasswordBearer 가져오기
from fastapi.security import OAuth2PasswordRequestForm, OAuth2PasswordBearer
from datetime import datetime, timedelta
from jose import jwt

※ OAuth2PasswordBearer를 가져오는 이유는 JWT가 실제로 베어 토큰 베어러 유형이기 때문이다.

 

3. 비밀키 and 알고리즘 설정

 SECRET_KEY(비밀키) 생성하기

SECRET_KEY는 위에 설정한 값과 다르게 설정해야 한다. 다음과 같은 방법으로 SECRET_KEY를 생성할 수 있다.
openssl이 설치된 터미널을 사용할 수 있다면 다음과 같이 생성하자.
$ openssl rand -hex 32 or openssl rand -hex 64

또는 다음과 같이 secrets 라이브러리를 사용할 수도 있다.
import secrets
secrets.token_hex(32)
SECRET_KEY = "생성한 secret_key 입력"
ALGORITHM = "HS256"
  • SECRET_KEY - 암호화 시 사용하는 64자리의 랜덤 한 문자열이다.
  • ALGORITHM - 토큰 생성시 사용하는 알고리즘을 의미하며 여기서는 HS256을 사용한다.

 

4. 베어러 변수 생성

Bearer는 JWT 또는 OAuth의 토큰방식을 의미

oauth2_bearer = OAuth2PasswordBearer(tokenUrl="token")

OAuth2PasswordBearer 객체를 생성할 때 tokenUrl이라는 파라미터를 넘겨준다.

이 파라미터는 프론트엔드에서 유저가 token값을 얻어 올 때 사용된다. 그리고 이 tokenUrl은 상대경로이다.

만약 API가 https://test.com/ 에 있다면 token url은 https://test.com/token 이 된다.

 

5. Token 함수 생성

def create_access_token(username: str, user_id: int, expires_delta: Optional[timedelta] = None):
    encode = {"sub": username, "id": user_id}
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=15)
    encode.update({"exp": expire})
    return jwt.encode(encode, SECRET_KEY, algorithm=ALGORITHM)
  • expires_delta - 토큰의 유효기간을 의미한다. 분 단위로 설정한다.

 

6. 로그인 API 수정(로그인시 토큰으로 확인)

@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(),
                                 db: Session = Depends(get_db)):
    user = authenticate_user(form_data.username, form_data.password, db)
    if not user:
        return HTTPException(status_code=404, detail="User not found")
    token_expires = timedelta(minutes=20)
    token = create_access_token(user.username,
                                user.id,
                                expires_delta=token_expires)
    return {"token": token}

 

7. Swagger 확인

기존에 만들었던 user 데이터에 대해 token이 생성되었다.

 

8. 인코딩 / 디코딩 확인

https://jwt.io/

 

728x90
SMALL
저작자표시 비영리 변경금지 (새창열림)

'Develop > FastAPI' 카테고리의 다른 글

FastAPI Custom HTTPException for Auth - 50  (0) 2023.01.08
FastAPI JSON Web Token(JWT) 디코딩 함수 구현 - 49  (0) 2023.01.08
FastAPI 사용자 인증 - 47  (0) 2023.01.07
FastAPI 데이터베이스에 유저 데이터 저장하기 - 46  (0) 2023.01.07
FastAPI bcrypt 비밀번호 암호화 - 45  (0) 2023.01.07
'Develop/FastAPI' 카테고리의 다른 글
  • FastAPI Custom HTTPException for Auth - 50
  • FastAPI JSON Web Token(JWT) 디코딩 함수 구현 - 49
  • FastAPI 사용자 인증 - 47
  • FastAPI 데이터베이스에 유저 데이터 저장하기 - 46
동석해요
동석해요
공부하고 싶은게 많은, 사소한 IT 지식들 공유
    250x250
  • 동석해요
    개발로 자기계발
    동석해요
  • 전체
    오늘
    어제
    • 분류 전체보기 (226)
      • Develop (126)
        • 기초지식 (12)
        • FastAPI (102)
        • Django (11)
      • Database & Data (62)
        • 기초지식 (16)
        • MySQL (29)
        • PostgreSQL (8)
        • 데이터 분석 (9)
      • 인공지능 (11)
        • PyTorch (9)
      • Cloud (8)
        • AWS (4)
        • GCP (2)
      • 버그처리 (14)
      • 회고 & 일상 (5)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
동석해요
FastAPI JSON Web Token(JWT) 생성 - 48
상단으로

티스토리툴바