使用 Oauth 通过 Gmail 进行身份验证后,有没有办法获取您的电子邮件地址?

2023-11-21

在 Python Web 应用程序中,我可以使用 OAuth 和 IMAP 连接到 Gmail。 OAuth 只需使用您当前登录的任何 Google 帐户,并要求您授予对网络应用程序的访问权限。但是,它不提供 API 来实际检索该帐户的电子邮件地址。

问题是,即使用户通过 OAuth 授予访问权限,要与 Gmail 交互,您仍然需要在 IMAP 连接 URL 中显式提供电子邮件地址:

https://mail.google.com/mail/b/[your-email]/imap/

因此,Web 应用程序必须询问用户的电子邮件地址and要求他们通过 OAuth 授予 Gmail 访问权限。更糟糕的是,他们输入的电子邮件地址可能与他们授予访问权限的帐户的电子邮件不匹配,从而导致应用程序失败。

有没有办法使用 OAuth 获取您的电子邮件地址,以便您可以将其放入该 URL 中而无需询问用户?我试着看看这个答案但谷歌返回一个Bad Request每当我同时使用两者时https://mail.google.com/ and https://www.googleapis.com/auth/userinfo#email作为我的范围。


你所追求的是谷歌通讯录 API。如果您通过 OAuth 授权,您当前可能正在请求访问 gmail 范围的权限:

https://mail.google.com/mail/feed/atom

您还需要请求联系人范围的许可:

https://www.google.com/m8/feeds/

完成后,您可以发出类似于以下内容的 GET 请求:

https://www.google.com/m8/feeds/contacts/default/full?max-results=1

这应该返回一堆 xml,以下是一些相关位:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gContact="http://schemas.google.com/contact/2008" xmlns:batch="http://schemas.google.com/gdata/batch" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;CEcMRX0_eCp7ImA9WhdRF00.&quot;">
<id>[email protected]</id>
...
<author>
  <name>Joe Bloggs</name>
  <email>joeb[email protected]</email>
</author>
...
</feed>

如您所见,您可以在几个地方找到授权用户的电子邮件。

如果您正在使用 OAuth,您可能还想看看 Google OAuth Playground,我发现它非常方便:http://googlecodesamples.com/oauth_playground/index.php。如果您决定使用 OAuth2,则可以使用等效工具:https://code.google.com/oauthplayground

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Oauth 通过 Gmail 进行身份验证后,有没有办法获取您的电子邮件地址? 的相关文章

随机推荐

  • 如何使用 Json.NET 将 XML 序列化为 JSON 对象

    我可以将 XML 序列化为 JSON 字符串 如下所示 var xml new XmlDocument xml LoadXml
  • Javascript 在操作 DOM 时是同步的吗?

    我有一个带有类型字段输入的表单 我有几个单选按钮 根据我单击的单选按钮 输入类型字段中的值将会更新 之后 我将调用 Javascript 函数来执行某些操作 该函数将使用输入字段中更新的数量 文本 当然 将该数量传递给函数本身更安全 但是我
  • 如何在悬停时为元素设置动画

    我怎样才能让我的 div 当鼠标悬停在元素上时 元素会增长 并且内容会将文本大小更改为更大的大小 我把它们放在一个类中并尝试 size 150 and height 30px width 30px 第一次尝试根本不起作用 第二次代码只是让
  • 如何在Python抽象类中创建抽象属性?

    在下面的代码中 我创建了一个基本抽象类Base 我想要继承自的所有类Base提供name财产 所以我把这个财产 abstractmethod 然后我创建了一个子类Base 称为Base 1 它旨在提供一些功能 但仍然保持抽象 没有name财
  • 用于取消引用函数结果的 PHP 语法

    背景 在我经常使用的所有其他编程语言中 对函数的返回值进行操作很简单 而无需声明新变量来保存函数结果 然而 在 PHP 中 这似乎并不那么简单 示例1 函数结果是一个数组
  • 从外部解决方案使用 Windows 服务中托管的 WCF 服务

    我使用以下演练设置了一个托管在 Windows 服务中的 WCF 库 http msdn microsoft com en us library ff649818 aspx 消费者 winforms 位于相同的解决方案中 该解决方案位于我的
  • 如何引用不同工作表上同名的图表?

    我有两个包含图表的工作表 并使用宏来运行所有包含图表的工作表并更新绘制的值 但是 当我尝试在第一个图表之后引用工作表中的图表时 我遇到了问题 尽管工作表的引用发生了变化 但对图表的引用却没有变化 循环看起来像这样 For Each ws I
  • Flutter:检测键盘打开和关闭[重复]

    这个问题在这里已经有答案了 我有一个BottomNavigationBar在我的应用程序的最上层 我想检测应用程序 子树中基本上任何位置的键盘打开和关闭 这样我就可以显示和隐藏BottomNavigationBar每当键盘可见时 这是一个普
  • 如何从 Rust 写入特定的原始文件描述符?

    我需要写入文件描述符 3 我一直在寻找它 但文档很差 我唯一发现的是使用libc图书馆和fdopen方法 但我还没有找到任何关于如何使用它或在其上编写的示例 谁能给我提供一个在 Rust 中写入文件描述符的示例 您可以使用FromRawFd
  • 使用 OCaml 解析语法

    我有一个任务是使用 OCaml 为 玩具 语法编写一个 玩具 解析器 但不确定如何开始 并继续 这个问题 下面是一个 Awk 语法示例 type nonterm term symbol N of nonterm T of term type
  • Microsoft Teams 来电事件

    我想创建一个应用程序 当用户在 MS Teams 中接到电话时会收到通知 我的意思是我想在来电事件中订阅一些内容 然后根据来电信息执行某些操作 这可能吗 到目前为止 我在 SDK 中没有看到任何事件 现在似乎有一个功能可能适合这个 通话记录
  • 当输出分配给变量时获取管道的退出代码(命令替换)[重复]

    这个问题在这里已经有答案了 获取管道命令的退出代码工作正常 echo ABC false true echo PIPESTATUS 0 PIPESTATUS 1 PIPESTATUS 2 Output is 0 1 0 但是当我将输出分配给
  • 可以在套接字上使用 SO_LINGER 设置的“逗留时间”究竟是多少?

    手册页对这个选项几乎没有任何解释 虽然网络上和 StackOverflow 上的答案中有大量可用信息 但我发现那里提供的许多信息甚至是自相矛盾的 那么该设置的真正用途是什么 为什么我需要设置或更改它 当 TCP 套接字断开连接时 系统必须考
  • 为什么在 -[_PFManagedObjectReferenceQueue _queueForDealloc:] 中释放托管对象可能会崩溃?

    我偶尔会看到像这样的堆栈跟踪崩溃 0 libobjc A dylib 0x97dc0edb objc msgSend 27 1 com apple CoreData 0x97edcdc2 PFManagedObjectReferenceQu
  • Azure 权限:无权执行此操作

    所以我有一个数据工厂 它调用一个读取 blob 存储的 Azure 函数 我不明白为什么我会收到此错误 此请求无权执行此操作 是数据工厂 azure 存储还是azure 功能的问题吗 我还向 Storage Blob Data Contri
  • iPhone SDK NSString 转 NSDate

    我通过解析 XML 文件得到了一个字符串 如下所示 Fri 09 Apr 2010 00 00 45 0200 相应的模式应该是 EEE dd MMM yyyy HH mm ss ZZ 但我得到 空 这是我的代码 NSString date
  • 为什么可以将 nullptr 分配给 std::string?

    所以今天我写了一个相当难发现的错误 我将 std string 初始化为 nullptr 不是指向 std string 的指针 而是值本身 我发现显然只能在 C 11 或更高版本中使用 clang 来完成 include
  • 将 ID 添加到 GridView 行

    如何向 GridView 行添加 ID 应该呈现 ID 我正在使用 NET C 我有 GridView 控件 我有一些操作表行的 javascript 函数 但必须有这些行的 ID table tr tr id should come fr
  • 如何在 Android 中对图像应用缩放、拖动和旋转 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人可以告诉我在 Android 应用程序中对图像应用缩放 拖动和旋转的教程吗 尝试使用下面的代码它对我有用 float lastEvent nul
  • 使用 Oauth 通过 Gmail 进行身份验证后,有没有办法获取您的电子邮件地址?

    在 Python Web 应用程序中 我可以使用 OAuth 和 IMAP 连接到 Gmail OAuth 只需使用您当前登录的任何 Google 帐户 并要求您授予对网络应用程序的访问权限 但是 它不提供 API 来实际检索该帐户的电子邮