本地主机和pythonanywhere上的OAuth

本地主机和pythonanywhere上的OAuth,python,flask,oauth-2.0,pythonanywhere,Python,Flask,Oauth 2.0,Pythonanywhere,我正在制作一个日历应用程序,允许用户授予访问谷歌日历的权限,然后我的应用程序将允许他们查看和编辑以我自己的自定义样式显示的日历 它是基于这个谷歌 目前,它在本地运行良好,但到目前为止,我无法在pythonanywhere.com上运行它(URL将在那里) 在我的工作本地版本中,我使用的credentials.json文件以“installed”:开始,AFAICT对应于一个“桌面应用程序”和“redirect_uris”:包含[“urn:ietf:wg:oauth:2.0:oob”http://

我正在制作一个日历应用程序,允许用户授予访问谷歌日历的权限,然后我的应用程序将允许他们查看和编辑以我自己的自定义样式显示的日历

它是基于这个谷歌

目前,它在本地运行良好,但到目前为止,我无法在pythonanywhere.com上运行它(URL将在那里)

在我的工作本地版本中,我使用的credentials.json文件以
“installed”:
开始,AFAICT对应于一个“桌面应用程序”和
“redirect_uris”:
包含
[“urn:ietf:wg:oauth:2.0:oob”http://localhost“]
”(“”有道理,但我不知道为什么会有第二个uri)urn:ietf:wg:oauth:2.0:oob)

如果我错了,请纠正我,但我假设这个credentials.json文件在myname.pythonanywhere.com上托管时不可能工作,我需要创建一个新的文件(在Google的“API和服务”页面上),将项目声明为“web应用程序”,并告诉Google我的重定向uri为“”

如果有一种方法可以使credentials.json文件在本地和pythonywhere上都能工作


编辑:快速启动示例使用了
InstalledAppFlow.from\u client\u secrets\u file
,我现在认为这是错误的。它可能需要以某种方式使用
google\u auth\u oauthlib.flow.from\u client\u secrets\u file()
相反……如上所述。

您可以拥有一个支持多个重定向URI的客户端ID/客户端机密对:

  • 转到API和服务
  • 转到凭据
  • 查找您的客户ID
  • 单击编辑(铅笔图标)
  • 在“授权重定向URI”下,可以添加更多URI
  • 拯救
JSON将包含两个重定向uri。我不知道他们的库如何选择使用哪一个,因此您可能希望通过传递
redirect\u uri
param来显式指定它:

flow=flow.from_client_secrets_文件('client_secrets.json',redirect_uri='1〕http://blah.pythonanywhere.com/')

要知道要使用哪一个,您可以在启动服务器时传递一些配置(例如环境变量或命令行标志),或者让服务器通过主机头自动检测到它。

要首先获得客户端ID,您必须单击“创建凭据”,然后单击“OAuth客户端ID”然后选择“应用程序类型”-应该选择什么?如果选择“桌面应用”,它是否也可以在服务器上运行?如果您选择“web应用”,它是否也在本地工作?在这两种情况下,您会在python代码中使用“InstalledAppFlow.from client secrets file”吗?如果您想要一个桌面和web应用程序,Google建议您创建两个客户端ID,每种类型都正确。如果在同一个项目中创建它们,一旦用户对其中一个进行了授权,其他人就不会再次请求授权,因此对用户来说是透明的。不幸的是,在这种情况下,您确实需要两个不同的json
{
    "installed": {
        "client_id": "XXXXXXXXXXXXXXXX.apps.googleusercontent.com",
        "project_id": "my_great_calendar",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://oauth2.googleapis.com/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_secret": "XXXXXXXXXXXXX",
        "redirect_uris": [
            "urn:ietf:wg:oauth:2.0:oob",
            "http://localhost"
        ]
    }
}