Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 谷歌日历和客户端机密与桌面应用程序_Python_Oauth 2.0_Google Calendar Api - Fatal编程技术网

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

Python 谷歌日历和客户端机密与桌面应用程序,python,oauth-2.0,google-calendar-api,Python,Oauth 2.0,Google Calendar Api,我正在试图弄清楚oauth流将如何为我的google日历应用程序工作。我有一个桌面应用程序,我将分发,并将使用谷歌日历。我知道有一个客户机密文件,但我想知道是否有办法请求令牌,而不是发送客户机密文件。我担心的是,有人会垃圾邮件日历,我的应用程序将无法为其他人工作。这有可能吗?有哪些解决方案可以缓解这一问题 谢谢,使用OAuth2,客户端密码用于向Google验证您的应用程序,而不是相反。OAuth2服务器将只向提交正确的客户机id和客户机机密等内容的应用程序发出令牌。这一安排的一部分正是为了确保

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


谢谢,

使用OAuth2,客户端密码用于向Google验证您的应用程序,而不是相反。OAuth2服务器将只向提交正确的客户机id和客户机机密等内容的应用程序发出令牌。这一安排的一部分正是为了确保其他人不能(例如)向您的日历发送垃圾邮件。否则,谷歌怎么知道请求的应用程序实际上是合法的,而不是垃圾邮件发送者精心编制的看起来像你的应用程序的恶意代码

在使用OAuth2之前,您的应用程序已经在Google注册。作为这个过程的一部分,Google会向您发布一个客户端密码,然后您必须将其内置到您的应用程序实例中。当授权握手完成时,此应用程序实例还与重定向URI绑定

这样做的结果是,如果每次部署都不经过注册过程,就无法使用应用程序分发OAuth2。如果您尝试在应用程序中分发该机密,那么它就不再是一个机密,而且在任何情况下,您都不可能知道它可能部署到的所有URI

我对正在开发的应用程序采取的一种方法是,让应用程序根据自己的注册,读取应用程序安装程序必须提供的客户机机密文件。这种格式基于注册应用程序时谷歌提供的JSON下载。这是一个痛苦的要求每一个安装通过这个舞蹈,但目前的情况下,我不相信有一个更容易的方式,也安全

例如,我有一个OpenID连接身份验证的实现,它使用基于库的Google实现,并使用基于Google的client secrets文件的文件格式。当服务向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"
  }
}
flow = flow_from_clientsecrets(
    clientsecrets_filename,
    scope=scope,
    redirect_uri=request.build_absolute_uri(login_done)
    )
在我的代码中,我使用此文件使用oauth2client库启动OAuth2流,代码如下所示:

{
  "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"
  }
}
flow = flow_from_clientsecrets(
    clientsecrets_filename,
    scope=scope,
    redirect_uri=request.build_absolute_uri(login_done)
    )
因此,您可以看到,除了启动流时使用的客户端id之外,还有更多的信息。我的实现的完整代码在,大约从第273行开始,但该模块中有更多的逻辑,用于将详细信息传递回在Django框架中运行的应用程序

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


展望未来,IETF正在制定一个规范,允许使用应用程序实例自动注册OAuth2。我认为这是相关规范:。目前看来,截至2014年9月,它正在考虑作为标准曲目发布,但这并不意味着它什么时候可以更广泛地提供。

非常感谢您提供的信息,我非常感谢。然而,我对这是如何工作的有点困惑。到目前为止,我有两个字段:客户机密码和客户机ID。我知道ID是客户机的标识,但我认为这个密码是soarts的密码。基本上,这就是阻止人们冒充我的应用程序并向谷歌发送大量请求的原因。根据您所说的,每个客户机都会生成客户机机密。这是怎么回事?很抱歉给您带来混淆,非常感谢您的帮助。是的,客户ID标识客户,但客户机密验证客户。你一起使用它们。我有一个适用于Django at的OAuth2模块,它构建在@bitworker的oauth2client库上。关键步骤是关于第318行,它接受一个包含客户id、客户机密等的客户机密文件。