Flask_实现token鉴权

目录

1、安装依赖

2、实现代码

3、测试

源码等资料获取方法


1、安装依赖

pip install flask
pip install pycryptodome

2、实现代码

import random
import string
import time
import base64

from functools import wraps

from flask import Flask, jsonify, session, request, make_response, g
from cryptography.hazmat.primitives.ciphers.aead import AESGCM


SECRET_KEY = "DnKRYZbvVzdhPlF01rtcxmi5Cj36AbCd"


app = Flask(__name__)
app.config["SECRET_KEY"] = SECRET_KEY


# ========================= 数据加密解密方法 ==============================================
def encrypt_aes_gcm(key, data, nonce_len=32):
    """
    AES-GCM加密
    :param key: 密钥。16, 24 or 32字符长度的字符串
    :param data: 待加密字符串
    :param nonce_len: 随机字符串长度
    """
    key = key.encode('utf-8')
    if not isinstance(data, str):
        data = str(data)
    data = data.encode('utf-8')
    # 生成32位长度的随机值,保证相同数据加密后得到不同的加密数据
    nonce = ''.join(random.sample(string.ascii_letters + stri
### JWT实现登录的原理 JWT(JSON Web Token)是一种基于JSON的开放标准(RFC 7519),用于在网络应用环境中传递声明(claims)。JWT的核心思想是通过数字签名确保数据的完整性和真实性,同时允许无状态的身份验证机制。在登录的场景中,JWT的工作流程如下: 1. **用户登录**:用户向服务器发送登录请求,包含用户名和密码。 2. **生成Token**:服务器验证用户凭证后,使用私钥生成一个JWT Token。该Token通常包含三部分:头信息(header)、消息体(payload)和签名(signature)[^4]。 3. **返回Token**:服务器将生成的JWT Token返回给客户端。 4. **携带Token**:客户端在后续请求中,将Token放在请求头中(通常是`Authorization`头),例如:`Bearer <token>`[^2]。 5. **验证Token**:服务器接收到请求后,验证Token的签名是否有效,并检查Token是否过期。如果验证通过,则允许访问受保护的资源;否则,拒绝请求[^1]。 ### JWT的结构 JWT由三部分组成,分别是: - **Header**:包含Token的类型(通常是JWT)和签名算法(如HMAC SHA256或RSA)。 - **Payload**:包含声明(claims),声明分为注册声明、公共声明和私有声明。常见的注册声明包括`iss`(签发者)、`exp`(过期时间)、`sub`(主题)等。 - **Signature**:对Header和Payload的签名,确保Token的完整性[^4]。 ### 代码示例 #### 后端生成JWT TokenPython Flask) 以下是一个使用Flask和`Flask-JWT-Extended`库生成JWT Token的示例: ```python from flask import Flask, jsonify, request from flask_jwt_extended import ( JWTManager, create_access_token, jwt_required, get_jwt_identity ) app = Flask(__name__) # 配置JWT的密钥 app.config['JWT_SECRET_KEY'] = 'super-secret-key' jwt = JWTManager(app) # 模拟用户数据库 users = { "admin": "password123" } @app.route('/login', methods=['POST']) def login(): username = request.json.get('username') password = request.json.get('password') if username in users and users[username] == password: access_token = create_access_token(identity=username) return jsonify(access_token=access_token), 200 else: return jsonify({"msg": "Bad username or password"}), 401 @app.route('/protected', methods=['GET']) @jwt_required() def protected(): current_user = get_jwt_identity() return jsonify(logged_in_as=current_user), 200 if __name__ == '__main__': app.run(debug=True) ``` #### 前端携带JWT Token(JavaScript Fetch API) 前端在获取到JWT Token后,可以在后续请求中通过`Authorization`头携带Token: ```javascript // 登录并获取Token fetch('http://localhost:5000/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: 'admin', password: 'password123' }) }) .then(response => response.json()) .then(data => { const token = data.access_token; // 使用Token访问受保护的接口 fetch('http://localhost:5000/protected', { method: 'GET', headers: { 'Authorization': `Bearer ${token}` } }) .then(response => response.json()) .then(protectedData => { console.log(protectedData); }); }); ``` #### Java解析JWT Token(使用`jjwt`库) 在Java中,可以使用`jjwt`库来解析和验证JWT Token: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.Claims; public class JwtUtil { private static final String SECRET = "your-secret-key"; public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); } public static String parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token) .getBody() .getSubject(); } public static void main(String[] args) { String token = generateToken("admin"); System.out.println("Generated Token: " + token); String username = parseToken(token); System.out.println("Parsed Username: " + username); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值