我想实现一个简单的应用程序,使我可以访问Google云端硬盘。我正在关注python quickstart。我在Docker中运行该应用程序。
但是,当我运行脚本时,它会显示Please visit this URL to authorize this application:
。如果我通过URL询问我选择帐户,则显示有关它不是经过验证的应用程序的警告(我将其忽略并转到我的应用程序页面),请求访问Google驱动器和元数据(我允许),然后将我重定向到http://localhost:46159/?state=f..
,并显示unable to connect
页面。端口可能不同。
是什么问题?有没有一种方法可以防止在Docker中运行的应用程序要求验证?
为了避免“寻求验证”过程,您可以改为通过服务帐户使用授权。
为了这样做,首先我们必须创建服务帐户:
Credentials
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来做到这一点。