返回

Flask 多用户身份验证:使用 Flask-RESTful 和 Flask-JWT

vue.js

使用 Flask-RESTful 和 Flask-JWT 实现多用户身份验证

引言

在现代 Web 应用程序中,用户身份验证至关重要,因为它保护敏感数据并确保应用程序的安全性。在 Flask Web 应用程序中实现多用户身份验证是一个常见任务,它需要稳健且安全的解决方案。本文将指导你如何使用 Flask-RESTful 作为 REST API 框架和 Flask-JWT-Extended 作为 JSON Web 令牌 (JWT) 身份验证库来实现多用户身份验证。我们将重点关注为三种不同的用户类型(成员、创建者和管理员)实施身份验证。

安装

第一步是安装必要的库:

pip install flask-restful flask-jwt-extended

用户模型

接下来,你需要创建用户模型,其中包含有关每个用户的信息,例如用户名、密码和角色:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    role = db.Column(db.String(20), nullable=False)

身份验证资源

创建身份验证资源来处理登录和注销请求:

from flask_restful import Resource
from flask_jwt_extended import create_access_token, create_refresh_token

class LoginResource(Resource):
    def post(self):
        # 获取用户名和密码
        # 检查用户名和密码是否有效
        # 创建访问令牌和刷新令牌
        # 返回令牌

class LogoutResource(Resource):
    def post(self):
        # 从请求中获取访问令牌
        # 将访问令牌加入黑名单
        # 返回注销消息

保护资源

为了保护资源,需要创建自定义装饰器来检查 JWT 令牌并授予访问权限:

from flask_jwt_extended import jwt_required, get_jwt_identity

def member_required(fn):
    # 检查 JWT 令牌
    # 获取用户 ID
    # 检查用户角色是否为成员
    # 否则返回拒绝访问

def creator_required(fn):
    # 检查 JWT 令牌
    # 获取用户 ID
    # 检查用户角色是否为创建者或管理员
    # 否则返回拒绝访问

def admin_required(fn):
    # 检查 JWT 令牌
    # 获取用户 ID
    # 检查用户角色是否为管理员
    # 否则返回拒绝访问

应用装饰器

将保护装饰器应用于需要保护的资源:

api.add_resource(MemberResource, '/member', methods=['GET'], resource_class_kwargs={'decorators': [member_required]})

前端集成

在 Vue.js 3 前端中,可以使用 vue-jwt-token 库来管理 JWT 令牌:

import { useJwt } from 'vue-jwt-token'

export default {
  setup() {
    const jwt = useJwt('access_token')

    return {
      jwt
    }
  }
}

结论

通过使用 Flask-RESTful 和 Flask-JWT-Extended,你可以轻松安全地在 Flask 应用程序中实现多用户身份验证。此方法允许你根据用户角色实施灵活的访问控制,并为你的应用程序提供稳健的身份验证机制。

常见问题解答

  1. 如何在用户注册时生成 JWT 令牌?
    答:在用户注册时,你可以创建并返回一个访问令牌和刷新令牌,用于 subsequent 请求的身份验证。

  2. 如何处理 JWT 令牌过期?
    答:你可以使用刷新令牌机制来获取新访问令牌,并在访问令牌过期后自动刷新它们。

  3. 如何保护 API 端点免受跨站点请求伪造 (CSRF) 攻击?
    答:在 Flask-JWT-Extended 中,可以使用 csrf_protect 装饰器来保护你的端点免受 CSRF 攻击。

  4. 如何限制特定用户对某些资源的访问?
    答:你可以根据用户的角色和权限自定义你的访问控制逻辑,并仅允许经过授权的用户访问特定资源。

  5. 如何在不同设备上实现单一登录 (SSO)?
    答:可以使用第三方身份验证提供程序(例如 Google 或 Facebook)来实现 SSO,并使用 JWT 令牌在不同设备和应用程序之间共享身份信息。