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

