一、Flask JWT 概述Auth

安全是现代网络应用中的一个重要话题。作为Python轻量级的Web框架,Flask提供了高度灵活的用户认证和授权。JSON Web Tokens(JWT)这是实现无状态认证的一种流行方式。JWT可以通过一个加密令牌来验证用户的身份,而Flask可以结合JWT来构建一个安全的Web应用。flask jwt 在Flask环境下,auth是一种利用JWT实现认证的方法,其主要优点是简洁和跨域认证。

JWT由三部分组成,即Header(头部)、Payload(负载)和Signature(签名)。Header通常包含令牌的类型和使用的算法;Payload包含了一系列用于传递信息和认证数据的声明;Signature是为了防止数据篡改而签署前两部分。当用户登录时,服务器会生成一个JWT,并将其返回到客户端。客户端的后续请求将携带JWT,以验证其身份。

将JWT引入Flask应用,通常需要使用Flask-JWT或JWT。Flask-JWT-像Extended这样的扩展库可以简化开发过程。这类库提供生成JWT、对JWT和认证保护等功能进行分析。以下将详细介绍如何在Flask应用中使用JWT进行用户认证。

二、Flask-JWT-安装和配置Extended

在使用JWT进行认证之前,首先要在Flask应用程序中安装Flask。-JWT-这个库的Extended。Flask-JWT-Extended是一种非常流行的Flask扩展,它提供了创建和验证JWTs等许多有用的功能, 在JWTs中操作自定义用户声明,以及保护视图等。通过pip命令可以直接安装该扩展:

 pip install Flask-JWT-Extended 

安装完成后,需要在Flask应用程序中进行配置。先创建Flask实例,并使用Flask进行初始化。-JWT-Extended。配置时,一个关键步骤就是要提供一把JWT_SECRET_KEY,它是用来签名和验证JWT的钥匙。例如:

 from flask import Flask from flask_jwt_extended import JWTManager app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'your_secret_key' # Change this! jwt = JWTManager(app) 

配置完成后,JWT就可以开始应用了。

用户认证和Token的生成

用户认证是JWT的核心部分之一。通常,当用户提供正确的用户名和密码时,服务器会生成包含用户信息的JWT并返回给客户端。Flask应用程序可以通过Flask-JWT-create_Extended提供的access_token()生成令牌的方法。

 from flask import jsonify, request from flask_jwt_extended import create_access_token from werkzeug.security import check_password_hash # 假设我们有以下用户数据和密码hash users = { "user1": "pbkdf2:sha256:CZZYEa7150000美元X$902d40eba2...", # ...其他用户 } @app.route('/login', methods=['POST']) def login(): username = request.json.get('username', None) password = request.json.get('password', None) # 验证用户名和密码 if username not in users or not check_password_hash(users[username], password): return jsonify({"msg": "Bad username or password"}), 401 # 创建JWT access_token = create_access_token(identity=username) return jsonify(access_token=access_token) 

在上述代码中,当用户通过POST请求访问/login端点提交用户名和密码时,系统将验证这些凭证。如果验证通过,将生成JWT并返回给用户。目前,用户身份标志(identity)是用户名,Flask-JWT-Extended将使用这个标志来生成相应的JWT。

四是保护视图和访问控制

生成JWT后,我们需要确保只有持有有效JWT的用户才能访问某些视图。Flask可以使用Flask-JWT-jwt__提供Extendedrequired()装饰器保护视图。该装饰器将确定该请求是否包含有效的JWT,并验证该JWT。视图函数只能通过验证请求继续执行。

 from flask_jwt_extended import jwt_required @app.route('/protected', methods=['GET']) @jwt_required() def protected(): return jsonify({"msg": "You are looking at the protected content!"}) 

上述例子中,'/protectedjwt_'路由required()装饰保护。任何没有有效JWT的HTTP请求都不能访问该路由,持有有效JWT的用户可以获得相应的资源。

Flaskk是一个有用的功能。-JWT-获取当前验证用户信息的Extended。可使用get_jwt_identity()获取存储在JWT中的identity的方法。这样对实现基于用户的访问控制很有帮助。

 from flask_jwt_extended import get_jwt_identity @app.route('/whoami', methods=['GET']) @jwt_required() def whoami(): current_user = get_jwt_identity() return jsonify(logged_in_as=current_user), 200 

以上代码中,'/whoami使用jwt_路由required()装饰品进行保护,它将返回目前通过JWT认证的用户信息。这条路由可以用来验证用户的JWT是否仍然有效,以及哪个用户持有这个JWT。

刷新Token和Token失效处理

JWT通常具有较短的有效期,以提高系统的安全性。当JWT过期时,用户将需要重新认证才能获得新的JWT。和Flask一样-JWT-为了避免用户频繁登录,Extended提供新的JWT来支持Token的刷新机制。在实际应用中,通常会产生两个令牌:一个访问令牌(AccessToken)并且刷新令牌(RefreshToken),刷新令牌有更长的有效期。

 from flask_jwt_extended import create_refresh_token, jwt_required, get_jwt_identity, jwt_refresh_token_required, create_access_token @app.route('/login', methods=['POST']) def login(): # ...(省略登录逻辑) access_token = create_access_token(identity=username) refresh_token = create_refresh_token(identity=username) return jsonify(access_token=access_token, refresh_token=refresh_token) @app.route('/refresh', methods=['POST']) @jwt_refresh_token_required def refresh(): current_user = get_jwt_identity() new_access_token = create_access_token(identity=current_user) return jsonify(access_token=new_access_token) 

上述代码实例中,'/login除生成访问令牌外,路由还生成了刷新令牌。刷新令牌主要用于'/refresh“路由生成新的访问令牌。这样就保证了在访问令牌过期后,用户可以在不重新输入用户名和密码的情况下,通过刷新令牌安全地获得新的访问令牌。

另外一个重要问题是,当用户的JWT被盗或不再安全时,JWT需要及时失效。Flask-JWT-Extended本身并不提供内置的黑名单系统,但是允许开发者定制实现。开发者可以在数据库中记录发布的所有JWT及其有效状态,从而在检查JWT时验证它们是否被列入黑名单。

通过以上介绍,我们了解到了Flask。-JWT-Auth在Flask中的应用不仅可以提供安全的用户认证机制,而且适合构建现代化、可扩展的Web应用和服务,因为它没有状态特性。Flask和JWT的结合可以在单个应用和微服务架构中发挥重要作用,保护您的应用免受未经授权访问的威胁。