- 인증 절차가 필요한 tweet, follow, unfollow 엔드포인트에 추가.
- 함수에서 같은 기능을 필요로 하는 경우 : 파이썬 데코레이터를 활용하여 구현.
- 파이썬 functools 모듈의 wraps decorator 함수를 사용한다.
엔드포인트에 추가할 decorator 함수
import jwt
from functools import wraps
from flask import current_app, request, Response
def login_required(f) :
@wraps(f)
def decorated_function(**args, **kwargs) :
access_token = request.headers.get('Authorization')
if access_token is not None :
try :
payload = jwt.decode(access_token, current_app.config['JWT_SECRET_KEY'], "HS256")
except jwt.InvalidTokenError :
payload = None
if payload is None: return Response(status=401)
user_id = payload['user_id']
g.user_id = user_id
g.user = get_user_info(user_id) if user_id else None
else :
return Response(status= 401)
return f(*args, **kwargs)
return decorated_function
line 6 : 데코레이터로 만들 함수 지정
line 7 : wraps 함수를 적용하여 데코레이터 함수 구현
line 8 : HTTP 요청에서 Authorization 헤더 값을 읽어 access_token 얻기
line 10 : Authorization 헤더가 전송되면 access_token 복호화 하여 payload JSON 읽어오기. 만약 None 이라면 헤더가 전송되지 않았기 때문에 인증 불허
line 12 : access_token 복호화 하여 payload JSON으로 읽어오기. config.py안에 있는 JWT_SECRET_KEY 값을 읽어온다.
line 13 : exception이 일어날 경우 JWT를 복호화 하는데 문제가 발생한 것
line 16 : payload가 None 인 것은 문제가 있었다는 의미이다. Unauthorized 401 응답 전송
line 18 : 복호화 한 payload에서 user_id 읽어오고 해당 사용자 아이디를 사용해서 DB 정보도 가져온다.
line 20 : get_user_info 함수는 user_id로 들어온 값으로 DB에 있는 사용자 정보를 읽어온다.
line 22 : authorization 함수가 전송되지 않는 경우 401 응답을 보낸다.
'Python > Flask' 카테고리의 다른 글
[미니터] 인증 구현시 ValueError : Invalid salt과 AttributeError: 'str' object has no attribute 'decode'에러 (0) | 2022.07.18 |
---|---|
[미니터] 인증 - tweet, follow, unfollow에 decorator 추가 (0) | 2022.07.15 |
[미니터] 인증 - sign-up, login (0) | 2022.07.14 |
[미니터] 인증 (0) | 2022.07.14 |
[미니터] DB연결 - 타임라인 (0) | 2022.07.14 |