本地主机和 pythonanywhere 上的 OAuth

Mic*_*ick 5 python flask oauth-2.0 pythonanywhere

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

它基于此 Google “快速入门”示例

它目前在本地运行良好,但到目前为止,我无法在 pythonanywhere.com 上运行它(URL 将是http://myname.pythonanywhere.com)。

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

{
    "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"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我,但我认为这个凭据.json 文件在 myname.pythonanywhere.com 上托管时不可能工作,我需要创建一个新文件(在 Google 的“API 和服务”页面上)通过将项目声明为“Web 应用程序”?并告诉谷歌我的重定向 uri 是“ http://myname.pythonanywhere.com ”?

如果有一种方法可以在本地和 pythonanywhere 上使用单个凭据.json 文件?

编辑:快速入门示例采用InstalledAppFlow.from_client_secrets_file我现在认为是错误的。它可能需要以某种方式使用google_auth_oauthlib.flow.Flow.from_client_secrets_file(),而不是作为....描述这里

Dir*_*aio 1

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

  • 转到 API 和服务
  • 前往凭证
  • 查找您的客户 ID
  • 单击编辑(铅笔图标)
  • 在“授权重定向 URI”下,您可以添加更多。
  • 节省

然后 JSON 将包含两个重定向 URI。我不知道他们的库如何选择使用哪个,所以您可能想通过传递参数来显式指定它redirect_uri

flow = Flow.from_client_secrets_file('client_secrets.json', redirect_uri='http://blah.pythonanywhere.com/')
Run Code Online (Sandbox Code Playgroud)

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