📜  jwt 身份验证 python flask - Python (1)

📅  最后修改于: 2023-12-03 14:43:37.771000             🧑  作者: Mango

JWT 身份验证 Python Flask

介绍

本篇文章将介绍如何在 Python Flask 中使用 JWT 进行身份验证。JWT 是一种用于跨域请求认证的标准,可以通过一个 JSON 对象来传递认证信息,特别适用于分布式系统。

前置知识

在学习本篇文章之前,需要掌握以下知识点:

  • Python 基础语法
  • Flask 基础知识
  • 跨域请求认证的概念
安装和初始化

首先,我们需要安装必要的 Python 库:

pip install flask
pip install pyjwt

然后,我们需要初始化 Flask 应用,并定义一些必要的配置:

from flask import Flask

app = Flask(__name__)
app.config['SECRET_KEY'] = 'my_secret_key'  # 密钥,用于签名 JWT
身份验证

接下来,我们将编写一个装饰器,用于验证用户的身份。在该装饰器中,我们将从请求头中读取 JWT 令牌,然后进行解码和验证。如果令牌验证通过,则将当前用户设置为全局变量 g 中。

from flask import g, request
import jwt

def login_required(func):
    def wrapper(*args, **kwargs):
        token = request.headers.get('Authorization', None)

        if token is None:
            return {'error': '登录态已失效,请重新登录。'}

        try:
            payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
            g.user_id = payload['user_id']
            g.username = payload['username']
        except jwt.DecodeError:
            return {'error': '登录态已失效,请重新登录。'}
        except jwt.ExpiredSignatureError:
            return {'error': '登录态已过期,请重新登录。'}

        return func(*args, **kwargs)

    return wrapper

经过上述操作,我们就成功地将 JWT 令牌解码并验证了。

生成令牌

在用户登录时,我们需要生成一个 JWT 令牌并将其返回给客户端。在本示例中,我们将 JWT 令牌的有效期设置为 1 小时。

import datetime

@app.route('/login', methods=['POST'])
def login():
    username = request.form.get('username')
    password = request.form.get('password')

    if username == 'admin' and password == 'admin':
        expiration = datetime.datetime.utcnow() + datetime.timedelta(hours=1)
        token = jwt.encode({
            'user_id': 1,
            'username': 'admin',
            'exp': expiration
        }, app.config['SECRET_KEY'], algorithm='HS256')
        return {'token': token}, 200
    else:
        return {'error': '用户名或密码错误。'}, 401
使用

现在,我们就可以使用上面定义的装饰器进行身份验证了。在本示例中,我们定义了一个需要登录态才能访问的 API:

@app.route('/userinfo', methods=['GET'])
@login_required
def userinfo():
    return {'user_id': g.user_id, 'username': g.username}, 200

在访问该 API 时,客户端需要将 JWT 令牌包含在请求头中:

Authorization: <token>
结语

至此,我们已经完成了 Python Flask 中使用 JWT 进行身份验证的示例,希望对大家有所帮助。完整代码见下: