11

由于在 Google 上启用了 2 因素身份验证(又名 2 步验证),我的Google 导出脚本不再起作用。计算机经过验证和信任,但不知何故脚本不是。实际上,每次运行 cron 作业时,我都会收到一个新的“Google 验证码”并且脚本失败。wget我认为使用or对此类脚本进行一劳永逸的身份验证应该是一件简单的事情curl,但是我找不到任何有关如何执行此操作的文档。


Google 身份验证方案经过多次迭代,我似乎无法再使用curl或登录mechanicalsoup。我尝试过使用类似的 URL https://accounts.google.com/ServiceLogin?continue=https://calendar.google.com/calendar/exporticalzip&Email=username@gmail.com&Passwd=application-specific-password,但我总是被重定向到登录页面,通常会显示“请使用您的帐户密码而不是应用程序专用密码”的消息。

4

4 回答 4

6

您确定要在 shell 脚本中使用 2-factor auth 吗?如果是这样,您无需尝试将您的计算机或脚本设置为“受信任”。每次运行脚本时,您只需执行完整的 2 因素身份验证。

如果目标是跳过手动第二因素身份验证,我建议使用特定于应用程序的密码(正如其他答案已经建议的那样)。假装您根本没有使用 2-factor auth并使用您的真实登录名,但将密码设置为在https://accounts.google.com/b/0/IssuedAuthSubTokens?hl=en生成的密码(https的子页面) ://www.google.com/settings/security)。

目的是将特定于应用程序的密码“名称”设置为对您有意义的值。例如,我有标记为“Pidgin at work”、“My Android Phone”、“Thunderbird Google Address Book Extension at Work”等的密码。您可以为“日历和阅读器导出脚本”设置一个密码。如果您认为此应用程序特定密码已泄露(“泄露”),只需点击同一页面上的“撤销”链接,然后为您的脚本生成一个新密码。

对于代码,只需使用与 Google 单因素身份验证一起使用的最新版本。更新:因为原始问题使用 URLhttps://accounts.google.com/ServiceLogin来启动会话登录,所以它实际上是在伪造浏览器登录。但是,Google 并未正式支持这一点,在我写这篇文章时,似乎使用应用程序特定密码进行正常登录最终会出现错误消息“请使用您的帐户密码而不是应用程序特定密码”。

关于 Google 2-factor auth 和“受信任的计算机”需要了解的一件事是,实际实施只是向您的浏览器添加了一个具有 30 天到期时间的永久 cookie。受信任的计算机并不意味着您的 IP 地址受信任或创建了其他一些神奇的连接。除非您的脚本从您选择的浏览器中捕获“受信任的计算机”cookie,否则您是否曾经将您的计算机标记为受信任并不重要。(Google 表单不应该说“记住这台计算机 30 天”,而是“信任这个浏览器和用户帐户组合 30 天(保存永久 cookie)”。但是,我想这被认为过于技术性......)

更新:(从我下面的评论中复制)唯一官方支持的方法(服务器到服务器应用程序)记录在https://developers.google.com/accounts/docs/OAuth2ServiceAccount它需要对请求进行 OAuth/JWT 编码并使用在https://code.google.com/apis/console创建的服务帐户私钥。作为替代方案,您可以使用 ClientLogin 身份验证(已弃用,尽力服务,直到 2015 年)。

如果您决定使用 OAuth,您可能需要查看http://blog.yjl.im/2010/05/bash-oauth.htmlhttps://github.com/oxys-net/curl-oauth

于 2012-07-09T05:57:00.597 回答
2

我的 python 脚本停止发送电子邮件,所以我生成了应用程序专用密码,将我的脚本实用程序 gmail 帐户(例如,myscriptutility@gmail.com)更改为该密码,然后通过以下方式成功使用该密码(例如“applicationpassw”) python 脚本片段(抱歉,没有完整的示例)。

email = SMTPHandler(mailhost=('smtp.gmail.com',587),
    fromaddr='anyaddress@mail.homeserver',
    toaddrs=['whoiwanttomailto@gmail.com'],
    subject= webSite + ' not working',
    credentials=('myscriptutility@gmail.com','applicationpassw'),
    secure=())
logger.addHandler(email)

因此,至少在 Windows 10 上的 python 3.6.5 看来,所有需要做的就是更改为在帐户和应用程序中使用十六个字符的应用程序特定密码。

于 2019-01-29T21:29:35.093 回答
0

使应用程序特定密码适用于我的脚本,您所做的就是创建密码,然后在您的脚本中输入您的谷歌帐户密码,而不是输入应用程序特定密码。

有关应用程序特定密码的更多信息,请参见此处:

应用程序特定密码

希望这可以帮助 !!

于 2012-04-27T11:04:28.177 回答
0

生成应用程序专用密码用户文档开发者文档

于 2012-04-23T14:14:32.747 回答