为何signInWithPopup()在pywebview中无法正常工作?
解决pywebview中Firebase谷歌登录弹窗连接失败的问题
问题原因
pywebview的WebView容器与普通浏览器的弹窗机制存在差异,默认会拦截弹窗或限制弹窗与主窗口的同源通信,导致Firebase无法完成弹窗登录的回调流程,从而出现连接失败提示。
解决方案
方案1:切换Firebase登录为重定向模式(推荐)
放弃弹窗登录,改用当前窗口重定向完成登录,从根源避免弹窗拦截问题:
- 修改前端登录代码,将
signInWithPopup替换为signInWithRedirect:
// 原弹窗登录代码 // signInWithPopup(auth, provider) // 修改为重定向登录 signInWithRedirect(auth, provider);
- 在页面初始化时处理重定向返回的登录结果:
getRedirectResult(auth) .then((result) => { if (result.user) { // 登录成功,处理用户信息 } }) .catch((error) => { // 处理登录错误 });
方案2:配置pywebview允许弹窗及跨窗口通信
若必须使用弹窗模式,需配置pywebview启用弹窗权限,以CEF引擎为例:
修改Python代码,在create_window中添加webview_options配置:
from tkinter import * import webview root = Tk() win_width = root.winfo_screenwidth() win_height = root.winfo_screenheight() root.geometry("%dx%d" % (win_width, win_height)) webview.create_window( title='My Window', url='http://localhost:81', confirm_close=True, webview_options={ 'webview_settings': { 'allow_popups': True, 'javascript_open_windows_automatically': True } } ) webview.start() root.destroy()
同时需确保Firebase控制台的授权域名列表中已包含http://localhost:81(浏览器中正常则已配置)。
方案3:自定义登录流程(备选)
通过pywebview的js_api实现Python与前端的通信,将登录状态从前端传递到Python端,或直接在Python端处理OAuth授权逻辑,但此方案复杂度较高,仅作为前两种方案的备选。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

