728x90
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. 인코딩 / 디코딩 확인
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 |