我正在尝试自动执行某些工作任务。我们有一个门户网站,要求您通过Google登录。我创建了一个Puppeteer实例,导航到Google身份验证页面,键入我的电子邮件和密码,然后存储cookie,以便我可以浏览和操作门户。
这完全适用于我的本地环境,但我已将其部署到Heroku,而Google则添加了一个标志性的挑战。输入密码后,我会收到“验证它是你”页面,上面写着“此设备无法识别”,并要求我完成2-FA身份验证。
我知道我无法关闭2-FA,那么绕过这个最好的方法是什么?
或者,是否有更简单的方法登录由Google身份验证保护的网站并存储会话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
}
我的工作解决方案(需要一些重构)
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()
})()
不可能我害怕而不是你想要的答案。
我知道我无法关闭2-FA,那么绕过这个最好的方法是什么?`
如果有可能绕过它,那么它就为黑客打开了大门,因为双因素身份验证在此过程中是一个额外的步骤,第二个安全层将重新确认您的身份。其目的是让攻击者的生活更加艰难,降低欺诈风险!
我也会添加一个Android应用程序。您可以使用短信代码设置2FA,具有短信读取权限的Android应用可以读取短信并与后端连接。
后端可以发送推送消息,可能使用Firebase Cloud Messaging到无头Chrome运行的本地Node.js实例,以便在2FA屏幕中输入。
我认为没有其他办法可以做到这一点。虽然我建议不要这样做,因为它可能会为安全问题打开一些后门。
我实际上可以在Puppeteer中使用Twilio API以编程方式接收SMS代码。您必须为此设置一个特殊的Google帐户才能将Twilio号码用作手机或更改Twilio号码的当前Google帐户主要手机号码,并将您的常规号码用作Google帐户信息中的辅助联系人。