【问题标题】:curl + https://mail.google.com/mail/feed/atom = 401 Unauthorizedcurl + https://mail.google.com/mail/feed/atom = 401 未经授权
【发布时间】:2021-03-03 01:12:39
【问题描述】:

过去,我已经成功地能够在 bash 或 zsh shell 脚本中使用 curl 访问我的 Gmail 帐户,如下所示:

USERNAME='example@gmail.com'
PASSWORD='superSeckret'
URL='https://mail.google.com/mail/feed/atom'

curl -s -u "$USERNAME:$PASSWORD" "$URL"

但是,现在当我尝试这个时,我得到了这个错误:

<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>

如果我在网络浏览器中打开https://mail.google.com/mail/feed/atom,它会按预期显示提要,但我无法通过curl 让它工作。

我尝试查看 Google 是否已关闭对此的访问,但我没有看到任何似乎相关的内容,但我仍然无法使其正常工作。

还有其他方法可以尝试吗?

至少我希望在我的 Gmail 收件箱中获得未读邮件的计数。

能够看到 From: 和 Subject: 行也很好。

(我已经从我的常规 Gmail 帐户以及我的工作电子邮件中尝试过这个,这是一个支持“不太安全的应用程序”的 Google 套件/Google Apps 地址。我实际上是在为我的工作尝试这样做电子邮件。)

任何帮助将不胜感激。

【问题讨论】:

  • mail.google.com/mail/u/0/feed/atom 正在请求 HTTP 基本身份验证登录,但是当提供有效凭据时,它说凭据无效...看起来端点已损坏,有人应该向 google 发送错误报告
  • 这个问题的代码中充满了“花哨”的unicode引号,在shell脚本中无法正常工作。我认为它们在脚本中实际上并非如此(或者你会得到更明显的错误),但无论如何它们可能应该在问题中得到纠正。
  • 很奇怪。我不知道“智能”引号是如何出现的,但它们绝对不是原版的。我已经更新了帖子。

标签: bash curl gmail zsh


【解决方案1】:

经过一些测试,似乎要使用这个端点,你首先必须尝试登录,你会失败,然后你必须正常登录到gmail,然后去https://myaccount.google.com/notifications并找到你失败的登录尝试列出并确认 that was me ,然后 https://mail.google.com/mail/feed/atom 端点应该再次使用 HTTP Basic Auth.. 至少这对我有用

【讨论】:

    【解决方案2】:

    经过多次反复试验,我找到了一种可行的方法。

    我不知道为什么这种方式有效,而另一种方式(曾经有效)则无效。

    我只知道从 2021 年 3 月 3 日起,这种方式有效,而另一种方式无效。

    对于 Gmail

    如果您的 Gmail 地址是 example@gmail.com,那么这将起作用

    curl -sfLS "https://example:supersekretpassword@mail.google.com/mail/feed/atom"
    

    对于由 Google 托管的域

    如果您的 Google Suite/Google Apps/任何帐户是 me@example.com,那么这将起作用

    curl -sfLS "https://me%40example.com:supersekretpassword@mail.google.com/mail/feed/atom"
    

    【讨论】:

    • 任何不启用“不太安全的应用程序访问”的替代方案?
    【解决方案3】:

    “不太安全的应用访问”选项

    一旦关闭“不太安全的应用程序访问”选项,即使在 atom 提要端点上使用正确的凭据,您也会收到 HTTP 状态 401。

    转到https://myaccount.google.com/security 以激活“不太安全的应用程序访问”选项以确保身份验证再次成功。

    根据https://support.google.com/accounts/answer/6010255?p=less-secure-apps,该选项在一段时间不使用后会自动设置为关闭

    使用 OAuth 进行身份验证

    防止这些身份验证问题的更聪明的方法是使用 OAuth 协议进行身份验证:https://developers.google.com/gmail/gmail_inbox_feed

    【讨论】:

    • 您可以使用以下 URL 直接访问该设置:myaccount.google.com/lesssecureapps> 但是,如果您启用了 2FA(就像我一样),它会告诉您该功能不适用于 2FA 帐户并且您拥有使用应用专用密码。
    【解决方案4】:

    这就是我将 OAuth 2.0 用于“https://mail.google.com/mail/feed/atom”的方式

    获取“客户 ID”

    1. https://console.developers.google.com/中创建一个项目
    2. 如果您不想发布此应用,请添加“测试用户”
    3. 在该项目中创建 OAuth 2.0 客户端 ID
    4. 获取client_id和client_secret

    获取“授权码”

    1. 将以下网址中的[client_id]替换为获取的client_id,并在浏览器中访问链接
     https://accounts.google.com/o/oauth2/auth?client_id=[client_id]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://mail.google.com/mail/feed/atom&response_type=code
    
    1. 获取授权码获取access_token

    获取访问令牌

    curl --request POST --data "code=[authorization_code]&client_id=[client_id]&client_secret=[client_secret]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code
    
    1. 获取“access_token”和“refresh_token”

    使用 access_token 访问邮件原子提要

    curl -H "Authorization: OAuth [access_token]" "https://mail.google.com/mail/feed/atom"
    

    注意

    • 如果access_token过期(1小时),使用refresh_token获取新的access_token
    curl --request POST --data "--data '&client_id=[client_id]&client_secret=[client_secret]&refresh_token=[refresh_token]&grant_type=refresh_token" https://accounts.google.com/o/oauth2/token
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2011-03-06
      • 2018-05-19
      相关资源
      最近更新 更多