본문 바로가기

Restful API28

[Restful API] JWT 토큰 유효시간 만료 방법 JWT_SECRET_KEY = 'Hi' JWT_ACCESS_TOKEN_EXPIRES = True # False = 만료 없이 설정 PROPAGATE_EXCEPTIONS = True # 에러가 나면 보여줄 것 -> JWT 관련 변수 세팅에서 JWT_ACCESS_TOKEN_EXPRIES를 True로 하면 토큰 유효시간 설정을 할 수 있다. access_token = create_access_token(result_list[0]["id"], expires_delta=datetime.timedelta(minutes=2)) -> create_access_token(expires_delta= datetime.timedelta(minutes=2))에서 인자 expires_delta는 토큰 만료 시간이다. 2023. 12. 7.
[Restful API] flask에서 JWT 사용하는 방법 pip install flask-jwt-extended -> 먼저, 인증 토큰 발급을 위한 라이브러리를 설치한다. class Config : JWT_SECRET_KEY = 'Hi' JWT_ACCESS_TOKEN_EXPIRES = False PROPAGATE_EXCEPTIONS = True -> git에 올라가지 않게 보안을 위해 만든 Config 클래스 안에 JWT 관련 변수를 세팅한다. from flask import Flask from flask_jwt_extended import JWTManager from flask_restful import Api from config import Config # 환경변수 세팅 app.config.from_object(Config) # JWT 매니저를 초기화 J.. 2023. 12. 7.
[Restful API] 회원가입할 때 비밀번호 암호화 하는 법 pbkdf2_sha256 암호화 -> 비밀번호 원문(1234)를 보내면 서버는 이 원문을 받아서 암호화 한다. 양방향 암호화 = 암호화를 하고 다시 복구가 가능 단방향 암호화 = 암호화를 하면 복구가 불가 보안때문에 단방향 암호화를 사용한다 = hash 라고 한다. pip install psycopg2-binary passlib -> 암호화 하기 위한 라이브러리 설치 from passlib.hash import pbkdf2_sha256 from config import Config # 원문 비밀번호를 단방향 암호화 하는 함수 def hash_password(original_password) : original_password = original_password + Config.PASSWORD_SALT password = pbkd.. 2023. 12. 7.
[Restful API] Config 파일 만들기 github에서 repository에서 코드를 public으로 해놓는 경우에, DB의 로그인 정보나 AWS의 키와 같은 보안관련 정보는 노출하면 안되기 때문에 Config 파일을 만든다. 그 후 .gitignore 파일에서 Config 파일을 제외하고 소스 코드를 올린다. class Config : HOST = "AWS RDS의 엔드포인트' DATABASE = '해당 데이터베이스' DB_USER = '유저 이름' DB_PASSWORD = '유저 비밀번호' -> config.py 파일을 만든 후 Config 라는 클래스를 만들어 따로 보관한 상태 import mysql.connector from config import Config # 파이썬으로 MySQL에 접속할 수 있는 함수 def get_connec.. 2023. 12. 6.
[Restful API] Restful API 개발 할 때, MySQL 접속을 위한 유저를 따로 만들기 Restful API 개발 할 때, 새로운 스키마(데이터베이스)를 만들고 새로운 유저 계정을 만들어 이 유저만 접속 가능하게 하려고 한다. 방법) create database recipe_db; create user 'username'@'%' identified by 'password'; grant all privileges on recipe_db.* to 'username'@'%'; recipe_db 라는 스키마를 만든다. 새로운 유저의 이름과 비밀번호를 쓴 후 만들어준다. recipe_db의 모든 테이블에 대한 권한을 새로 만든 유저에게 부여한다. -> 그 후 홈으로 돌아와서 MySQL Connections 옆 + 버튼 클릭 Connection Name엔 원하는 이름을 쓰고 Username엔 위에서 .. 2023. 12. 6.
[Restful API] Python MySQL Connector를 이용해 delete 하는 방법 -> Postman에서 http method는 DELETE로, 어떤 데이터를 삭제할 지는 경로 recipes/해당 테이블의 id값, 요청할 데이터는 없으니 Body는 none으로 세팅한다. def delete(self, recipe_id) : connection = get_connection() try : query = ''' delete from recipe where id = %s; ''' record = (recipe_id, ) cursor = connection.cursor() cursor.execute(query, record) connection.commit() cursor.close() connection.close() except Error as e : print(e) cursor.clos.. 2023. 12. 6.
[Restful API] Python MySQL Connector를 이용해 update 하는 방법 -> Postman에서 http method는 PUT으로, 어떤 데이터를 업데이트 할 지는 경로 recipes/해당 테이블의 id값, 업데이트 할 데이터는 Body의 raw에서 json 타입으로 데이터를 요청하게 세팅한다. def put(selft, recipe_id) : # 1. 클라이언트로부터 데이터를 받아온다. data = request.get_json() try : connection = get_connection() query = ''' update recipe set name = %s, description = %s, num_of_servings = %s, cook_time = %s, directions = %s where id = %s; ''' record = (data["name"], da.. 2023. 12. 6.
[Restful API] 만든 Rest API에서 DB 테이블에 없는 데이터를 select 했을 때 결과와 해결방법 -> 위처럼 요청하면 개발한 코드에 맞게 select * from recipe where id = 100이 실행되는데, -> 실제 MySQL 테이블에 가보면 id = 100에 해당하는 데이터는 없다. -> 그러므로 Postman에서는 에러가 뜬다. 해결방법) if len(result_list) == 0 : return {"result" : "fail", "message" : "해당 데이터가 없습니다."}, 400 else : return {"result" : "success", "item" : result_list}, 200 -> 해당 경로에 있는 get() 함수의 리턴 부분을 위와 같이 바꿔주면 없는 데이터는 없다고 알려주고 있는 데이터는 반환해서 보여준다. 2023. 12. 6.
[Restful API] MySQL Connector 라이브러리 사용 중에, %s에 매칭되는 데이터가 1개인 경우 query = ''' select * from recipe where id = %s; ''' record = (recipe_id) cursor = connection.cursor(dictionary=True) cursor.execute(query, record) -> 위 코드를 실행하면 이런 오류가 뜬다. 이유는 record 변수엔 tuple 타입의 데이터를 넣어야 하는데, recipe_id = 1 인 상태에서 (1)로 넣어버렸기 때문이다. 해결 방법) query = ''' select * from recipe where id = %s; ''' record = (recipe_id, ) cursor = connection.cursor(dictionary=True) cursor.execute(query, r.. 2023. 12. 6.
[Restful API] Rest API 개발 중, 경로에 숫자나 문자의 값이 변경 될 수 있는 경우의 처리 방법 -> 위와 같이 path = recipes/숫자 처럼 값이 변할 수 있는 경우에 처리 방법 api.add_resource(RecipeResource, "/recipes/") -> 값이 변할 수 있는 부분에 으로 처리한다. -> 그 후 API 코드가 있는 RecipeResource 클래스로 가서 해당 http method의 역할을 하는 함수인 get()의 인자에, 경로에 쓴 변수인 recipe_id를 넣어주면 된다. 2023. 12. 6.