首页 > 解决方案 > google-api-python-client : 生成 oauth URL

问题描述

第一次使用google-api-python-client,我试图在我的授权流程中生成一个“链接”,我可以将它传递给用户让他们允许应用程序访问他们的日历,然后我需要谷歌将令牌传回我的应用程序。

目前我有这样的东西(基本上是快速入门演示中的 getcredentials() 函数,带有用户特定的令牌和 WebApplication credentials.json):

def find_creds(user_id):
    creds = None
    token_pickle = f'./credentials/{user_id}.token.pickle'

    if os.path.exists(token_pickle):
        with open(token_pickle, 'rb') as token:
            creds = pickle.load(token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'OAUTH.json', SCOPES)  # Google WebApplication.json for OAUTH
            creds = flow.run_local_server(port=0)
        with open(token_pickle, 'wb') as token:
            pickle.dump(creds, token)
    return creds

如果用户在本地运行我的应用程序,这将非常有用,但问题是它在服务器 (vm) 上提示登录,而不是将请求传递给我的用户。没有布埃诺。

用户正在通过另一个应用程序(我无法控制)访问我的应用程序,因此我无法真正为他们提供一个页面来授权该应用程序 - 尽管我可以向他们传递一个 URL/链接以进行点击。

这引入了一些新的障碍,因为用户没有在本地登录,所以我不能只是“保存”他们的授权令牌。

我试图实现的授权“流程”应该(我认为)是这样的:

  1. 向用户传递一个谷歌授权 URL(我不知道如何生成这个 url/链接,虽然我认为它可以通过google_auth_oauthlib.flow.InstalledAppFlow类来完成。也许使用 authentication.url?)
  2. 用户授权应用访问有限范围(日历)
  3. 谷歌将用户令牌返回给我的应用程序(我想这需要通过返回 URi 来完成?所以我认为我的服务器需要运行 apache 并运行一个监听器来相应地收集/存储凭据)

在迈出第一步时,我已经陷入困境。我怀疑我的flow对象需要更改,但我很难找到有关以下内容的文档InstalledAppFlow

听起来我在正确的轨道上吗?InstalledAppFlow任何有关或课程的帮助/提示(或文档)google.oauth2.credentials也会有所帮助。到目前为止,我已经阅读了google-auth-library-python并没有弄清楚。

标签: python-3.xgoogle-apiurigoogle-oauthgoogle-api-python-client

解决方案


推荐阅读