cfrank12
cfrank12

Reputation: 39

Python Google Drive API oauth2 - Save authorization consent for user

I am creating a MacOS app that creates a custom folder hierarchy in a given Google Team Drive/folder. Each time I run the app, it opens a browser and asks for the user to sign in and allow the app to access. On accept, the app creates the folders and works as intended. However, it does this each time and I am having a difficult time trying to find out how to save the "user's consent" so that they should only have to allow consent once, the first time they run the app. I've tried a number of different options and I am getting nowhere, so I really appreciate any help.

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)

I tried working with the Google API Client Libraries here (https://developers.google.com/api-client-library/python/guide/aaa_oauth), where it shows Storage, however it doesn't have any instruction with google.oauth, since you can't use oauth2client storage with google.oauth. I feel like it's something simple, but I've hit a wall.

Upvotes: 2

Views: 3421

Answers (1)

ScottMcC
ScottMcC

Reputation: 4460

You can use oauth2client.file.Storage to store the credentials in a credentials.json file for future retrieval. The function checks for valid credentials stored locally before running an authentication flow.

I've attached an example below from the following repo:

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]

Upvotes: 2

Related Questions