최신 웹 애플리케이션에서 사용자 인증 및 권한 부여는 매우 중요한 보안 조치입니다. Python의 인기와 사용으로 인해 Flask-RESTful 및 Flask-JWT는 Python 웹 애플리케이션의 사용자 인증 및 권한 부여를 위해 선호되는 솔루션이 되었습니다. 이 기사에서는 Flask-RESTful 및 Flask-JWT의 사용과 Python 웹 애플리케이션에서 사용자 인증 및 권한 부여를 구현하는 방법을 자세히 소개합니다.
Flask-RESTful 소개
Flask-RESTful은 RESTful API 인터페이스를 빠르게 구축하는 데 도움이 되는 Flask의 확장 라이브러리입니다. 입력 유효성 검사, 요청 구문 분석 등과 같은 많은 유용한 기능을 제공합니다. Flask-RESTful을 사용하면 간단한 웹 API를 쉽게 구축할 수 있습니다. 다음은 간단한 예입니다.
from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True)
이 예에서는 HelloWorld
라는 리소스를 생성하고 이를 api
개체에 추가합니다. 마지막으로 /
경로를 통해 HelloWorld
리소스에 액세스할 수 있습니다. /
경로에 액세스하면 HelloWorld
리소스의 get
메서드를 호출하고 JSON 응답 {'hello'를 반환합니다. '세계'}
. HelloWorld
的资源(Resource),并将其添加到了api
对象中。最终,我们可以通过/
路由来访问HelloWorld
资源。当我们访问/
路由时,调用HelloWorld
资源的get
方法,并返回一个JSON响应{'hello': 'world'}
。
Flask-JWT的介绍
Flask-JWT是Flask的另一个扩展库,用于在Web应用程序中实现JSON Web Token(JWT)身份验证。JWT是一个开放标准,用于在用户和服务器之间安全地传输信息。它是基于JSON的,通常由三个部分组成,分别是头部、载荷和签名。头部包含了JWT的类型和所使用的算法信息,载荷包含了需要传输的数据信息,签名用于验证数据是否正确。Flask-JWT简化了JWT的生成和验证,使得在Web应用程序中实现用户身份验证变得更加容易。下面是一个简单的示例:
from flask import Flask from flask_jwt import JWT, jwt_required, current_identity from werkzeug.security import safe_str_cmp app = Flask(__name__) app.config['SECRET_KEY'] = 'super-secret' class User(object): def __init__(self, id, username, password): self.id = id self.username = username self.password = password def __str__(self): return f"User(id='{self.id}', username='{self.username}')" users = [ User(1, 'user1', 'password'), User(2, 'user2', 'password') ] username_table = {u.username: u for u in users} userid_table = {u.id: u for u in users} def authenticate(username, password): user = username_table.get(username, None) if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): return user def identity(payload): user_id = payload['identity'] return userid_table.get(user_id, None) jwt = JWT(app, authenticate, identity) @app.route('/protected') @jwt_required() def protected(): return {'hello': current_identity.username} if __name__ == '__main__': app.run(debug=True)
在这个例子中,我们首先定义了一个User
类,用于存储用户的身份验证信息。在authenticate
函数中,输入一个用户名和密码,该函数将返回一个用户对象。在identity
函数中,输入一个jwt载荷,该函数将根据jwt中的用户id返回一个用户对象。通过调用JWT
构造函数,我们为应用程序添加了一个自定义的身份验证方法和一个自定义的用户标识方法。最后,在protected
路由的装饰器中使用了@jwt_required
装饰器,以确保只有经过身份验证的用户才能访问受保护的资源。
Flask-RESTful和Flask-JWT的结合
我们可以将Flask-RESTful和Flask-JWT结合起来使用,实现完整的Web应用程序,包括用户身份验证和授权机制。下面是一个简单的示例:
from flask import Flask from flask_restful import Resource, Api, reqparse from flask_jwt import JWT, jwt_required, current_identity from werkzeug.security import safe_str_cmp app = Flask(__name__) app.config['SECRET_KEY'] = 'super-secret' api = Api(app) class User(object): def __init__(self, id, username, password): self.id = id self.username = username self.password = password def __str__(self): return f"User(id='{self.id}', username='{self.username}')" users = [ User(1, 'user1', 'password'), User(2, 'user2', 'password') ] username_table = {u.username: u for u in users} userid_table = {u.id: u for u in users} def authenticate(username, password): user = username_table.get(username, None) if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): return user def identity(payload): user_id = payload['identity'] return userid_table.get(user_id, None) jwt = JWT(app, authenticate, identity) class HelloWorld(Resource): def get(self): return {'hello': 'world'} class Secret(Resource): @jwt_required() def get(self): return {'secret': 'resource', 'user': current_identity.username} class Login(Resource): def post(self): parser = reqparse.RequestParser() parser.add_argument('username', type=str, help='Username cannot be blank', required=True) parser.add_argument('password', type=str, help='Password cannot be blank', required=True) args = parser.parse_args() user = authenticate(args['username'], args['password']) if user: return {'access_token': jwt.jwt_encode_callback({'identity': user.id})} else: return {'message': 'Invalid username or password'}, 401 api.add_resource(HelloWorld, '/') api.add_resource(Secret, '/secret') api.add_resource(Login, '/login') if __name__ == '__main__': app.run(debug=True)
在这个例子中,我们除了定义了HelloWorld
资源外,还定义了Secret
资源和Login
资源。在Secret
资源中,通过@jwt_required
装饰器,确保只有经过身份验证的用户才能访问。在Login
资源中,我们对POST请求进行了解析,并使用authenticate
函数来验证用户的身份信息。如果验证成功,则返回JWT token,否则返回401状态码。最终,我们将所有的资源添加到了api
对象中,并使用Flask的run
rrreee
이 예에서는 먼저 사용자의 인증 정보를 저장하기 위해User
클래스를 정의합니다. authenticate
함수에 사용자 이름과 비밀번호를 입력하면 함수가 사용자 개체를 반환합니다. identity
함수에 jwt 페이로드를 입력하면 이 함수는 jwt의 사용자 ID를 기반으로 사용자 개체를 반환합니다. JWT
생성자를 호출하여 애플리케이션에 사용자 정의 인증 방법과 사용자 정의 사용자 식별 방법을 추가합니다. 마지막으로 @jwt_required
데코레이터는 인증된 사용자만 보호된 리소스에 액세스할 수 있도록 protected
경로의 데코레이터에서 사용됩니다. 🎜🎜Flask-RESTful과 Flask-JWT의 결합🎜🎜Flask-RESTful과 Flask-JWT를 함께 사용하여 사용자 인증 및 권한 부여 메커니즘을 포함한 완전한 웹 애플리케이션을 구현할 수 있습니다. 다음은 간단한 예입니다. 🎜rrreee🎜이 예에서는 HelloWorld
리소스 정의 외에도 Secret
리소스 및 Login
도 정의합니다. 자원. Secret
리소스에서 @jwt_required
데코레이터를 전달하여 인증된 사용자만 액세스할 수 있도록 합니다. Login
리소스에서 POST 요청을 구문 분석하고 authenticate
기능을 사용하여 사용자의 신원 정보를 확인합니다. 확인에 성공하면 JWT 토큰이 반환되고, 그렇지 않으면 401 상태 코드가 반환됩니다. 마지막으로 모든 리소스를 api
개체에 추가하고 Flask의 run
메서드를 사용하여 웹 애플리케이션을 시작했습니다. 🎜🎜요약🎜🎜Python 웹 애플리케이션 개발에서 Flask-RESTful 및 Flask-JWT는 매우 유용한 확장 라이브러리입니다. 이를 통해 웹 API를 쉽게 구축 및 보호하고 웹 애플리케이션에 사용자 인증 및 권한 부여 메커니즘을 추가할 수 있습니다. Flask-RESTful과 Flask-JWT를 사용하면 개발 시간과 개발 비용을 줄일 수 있어 웹 애플리케이션의 기능을 더 쉽게 구현할 수 있습니다. 🎜위 내용은 Flask-RESTful 및 Flask-JWT: Python 웹 애플리케이션의 사용자 인증 및 권한 부여의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!