Python Google Drive API oauth2 - 保存用户

时间:2018-06-14 20:38:35

标签: python oauth-2.0 google-api google-oauth google-drive-team-drive

我正在创建一个MacOS应用,可在给定的Google Team Drive /文件夹中创建自定义文件夹层次结构。每次我运行应用程序时,它都会打开一个浏览器并要求用户登录并允许该应用程序访问。在接受时,应用程序会创建文件夹并按预期工作。但是,它每次都这样做,我很难找到如何保存用户的同意"因此,他们应该只在第一次运行应用程序时允许一次同意。我尝试了很多不同的选择,但我无处可去,所以我非常感谢你的帮助。

from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow

SCOPES = ['https://www.googleapis.com/auth/drive']
API_SERVICE_NAME = 'drive'
API_VERSION = 'v3'

def get_authenticated_service():
    client_secrets = args["secrets"] #client_secrets.json file passed as "secrets" argument

    flow = InstalledAppFlow.from_client_secrets_file(client_secrets, SCOPES)

    credentials = flow.run_local_server(host='localhost',
                                    port=8080,
                                    authorization_prompt_message='Please visit this URL: {url}',
                                    success_message='The auth flow is complete; you may close this window.',
                                    open_browser=True)

    return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)

if __name__ == '__main__':
    service = get_authenticated_service()
    name = format_client_name()
    create_folders(service, name)

我尝试使用此处的Google API客户端库(https://developers.google.com/api-client-library/python/guide/aaa_oauth),其中显示了存储,但是它没有google.oauth的任何说明,因为您无法使用oauth2client用google.oauth存储。我觉得它很简单,但我已经撞墙了。

1 个答案:

答案 0 :(得分:1)

您可以使用oauth2client.file.Storage将凭据存储在credentials.json文件中以供将来检索。该函数在运行身份验证流之前检查本地存储的有效凭据。

我在下面的回购中附上了一个例子:

https://github.com/gsuitedevs/python-samples/blob/master/drive/quickstart/quickstart.py

# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# [START drive_quickstart]
"""
Shows basic usage of the Drive v3 API.
Creates a Drive v3 API service and prints the names and ids of the last 10 files
the user has access to.
"""
from __future__ import print_function
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

# Setup the Drive v3 API
SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'
store = file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
    creds = tools.run_flow(flow, store)
service = build('drive', 'v3', http=creds.authorize(Http()))

# 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('{0} ({1})'.format(item['name'], item['id']))
# [END drive_quickstart]