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

Symfony/Panther爬取登录后内容失效,无法维持认证状态求助

Symfony/Panther爬虫无法维持Firebase认证状态的解决思路

问题描述

基于Symfony/Panther编写学习用简易爬虫,目标网站部署在Google Firebase并使用其认证系统:

  • 脚本点击登录按钮后可成功进入个人资料页
  • 跳转至其他页面时,会以匿名用户身份运行,无法维持认证状态

登录时观察到的关键POST请求:

identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=somekey
identitytoolkit.googleapis.com/v1/accounts:lookup?key=somekey

额外POST请求:

us-central1-dreampen-xxxxx.cloudfunctions.net/getSubscriberInfo

错误截图:
错误截图

解决建议

1. 确保会话上下文持续

  • 全程使用同一个Client实例,不要每次跳转新建实例,Panther默认依赖该实例维护Cookie和会话状态
  • 登录后通过$client->getCookieJar()查看Firebase相关Cookie(如__session、firebase-auth-token)是否存在,跳转后再次检查是否保留

2. 手动注入Firebase认证Token

Firebase认证依赖ID Token和会话信息,可通过以下方式处理:

  • 拦截signInWithPassword的响应,提取idToken、refreshToken及用户信息
  • 使用Panther的executeScript将Token存入localStorage(Firebase前端SDK默认存储位置):
    $client->executeScript('
        localStorage.setItem("firebase:authUser:<YOUR_API_KEY>:<YOUR_PROJECT_ID>", JSON.stringify({
            idToken: "'.$idToken.'",
            refreshToken: "'.$refreshToken.'",
            email: "your-email@example.com"
        }));
    ');
    
  • 替换<YOUR_API_KEY>为请求中key=somekey的somekey,<YOUR_PROJECT_ID>为目标网站的Firebase项目ID

3. 等待完整登录流程完成

  • 不要在登录按钮点击后立即跳转,需等待所有认证相关请求(signInWithPassword、lookup、getSubscriberInfo)完成
  • 使用waitFor方法等待个人资料页的标志性元素加载,确认登录状态稳定:
    $client->waitFor('#user-profile-avatar', 10); // 等待10秒直到头像元素出现
    

4. 检查浏览器实例配置

  • 确保ChromeDriver未禁用Cookie或localStorage,避免启动参数包含--disable-local-storage、--block-third-party-cookies等限制项
  • Panther默认配置支持存储,但可手动确认:
    $client = Client::createChromeClient(null, [
        '--enable-local-storage',
        '--accept-cookies'
    ]);
    

5. 直接调用Firebase认证API登录

跳过模拟点击,直接发送认证请求获取Token,再注入浏览器:

// 发送登录请求
$response = $client->request('POST', 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=somekey', [
    'json' => [
        'email' => 'your-login-email',
        'password' => 'your-login-password',
        'returnSecureToken' => true
    ]
]);
$authData = json_decode($response->getContent(), true);

// 注入Token到localStorage
$client->executeScript('
    localStorage.setItem("firebase:authUser:<YOUR_API_KEY>:<YOUR_PROJECT_ID>", JSON.stringify('.json_encode($authData).'));
');

内容的提问来源于stack exchange,提问作者Rituparna sonowal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:05:12