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

问题描述 投票:1回答:1

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

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

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

python docker google-api google-drive-api google-oauth
1个回答
1
投票

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

为了这样做,首先我们必须创建服务帐户:

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

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

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来做到这一点。

参考

  • Using OAuth 2.0 for Server to Server Applications
  • Domain-Wide Delegation of Authority
  • © www.soinside.com 2019 - 2024. All rights reserved.