Javascript 使用无头Chrome/Puppeter登录谷歌时遇到问题

Javascript 使用无头Chrome/Puppeter登录谷歌时遇到问题,javascript,node.js,heroku,google-authentication,puppeteer,Javascript,Node.js,Heroku,Google Authentication,Puppeteer,我正试图为工作自动化某些任务。我们有一个门户网站,要求您通过谷歌登录。我已经创建了一个Puppeter实例,它可以导航到GoogleAuth页面,输入我的电子邮件和密码,然后存储cookies,这样我就可以浏览和操作门户 这在我的本地环境中非常有效,但我已经将其部署到Heroku,Google添加了一个登录挑战。输入密码后,我会看到“验证是你”页面,上面写着“此设备无法识别”,并要求我完成2-FA身份验证 我知道我不能关闭2-FA,那么什么是最好的绕过它的方法呢 或者,是否有更简单的方法登录到由

我正试图为工作自动化某些任务。我们有一个门户网站,要求您通过谷歌登录。我已经创建了一个Puppeter实例,它可以导航到GoogleAuth页面,输入我的电子邮件和密码,然后存储cookies,这样我就可以浏览和操作门户

这在我的本地环境中非常有效,但我已经将其部署到Heroku,Google添加了一个登录挑战。输入密码后,我会看到“验证是你”页面,上面写着“此设备无法识别”,并要求我完成2-FA身份验证

我知道我不能关闭2-FA,那么什么是最好的绕过它的方法呢

或者,是否有更简单的方法登录到由Google auth保护的网站并存储会话cookie

这是我的木偶师代码,任何帮助都将不胜感激:

async function getCookies() {
    const browser = await puppeteer.launch({ 
      args: [
        '--no-sandbox', 
        '--disable-setuid-sandbox', 
        '--disable-gpu'
      ] 
    })
    const page = await browser.newPage()
    await page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36')
    await page.goto(process.env.URL)
    await page.waitForSelector('#identifierId')
    await page.type('#identifierId', process.env.EMAIL, { delay: 5 })
    await page.click('#identifierNext')
    await page.waitForSelector('#password input[type="password"]', { visible: true });
    await page.type('#password input[type="password"]', process.env.PASS, { delay: 5 })
    await page.click('#passwordNext')
    await page.waitFor(3000)
    const cookies = await page.cookies()
    await browser.close()
    return cookies
  }

不可能恐怕这不是你想要的答案

我知道我不能关闭2-FA,那么什么是最好的旁路方式呢 这个`


如果有可能绕过,那么它会为黑客打开一扇门,因为双因素身份验证是过程中的一个额外步骤,第二个安全层将重新确认您的身份。其目的是使攻击者的生活更加艰难,并减少欺诈风险

我也会在混合中添加一个Android应用程序。您可以使用SMS代码设置2FA,具有SMS读取权限的Android应用程序可以读取SMS并连接后端

后端可以发送推送消息,可能是使用Firebase云消息发送到本地Node.js实例,其中headless Chrome正在运行,以便在2FA屏幕中输入消息


我认为没有别的办法了。尽管我建议不要这样做,因为这可能会为安全问题打开一些后门。

我实际上可以在Puppeter中使用Twilio API以编程方式接收SMS代码。您必须为此设置一个特殊的Google帐户,才能将Twilio号码用作手机,或者将您当前的Google帐户主手机号码更改为Twilio号码,并将您的常规号码用作Google帐户信息中的辅助联系人

我的工作解决方案(需要一些重构)


你找到解决办法了吗?看来这只适用于美国、加拿大和英国以外的国家。在列出的国家/地区,Twilio号码将不会收到来自短代码的短信。看见
const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch({
    headless: false,        // for debugging only
    ignoreHTTPSErrors: true // This happens when you use a self signed certificate locally
  })
  const page = await browser.newPage()

  await page.setViewport({ width: 1280, height: 800 })
  await page.goto('https://myawesomesystem/loginFrm01')
  const navigationPromise = page.waitForNavigation()

  // Clicks on the login button    
  const googleLoginButtonSelector = 'body > section > ... > div'
  await page.waitForSelector( googleLoginButtonSelector )
  await page.click( googleLoginButtonSelector )

  // wait for the google oauth page to open
  const googleOAuthTarget = await browser.waitForTarget( target => {
    // console.log( target.url() ); // debugging
    return target.url().indexOf('https://accounts.google.com/signin/oauth/identifier') !== -1
  })

  const googleOAuthPage = await googleOAuthTarget.page()

  await googleOAuthPage.waitForSelector('#identifierId')
  await googleOAuthPage.type('#identifierId', CRED.user, { delay: 5 } )
  await googleOAuthPage.click('#identifierNext')

  await googleOAuthPage.waitForSelector('input[type="password"]', { visible: true })
  await googleOAuthPage.type('input[type="password"]', CRED.pass )

  await googleOAuthPage.waitForSelector('#passwordNext', { visible: true })
  await googleOAuthPage.click('#passwordNext')

  await navigationPromise

  // HERE:
  // the user has been authenticated
  // or login window was closed
  // or whatever else, please check

  await browser.close()
})()