Pyrebase 和 Flask 如何知道用户是否登录?

How to know whether user is logged in or not in Pyrebase and Flask?

app = Flask(__name__)
firebase = pyrebase.initialize_app(config)
auth = firebase.auth()
db = firebase.database()

@app.route('/login', methods=["POST", "GET"])
    def login():
        message = ""
        if request.method == "POST":
            email = request.form["login_email"]
            password = request.form["login_password"]
            try:
                user = auth.sign_in_with_email_and_password(email, password)
                user = auth.refresh(user['refreshToken'])
                user_id = user['idToken']
                return redirect(url_for('admin'))
            except:
                message = "Incorrect Password!"
        return render_template("login.html", message=message)

@app.route('/admin')
def admin():
    return render_template("admin.html")

if __name__ == '__main__':
    app.run()

如何在用户登录时只加载 /admin 页面?我知道它与用户令牌有关,但我仍然不确定如何使用令牌来识别用户是否已登录。此外,useruser_id 未在 admin() 中定义,仅在 login() 中定义,因为它们在函数中。

那么我需要在我的代码中更改什么才能仅在用户登录时加载 /admin 页面?

使用 flask session 来存储你的密钥,如果密钥存在则用户被登录,

您还可以全局访问单个会话的所有会话变量

from flask import Flask, session, request
import requests
import os

app = Flask(__name__)
app.secret_key = os.urandom(24)
firebase = pyrebase.initialize_app(config)
auth = firebase.auth()
db = firebase.database()

@app.route('/login', methods=["POST", "GET"])
def login():
    message = ""
    try:
        print(session['usr'])
        return redirect(url_for('admin'))
    except KeyError:
        if request.method == "POST":
            email = request.form["login_email"]
            password = request.form["login_password"]
            try:
                user = auth.sign_in_with_email_and_password(email, password)
                user = auth.refresh(user['refreshToken'])
                user_id = user['idToken']
                session['usr'] = user_id
                return redirect(url_for('admin'))
            except:
                message = "Incorrect Password!"
        return render_template("login.html", message=message)

@app.route('/admin')
def admin():
    try:
        print(session['usr'])
        return render_template("admin.html")
    except KeyError:
        return redirect(url_for('login'))


if __name__ == '__main__':
    app.run()

如果session['usr']没有分配那么它会给出关键错误,这意味着用户未登录。但请注意,在注销过程中,您需要删除该用户的会话。