FastAPI Custom HTTPException for Auth - 50
·
Develop/FastAPI
예외 처리를 함수로 만들어서 코드를 가독성이 좋게 만드는 것이 목표 1. 라이브러리 import #status 삽입 from fastapi import FastAPI, Depends, HTTPException, status 2. user 인증 에러 함수 def get_user_exception(): credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", headers={"WWW-Authenticate":"Bearer"}, ) return credentials_exception 3. token 인증 에러 함수 def token_exception(..
FastAPI JSON Web Token(JWT) 디코딩 함수 구현 - 49
·
Develop/FastAPI
테스트는 x(나중에 다시) 함수 구현만 1. 라이브러리 import #JWTError 삽입 from jose import jwt, JWTError 2. 비동기 함수 구현 async def get_current_user(token: str = Depends(oauth2_bearer)): try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) username: str = payload.get("sub") user_id: int = payload.get("id") if username is None or user_id is None: raise HTTPException(status_code=404, detail="User not found")..
FastAPI JSON Web Token(JWT) 생성 - 48
·
Develop/FastAPI
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는 위에 설정한 값과 다르게 설정해야 한다...
FastAPI 사용자 인증 - 47
·
Develop/FastAPI
로그인을 통해 사용자 인증을 시도해 보자 1. 사용자 인증을 위한 라이브러리 import from fastapi.security import OAuth2PasswordRequestForm #차후 에러문을 위한 HTTPException import from fastapi import FastAPI, HTTPException 2. password 일치여부 함수 생성 def verify_password(plain_password, hashed_password): return bcrypt_context.verify(plain_password, hashed_password) ※ verify(디코딩 패스워드, 인코딩 패스워드) 3. 유저 데이터를 쿼리로 가져와서 인증하는 함수 생성 def authenticate_u..
FastAPI 데이터베이스에 유저 데이터 저장하기 - 46
·
Develop/FastAPI
앞서 POST API에서 다뤘던 저장은 데이터베이스 저장이 아니었기에 이번장은 데이터베이스에 데이터를 저장해 보자 1. DB에 연결하기 위한 라이브러리 import from sqlalchemy.orm import Session from database import SessionLocal, engine #Depends 추가 from fastapi import FastAPI, Depends 2. Base를 상속받은 모든 클래스들을 데이터베이스 내에 테이블로 만든다. models.Base.metadata.create_all(bind=engine) 3. DB를 연결할 수 있는 함수 생성 def get_db(): try: db = SessionLocal() yield db finally: db.close() ※ ..
FastAPI bcrypt 비밀번호 암호화 - 45
·
Develop/FastAPI
bcrypt 알고리즘을 사용해서 비밀번호를 암호화시켜 저장해 보자 1. bcrypt 설치 => 일반적으로 규정을 준수해야할 상황이 아니라면 구현이 쉽고 비교적 강력하다. 터미널에 pip install "passlib[bcrypt]" 다운 2. 라이브러리 import from passlib.context import CryptContext bcrypt_context = CryptContext(schemes=['bcrypt'], deprecated="auto") 3. 함수 생성 및 POST API 수정 def get_password_hash(password): return bcrypt_context.hash(password) @app.post("/create/user") async def create_new..
FastAPI Create Authentication & Post Request - 44
·
Develop/FastAPI
users 테이블에 유저 데이터를 저장할 POST API를 생성 1. 인증 관련 데이터를 다루기 위한 파이썬 파일 생성 TodoApp 하위에 파일을 만든다. 2. Users 클래스에 대한 BaseModel(유효성 검사) 생성 및 POST API 생성 ※id는 primary key로 따로 설정 x from fastapi import FastAPI from pydantic import BaseModel from typing import Optional import models class CreateUser(BaseModel): username: str email: Optional[str] first_name: str last_name: str password: str app = FastAPI() @app.p..
FastAPI Create Users Table / Create Foreign Key - 43
·
Develop/FastAPI
Users 테이블을 만들고 Todos 테이블과의 관계를 설정하는 것이 목표(Foreign key) 1. 라이브러리 import from sqlalchemy.orm import relationship from sqlalchemy import ForeignKey 2. Users 클래스 생성 class Users(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True) username = Column(String, unique=True, index=True) first_name = Column(String) last_name = Colu..
FastAPI Database Relationship / Foreign Key / Query- 42
·
Develop/FastAPI
데이터의 관계에 대해서 알아보는 것이 목표 1. 관계의 종류 참고 사이트 1) 1:1(하나의 레코드(행 데이터)가 다른 테이블의 레코드 한 개와 연결된 경우) 2) 1:N(하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우) - 정리하고 있는 FastAPI에서 주로 다루는 관계 - 대부분의 관계형 데이터베이스의 관계 3) N:N(여러개의 레코드가 다른 테이블의 여러 개의 레코드와 연결된 경우) 2. One To Many Relationship 테이블 관계도 테이블 구성 Users Todos 테이블 쿼리 ※ 1번 user가 할 일을 Todos에서 뽑고 싶을 때 select * from todos where owner=1; ※ 2번 user가 할 일을 Todos에서 뽑고 싶을 때 select * fr..
JSON Web Token(JWT)
·
Develop/기초지식
1. JSON Web Token란? => 유저를 인증하고 식별하기 위한 토큰 기반 인증 => 흔하게 회원 인증 / 정보 교류에 쓰인다. JWT는 JSON 객체를 사용하는 쌍방 간의 데이터와 정보를 안전하게 전송하는 독립적인 방법이다. => 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함 된다. 각각의 JWT는 전자서명이 가능하기 때문에 JWT는 신뢰할 수 있다. 이는 서버가 JWT의 변경이 된 사항들을 알 수 있게 한다. => 전자서명은 Header, Payload가 변조되었는지 확인하기 위해 사용되는 정보이며 JWT를 신뢰할 수 있는 토큰으로 사용할 수 있는 근거가 된다. JWT는 기본 인증 및 다이제스트 인증 방식과 다르게 권한 부여 방식이다. => 서버에서 세션을 계속해서 유지..