0

使用oauth2client.py 中提供的 google 文档和 python 库以及oauth2.py 库和文档,我通过 OAuth2.0 对其进行身份验证,成功地通过用户的 gmail 帐户发送邮件。我在 google apis 中创建了一个项目,并且能够获取正确验证和发送邮件所需的密钥和其他参数。

现在我正在尝试使用 Google Marketplace 应用程序来实现相同的目标。最终目标是域管理员可以将我们的应用程序添加到他们的 Google Apps 域中,这样每个用户都不需要经过身份验证过程,并且我们的应用程序将“自动”被授权代表他们发送邮件。

第一个问题是在市场上注册应用程序时,我得到了客户端密钥和秘密,但是没有redirect_uri,就像我在另一个项目中得到的那样。这意味着我无法使用他们的OAuth2WebServerFlow课程进行身份验证。这导致了数小时的搜索和冲突的答案以及 Google 文档中的断开链接。该文档让我相信 Marketplace 应用程序不支持 OAuth 2.0,我需要重新使用 2 腿 OAuth 1.0 身份验证。但它是在一年前更新的,所有其他 Google 文档都强烈告诉我不要使用 OAuth 1.0,因为它已被弃用。

重写所有新代码(不能使用相同的库或任何东西)以使用 OAuth 1.0 是能够使用 Marketplace 应用程序执行此操作的唯一方法吗?是否有另一种方法,如果没有,关于利用现有代码或如何在当前系统中最好地做的任何建议?

我目前使用 OAuth 2.0 的工作方式的简短片段:

flow = OAuth2WebServerFlow(
    client_id="xxx",
    client_secret="xxx",
    scope="https://mail.google.com/",
    user_agent="mytest/0.1",
    redirect_uri="http://127.0.0.1:5000/oauth2callback"
)

authorize_url = flow.step1_get_authorize_url()

并在返回

credentials = flow.step2_exchange(request.args['code'])
storage = Storage(request.user.email)
storage.put(credentials)

并发送邮件

conn = smtplib.SMTP('smtp.googlemail.com', 587)
conn.set_debuglevel(True)
conn.ehlo('test')
conn.starttls()
auth_string = 'user=%s\1auth=Bearer %s\1\1' % (user_address, credentials.access_token)
conn.docmd('AUTH', 'XOAUTH2 ' + base64.b64encode(auth_string))

header = 'To:' + recipient_address + '\n'
header += 'From:' + user_address + '\n'
header += 'Subject: Oauth test Email \n'
header += 'Content-Type: text/html; charset=UTF-8\n'
msg = header + '\n ' + "Waka waka" + ' \n\n'

conn.sendmail(user_address, recipient_address, msg)
4

2 回答 2

0

如果我有 50 分,我会用评论来回答,因为这不是一个完整的答案。

我一直在努力解决类似的问题。我意识到如果我直接使用 'urllib2' 和 'shelve' 与 API 交互,而不是弄乱 OAuth2WebServerFlow 和 Storage 之类的伪辅助程序,我会更好(更好地控制)。

这样做可以让我从命令行使用“curl”检查假设,然后在 Python 中对结果进行编码。我可以利用关于 Google 的 OAuth 的大量博客和问答,而无需分散到他们所有不同的、受支持的库(Jave、C#、PHP 等)中

我已经为Anton Burnashev 的“gspread”写了一个分叉。

这是我的“拉取请求”

你应该看到我几乎没有改变 Burnashev 的代码。我只提供 OAuth 的东西,并且只提供“已安装的应用程序”

有6种不同的方式:

  1. 登录
  2. Web 服务器应用程序
  3. 客户端应用程序
  4. 已安装的应用程序
  5. 设备
  6. 服务帐号

你有多确定你使用的是正确的?我花了很多时间才意识到我需要成为“已安装的应用程序”,但我现在意识到我也应该支持“设备”

于 2013-09-07T10:48:55.817 回答
0

OAuth2 流程现在与新的 Google Apps Marketplace 体验略有不同。由于管理员安装应用程序,令牌是预先批准的,因此您应该提示最终用户。https://developers.google.com/apps-marketplace/building#use_google_services_from_a_simple_web_server_app上的更多详细信息

于 2013-11-26T01:07:32.970 回答