谷歌日历和客户端机密与桌面应用程序

时间:2014-09-15 16:21:38

标签: python oauth-2.0 google-calendar-api

我正在试图弄清楚oauth流程如何适用于我的Google日历应用。我有一个桌面应用程序,我将分发,将使用谷歌日历。我知道有一个客户机密,但我想知道是否有办法请求令牌而不是发送客户端机密文件。我担心的是,有人只会垃圾邮件日历,我的应用程序将无法为其他任何人工作。这有可能吗?有哪些解决方案来缓解这种情况?

感谢,

1 个答案:

答案 0 :(得分:0)

使用OAuth2,客户端密钥用于向Google验证您的应用,反之亦然。 OAuth2服务器将仅向提交正确客户端ID和客户端密钥(以及其他内容)的应用程序发出令牌。这种安排(部分)正是为了确保其他人不能(例如)“垃圾邮件你的日历”。否则,Google如何知道请求的应用程序实际上是合法的,而不是垃圾邮件发送者制作的恶意代码看起来像您的应用程序?

在使用OAuth2之前,您的应用程序已在Google注册。作为此过程的一部分,Google会向您发送一个客户端密钥,然后您必须将其构建到应用程序实例中。此应用程序实例还与授权握手完成时的重定向URI相关联。

这样做的结果是,如果每个部署都不必经过注册过程,您就无法真正分发使用OAuth2的应用程序。如果您尝试使用您的应用程序分发秘密,那么它就不再是秘密了,无论如何,您无法知道可以部署它的所有URI。

我正在使用的应用程序的一种方法是让应用程序读取客户机密钥文件,该文件必须由应用程序的安装程序根据自己的注册提供。这种格式基于Google在注册应用程序时提供的JSON下载。这是一种痛苦,需要每个安装人员都要经历这种舞蹈,但是就目前而言,我不相信有一种更安全的方式。

例如,我使用基于oauth2client库构建的Google的OpenID Connect身份验证实现,并使用基于Google客户端机密文件的文件格式。当Google注册某项服务以使用OAuth2时,Google可以提供“客户机密”文件,如下所示:

{
  "web": {
    "client_id": "9876543210.apps.googleusercontent.com",
    "client_secret": "secret-12345678901234567890",
    "client_email": "9876543210@developer.gserviceaccount.com",
    "client_x509_cert_url": 
        "https://www.googleapis.com/robot/v1/metadata/x509/9876543210@developer.gserviceaccount.com",
    "redirect_uris": 
      [ "http://localhost:8000/annalist/login_done/", 
        "http://annalist-demo.example.org:8000/annalist/login_done/"
      ],
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs"
  }
}

在我的代码中,我使用此文件使用oauth2client库启动OAuth2流,代码如下所示:

flow = flow_from_clientsecrets(
    clientsecrets_filename,
    scope=scope,
    redirect_uri=request.build_absolute_uri(login_done)
    )

因此,您可以看到,除了 启动流时使用的客户端ID之外,还有更多信息。我的实现的完整代码位于https://github.com/gklyne/annalist/blob/master/src/annalist_root/oauth2/views.py,从第273行开始,但是该模块中有更多的逻辑与将细节传递回运行在Django框架中的应用程序有关。

我还创建了documentation我用来向Google注册应用程序并部署客户端凭据的程序。请注意,这些说明适用于身份服务而不是日历API,并且详细信息特定于我的应用程序,但我希望有足够的通用性来帮助您。


展望未来,IETF正在制定允许自动注册使用OAuth2的应用程序实例的规范。我认为这是相关规范:https://datatracker.ietf.org/doc/draft-ietf-oauth-dyn-reg/。看来它目前(截至2014年9月)被考虑用于标准轨道发布,但这并没有说明何时可以更广泛地提供。