node.js - headless Chrome 脚本使用同一 session 并跳过双因素身份验证

标签 node.js puppeteer headless-browser google-chrome-headless two-factor-authentication

有一个网站使用双因素身份验证。在登录表单上有一个复选框,选中该复选框后,我可以在首次成功登录后绕过双因素身份验证步骤(针对当前设备)。我希望一开始手动执行此操作,然后使用 headless Chrome 自动登录。我认为通过将 puppeteer 指向我的 Chrome 应用程序并将 userDataDir 指向我的个人资料,它将允许 puppeteer访问已经登录的站点。但是当我使用 puppeteer 访问该站点时,它仍然显示双因素身份验证步骤。

有谁知道可能缺少什么才能让我在没有双因素身份验证的情况下访问该网站?只是澄清一下:手动使用 Chrome 并登录不会显示双因素身份验证步骤,但使用 puppeteer 会显示。

请注意,在以下代码中,#remember-me 是允许我跳过双因素身份验证的复选框。

const puppeteer = require('puppeteer');

(async() => {
    const browser = await puppeteer.launch({
        executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', 
        headless: true, 
        userDataDir: '/Users/xxxx/Library/Application Support/Google/Chrome'
    });
    const page = await browser.newPage();
    await page.goto('https://portal.insperity.com', {waitUntil: 'networkidle2'});
    await page.evaluate(() => {
        document.querySelector('#username').value = 'username';
        document.querySelector('#password').value = 'password';
        document.querySelector('#remember-me').checked = true;
        document.querySelector('#submit').click();
    })
    await page.waitFor(1000);
    await page.screenshot({path: 'page2.png'});
    await browser.close();
})();

更新:我尝试将 headless 属性更改为 false 并注释掉 await browser.close() 行并执行脚本。在启动的 Chrome 实例中,我注意到我没有登录 Google 或 Stack Overflow。所以看起来我的 cookie 没有被发送。可能是什么原因造成的或者我错过了什么?

以下是我正在使用的软件的规范,供引用:

  • MacOS 10.13.2
  • Chrome 65.0.3325.181
  • puppeteer 师1.3.0
  • Node 10.0.0

最佳答案

如果您的网站使用 cookie 进行身份验证,您最好设置 cookie 并绕过双因素身份验证。但这意味着您必须从某个地方获取cookie。

await page.goto('https://youhomepage.com');

    let cookieObject ={
        name:"JSESSIONID",
        value:"9C8E6659B14C2963EDED73C16BB0868A",
        Expires:"Tue, 19 Jan 2038 03:14:07 GMT"
        }

await page.setCookie(cookieObject);
await page.waitFor(1000);
await page.goto('https://youhomepage.com');

关于node.js - headless Chrome 脚本使用同一 session 并跳过双因素身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50033134/

相关文章:

google-chrome - 如何通过socks5代理让puppeteer工作?

java - HtmlUnit API for Java( headless (headless)浏览器)出现问题?

ruby - 使用 headless_chrome 模拟设备

javascript - 如何使 phantomjs 浏览器可见?

javascript - 描述外部的 beforeEach 是否总是在描述内部的 beforeEach 开始之前完成?

node.js - React.js 从 Node 后端下载 pdf 文件

javascript - 如何使用 puppeteer 设置 DOM 元素的值?

angular - 使用 Chrome 的 Docker 镜像进行 Karma 测试

javascript - React.js : can't get an property in an array of objects in render() function

javascript - 我想我不会 "get"异步编程