如何在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
相关产品推荐
相关产品推荐

