如何在flask中允许多个帐户在同一浏览器上?

问题描述 投票:0回答:1

我正在关注本教程:https://www.geeksforgeeks.org/how-to-add-authentication-to-your-app-with-flask-login/ 但是当我运行代码时,我打开 2 个选项卡,然后注册到 test1 和 test2,但是第一个选项卡被覆盖并且都显示 test2,但我想允许多个帐户,例如不和谐或 Instagram,如果我打开了 2 个选项卡,我可以拥有2 个帐户,如果我关闭它们或打开一个新帐户,它只会打开最新登录的帐户

python authentication flask authorization
1个回答
0
投票

要在不同的浏览器选项卡中登录不同的帐户,您需要避免选项卡之间的会话共享。默认情况下,Flask 使用 cookie 来存储会话,该会话在同一浏览器中的所有选项卡之间共享。这就是为什么当您在一个选项卡上登录时,它会覆盖其他选项卡中的会话。

解决方案:使用基于令牌的身份验证

您可以使用 JWT(Json Web 令牌)来管理每个选项卡的身份验证。每个选项卡都有自己的令牌,允许不同的用户同时登录。

这是示例代码片段。

from flask import Flask, request, jsonify, render_template, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
import jwt
import datetime
from functools import wraps

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'

db = SQLAlchemy(app)

# User model
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(80))

# Utility to generate tokens
def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = request.cookies.get('token')
        if not token:
            return jsonify({'message': 'Token is missing!'}), 403
        try:
            data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
            current_user = User.query.filter_by(username=data['username']).first()
        except:
            return jsonify({'message': 'Token is invalid!'}), 403
        return f(current_user, *args, **kwargs)
    return decorated

@app.route('/signup', methods=['POST'])
def signup():
    data = request.form
    hashed_password = generate_password_hash(data['password'], method='sha256')
    new_user = User(username=data['username'], password=hashed_password)
    db.session.add(new_user)
    db.session.commit()
    return jsonify({'message': 'Registered successfully!'})

@app.route('/login', methods=['POST'])
def login():
    data = request.form
    user = User.query.filter_by(username=data['username']).first()

    if not user or not check_password_hash(user.password, data['password']):
        return jsonify({'message': 'Login failed!'})

    token = jwt.encode({
        'username': user.username,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
    }, app.config['SECRET_KEY'])

    # Set token in cookies
    response = jsonify({'message': 'Login successful!'})
    response.set_cookie('token', token, httponly=True)
    return response

@app.route('/logout', methods=['POST'])
@token_required
def logout(current_user):
    response = jsonify({'message': 'Logged out successfully!'})
    response.set_cookie('token', '', expires=0)
    return response

@app.route('/profile')
@token_required
def profile(current_user):
    return jsonify({
        'username': current_user.username,
        'message': 'This is your profile'
    })

if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

您可以找到更多在 Flask 应用程序中使用 JWT 进行身份验证的教程和博客。我希望这对你有一点帮助。

© www.soinside.com 2019 - 2024. All rights reserved.