Flask에서 인증 기능을 구현하는 방법은 다양할 수 있지만, 여기에서는 JWT(JSON Web Token)를 사용하여 간단하게 인증 기능을 구현하는 방법을 소개하겠습니다.
필요 패키지 설치
먼저 필요한 패키지들을 설치합니다.
pip install flask flask_jwt_extended
인증 기능 넣기
이제 아래와 같이 JWT 설정과 사용자 정보를 임시로 저장할 딕셔너리를 만들어줍니다.
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, jwt_required, create_access_token, get_jwt_identity
app = Flask(__name__)
# JWT 설정
app.config['JWT_SECRET_KEY'] = 'super-secret'
jwt = JWTManager(app)
# 임시 사용자 정보
users = {
'test': {
'password': 'test'
}
}
위 코드에서 JWT_SECRET_KEY는 JWT에서 사용되는 시크릿 키로, 랜덤한 값으로 설정해줍니다. 그리고 다음과 같이 로그인 엔드포인트를 추가해줍니다.
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if not username or not password:
return jsonify({'msg': '아이디 또는 비밀번호를 입력하세요.'}), 400
if username not in users or password != users[username]['password']:
return jsonify({'msg': '아이디 또는 비밀번호가 일치하지 않습니다.'}), 401
# JWT 생성
access_token = create_access_token(identity=username)
return jsonify({'access_token': access_token}), 200
위 코드에서는 '/login' 엔드포인트에서 사용자가 입력한 아이디와 비밀번호를 확인하여 인증이 되면 JWT를 생성하여 반환합니다. 만약 아이디 또는 비밀번호가 일치하지 않으면 401 Unauthorized 에러를 반환합니다.
그리고 아래와 같이 보호된 엔드포인트를 추가해줍니다.
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
current_user = get_jwt_identity()
return jsonify({'msg': f'{current_user}님, 인증에 성공하셨습니다!'}), 200
위 코드에서는 '/protected' 엔드포인트에서 @jwt_required 데코레이터를 사용하여 JWT가 필요한 엔드포인트임을 명시하고, 현재 사용자 정보를 확인하여 응답합니다.
이제 API 서버를 실행하고, '/login' 엔드포인트에서 인증을 진행한 후, 반환받은 JWT를 Header에 'Authorization: Bearer <token>' 형태로 넣어 '/protected' 엔드포인트에 요청하면 인증이 되어 응답을 받을 수 있습니다.
참고자료
[1] https://flask-jwt-extended.readthedocs.io/en/stable/basic_usage/
'코딩 > flask' 카테고리의 다른 글
[flask] ModuleNotFoundError: No module named 'wtforms.fields.html5' 에러 해결 방법 (2) | 2023.01.31 |
---|---|
[flask] Ajax로 json 데이터 post 전달시 flask 서버 get_json() 관련 오류 해결 방법 (0) | 2022.08.29 |
[flask+jinja2] flask 프로젝트에서 html에 이미지 삽입하는 방법 (0) | 2022.08.09 |
[flask] ubuntu에 flask_mysqldb 설치 중 에러 해결 방법 (0) | 2022.07.14 |
[flask+jinja2] 반올림하기, round 필터 (0) | 2022.03.19 |
[flask+jinja2] 서버에서 받은 html 요소가 html 문서에서 제대로 표현되게 하려면? (0) | 2022.02.06 |
[flask+jinja2] break 사용하기 (2) | 2022.02.05 |
[flask] rows에서 각 row가 몇 번째 것인지 보여주고 싶다면? (0) | 2021.05.15 |