【问题标题】:How to use Google application-specific password in script?如何在脚本中使用 Google 应用程序专用密码?
【发布时间】:2012-05-02 18:20:04
【问题描述】:

自从在 Google 上启用两步验证(又名两步验证)后,我的 Google export scripts 不再工作。计算机经过验证和信任,但不知何故脚本不是。实际上,每次运行 cron 作业时,我都会收到一个新的“Google 验证码”并且脚本失败。我认为使用wgetcurl 一次性验证此类脚本应该是一件简单的事情,但我找不到任何有关如何执行此操作的文档。


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

【问题讨论】:

  • 您应该尝试使用 OAuth2 而不是这种已弃用的旧方法,这样验证令牌的麻烦就会减少。
  • @Tim:有没有关于如何在 shell 脚本中使用它的指南?
  • tools.ietf.org/html/draft-ietf-oauth-v2-25 的规范显示了如何做到这一点。我认为curl 可能能够做 https 的东西,让你通过--raw 传递请求?或者也许 curl 有适合这种东西的选项?
  • @ams:有例子或教程吗?

标签: python bash security google-authentication


【解决方案1】:

【讨论】:

  • 我无法从 shell 脚本中弄清楚如何做到这一点。 很多 的谷歌搜索并没有发现一个似乎能够进行两步验证的 shell 脚本。
  • 请检查链接 - 这是使用随机生成密码的单步验证,专门用于与两步验证不兼容的应用程序。
  • “如果您是 Google Apps API 开发人员并使用 ClientLogin 身份验证” - 据我所知,我没有 - authentication script 使用 ServiceLoginAuth,只需将密码替换为应用程序专用密码无效。
  • 不知道能不能这样登录。您可能可以使用一次性代码,但这不是很舒服;或通过浏览器登录,并使用脚本中的 cookie,但最好的方法可能是修改脚本以使用其他登录选项(ClientLogin 与普通的 Web 身份验证没有太大区别,尽管正如 Tim 所指出的,它已被弃用)。
【解决方案2】:

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

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

Application Specific Passwords

希望对你有帮助!!

【讨论】:

  • 已经试过了,没有接受请求。你有实际的代码示例吗?
【解决方案3】:

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

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

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

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

关于 Google 2 因素身份验证和“受信任的计算机”需要了解的一点是,实际实施只是向您的浏览器添加一个有效期为 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

【讨论】:

  • 错误消息是“请使用您的帐户密码而不是应用程序专用密码。”一旦激活了 2 因素登录,谷歌似乎正在积极取消对使用纯密码登录的任何支持。唯一官方支持的方法(服务器到服务器应用程序)记录在 developers.google.com/accounts/docs/OAuth2ServiceAccount。它需要对请求进行 OAuth/JWT 编码并使用在 code.google.com/apis/console 创建的服务帐户私钥。作为替代方案,您可以使用 ClientLogin 身份验证(2015 年之前的尽力服务)。
  • 如果您决定使用 OAuth,您可能需要查看 blog.yjl.im/2010/05/bash-oauth.htmlgithub.com/oxys-net/curl-oauth
  • 在我看来,您只能使用 Google 的 OAuth2 服务帐户提供的access_token 来访问 Google 公开可用的 API (developers.google.com/apis-explorer)。这意味着您不能像使用浏览器时那样冒充自己的用户帐户并向无 API Google 端点(例如:mail.google.com/mail/u/0/#inbox)发送请求。对吗?
  • 这是一个非常古老的答案,但我认为这是正确的。 OAuth2 access_token 仅用于官方 API。我假设 Google 根本不想支持非官方 API,如果你必须冒充人类来做你想做的事,我猜你必须禁用 2 因素身份验证才能做到这一点。如果您继续模拟使用非官方 API,请务必小心不要触发任何限制,否则您的帐户可能会自动锁定。众所周知,Google 会出于安全目的应用各种启发式方法 - 当然是没有记录的。
【解决方案4】:

我的 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,所有需要做的就是更改为在帐户和应用程序中使用十六个字符的应用程序特定密码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2011-04-17
    • 2018-06-12
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多