允许使用Google应用程序权限后无法连接到本地主机

时间:2019-12-18 10:29:13

标签: python docker google-api google-drive-api google-oauth

我想实现一个简单的应用程序,使我可以访问Google云端硬盘。我正在关注python quickstart。我在Docker中运行该应用程序。

但是,当我运行脚本时,它会向我显示$event_notification->setUrl("https://mywebhooks.com/docusign/index.php?api_key=docusign_webhook_key");。如果我通过URL询问我选择帐户,则显示有关它不是经过验证的应用程序的警告(我将其忽略并转到我的应用程序页面),请求访问Google驱动器和元数据(我允许),然后将我重定向到Please visit this URL to authorize this application:,并显示http://localhost:46159/?state=f..页面。端口可能不同。

出什么问题了?有没有一种方法可以防止在Docker中运行的应用程序要求进行验证?

1 个答案:

答案 0 :(得分:1)

为了避免“请求验证”过程,您可以改为通过服务帐户使用授权。

为此,首先我们必须创建服务帐户:

  1. 导航到您的GCP项目。
  2. 转到Credentials
  3. 单击“创建凭据”>“服务帐户密钥”
  4. 设置服务帐户名称,ID和角色(如果适用)。将“密钥”类型保留为JSON。
  5. 单击Create。将下载一个JSON文件,其中包含新创建的服务帐户的凭据。

现在,将文件复制到保存您的项目的文件夹,并使用以下修改的代码(基于您使用的Quickstart示例):

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from google.oauth2 import service_account

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'

def main():
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
   creds = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    service = build('drive', 'v3', credentials=creds)

    # Call the Drive v3 API
    results = service.files().list(
        pageSize=10, fields="nextPageToken, files(id, name)").execute()
    items = results.get('files', [])

    if not items:
        print('No files found.')
    else:
        print('Files:')
        for item in items:
            print(u'{0} ({1})'.format(item['name'], item['id']))

if __name__ == '__main__':
    main()

请注意,服务帐户的行为类似于普通帐户(它们具有自己的文件,权限等)。如果您希望服务帐户像您域中的现有用户一样操作,则可以使用Domain-wide delegation来做到这一点。

参考