通过Oauth验证Gmail后如何获取邮箱地址?
在一个Python的网页应用中,我可以通过OAuth和IMAP连接到Gmail。OAuth会使用你当前登录的Google账号,简单地请求你授权这个网页应用访问你的信息。不过,它并没有提供一个接口来直接获取这个账号的邮箱地址。
问题是,尽管用户通过OAuth授权了访问,但在连接Gmail的时候,你还是需要在IMAP连接的地址里明确提供邮箱地址:
https://mail.google.com/mail/b/[your-email]/imap/
因此,这个网页应用必须要求用户提供他们的邮箱地址,并且还要让他们通过OAuth授权访问Gmail。更糟糕的是,用户输入的邮箱地址可能和他们授权的账号不匹配,这样就会导致应用无法正常工作。
有没有办法通过OAuth获取用户的邮箱地址,这样就可以直接放到那个连接地址里,而不需要用户手动输入呢?我试着查看了这个答案,但是每当我把https://mail.google.com/
和https://www.googleapis.com/auth/userinfo#email
作为我的权限范围时,Google总是返回一个Bad Request
的错误。
2 个回答
skorks的回答很好,但你应该使用正确的API。通过添加额外的范围来实现
https://www.googleapis.com/auth/userinfo.email
这样做就是“正确的方式”!
我写了一篇完整的文章,里面有示例代码:http://www.hackviking.com/2013/10/python-get-user-info-after-oauth/。代码可以在这里找到:https://code.google.com/p/google-api-oauth-demo/
你想要的就是Google 联系人 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/"CEcMRX0_eCp7ImA9WhdRF00."">
<id>joebloggs@gmail.com</id>
...
<author>
<name>Joe Bloggs</name>
<email>joebloggs@gmail.com</email>
</author>
...
</feed>
你可以看到,授权用户的邮箱地址可以在几个地方找到。
如果你在使用 OAuth,可能还想看看 Google 的 OAuth 游乐场,我觉得这个工具非常方便:http://googlecodesamples.com/oauth_playground/index.php。如果你决定使用 OAuth2,那里也有一个类似的工具,地址是https://code.google.com/oauthplayground