You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kivy应用中使用Pyrebase实现用户持久登录(无需Flask)

在Kivy应用中用Pyrebase实现持久化登录(无需Flask)

核心思路

不存储明文密码,利用Firebase Auth返回的**刷新令牌(refreshToken)**实现会话持久化。应用启动时,用刷新令牌换取新的ID令牌,维持登录状态,同时将令牌存储在系统安全容器中而非明文文件。

步骤实现

1. 选择安全存储方案

  • 桌面端:使用keyring库,将令牌存入系统密钥链(如Windows凭据管理器、macOS钥匙串)
  • 移动端:可使用plyer的secure_storage模块调用平台原生安全存储API

以桌面端为例,先安装依赖:

pip install keyring

2. 修改认证代码,加入持久化逻辑

更新原有代码,添加令牌保存、加载、刷新功能:

import pyrebase
import keyring
import json

# Firebase初始化配置
firebase_config = {
  "apiKey": "My apiKey",
  "authDomain": "my authDomain",
  "projectId": "my project",
  "storageBucket": "my storageBucket",
  "messagingSenderId": "my messaging senderid",
  "appId": "my app id",
  "databaseURL": "my url"
}
firebase = pyrebase.initialize_app(firebase_config)
auth = firebase.auth()

# 密钥链标识(自定义)
KEYRING_SERVICE = "KivyFirebaseAuthApp"
KEYRING_USER = "auth_tokens"

class EmailAuth:
    @staticmethod
    def sign_up(login, password):
        user_auth = auth.create_user_with_email_and_password(login, password)
        EmailAuth._save_tokens(user_auth)
        print('注册成功')
        return user_auth

    @staticmethod
    def sign_in(login, password):
        user_auth = auth.sign_in_with_email_and_password(login, password)
        EmailAuth._save_tokens(user_auth)
        print('登录成功')
        return user_auth

    @staticmethod
    def _save_tokens(user_auth):
        # 将refreshToken和用户ID序列化后存入密钥链
        token_data = json.dumps({
            "refreshToken": user_auth["refreshToken"],
            "localId": user_auth["localId"]
        })
        keyring.set_password(KEYRING_SERVICE, KEYRING_USER, token_data)

    @staticmethod
    def load_saved_session():
        # 尝试加载并刷新会话
        try:
            token_data = keyring.get_password(KEYRING_SERVICE, KEYRING_USER)
            if not token_data:
                return None
            
            token_data = json.loads(token_data)
            # 用刷新令牌换取新的有效令牌
            refreshed_user = auth.refresh(token_data["refreshToken"])
            # 更新存储的令牌(刷新后可能返回新的refreshToken)
            EmailAuth._save_tokens(refreshed_user)
            return refreshed_user
        except Exception as e:
            print(f"会话加载失败: {str(e)}")
            return None

    @staticmethod
    def sign_out():
        # 删除密钥链中的令牌
        try:
            keyring.delete_password(KEYRING_SERVICE, KEYRING_USER)
            print('退出登录成功')
        except keyring.errors.PasswordDeleteError:
            print('无已登录会话')

3. 在Kivy应用启动时检查会话

在应用入口添加会话校验逻辑,自动恢复登录状态:

from kivy.app import App
from kivy.uix.label import Label

class MyKivyApp(App):
    def build(self):
        # 启动时尝试加载保存的会话
        saved_session = EmailAuth.load_saved_session()
        if saved_session:
            return Label(text=f"欢迎回来!用户ID: {saved_session['localId']}")
        else:
            return Label(text="请登录或注册")

if __name__ == "__main__":
    MyKivyApp().run()

注意事项

  • 移动端适配:若开发Android/iOS应用,keyring无法直接使用,需替换为plyer的安全存储模块或平台原生API
  • 令牌失效处理:若用户在Firebase控制台手动撤销令牌,refresh方法会抛出异常,需引导用户重新登录
  • 错误提示:实际应用中需给用户添加友好的错误反馈,如会话失效时提示重新登录

内容的提问来源于stack exchange,提问作者Artur Carneiro Barroso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:15:17