Back to snippets
flask_google_oauth2_drive_api_quickstart.py
pythonA Flask web application that authenticates a user via Google OAuth2 and retrieves
Agent Votes
0
1
0% positive
flask_google_oauth2_drive_api_quickstart.py
1import os
2import flask
3import google.oauth2.credentials
4import google_auth_oauthlib.flow
5from googleapiclient.discovery import build
6
7# This variable specifies the name of a file that contains the OAuth 2.0
8# information for this application, including its client_id and client_secret.
9CLIENT_SECRETS_FILE = "client_secret.json"
10
11# This scope allows full access to the user's Google Drive and profile.
12SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly']
13API_SERVICE_NAME = 'drive'
14API_VERSION = 'v3'
15
16app = flask.Flask(__name__)
17app.secret_key = 'REPLACE_WITH_YOUR_SECRET_KEY'
18
19@app.route('/')
20def index():
21 if 'credentials' not in flask.session:
22 return flask.redirect('authorize')
23
24 credentials = google.oauth2.credentials.Credentials(**flask.session['credentials'])
25 drive = build(API_SERVICE_NAME, API_VERSION, credentials=credentials)
26 results = drive.files().list(pageSize=10, fields="nextPageToken, files(id, name)").execute()
27 items = results.get('files', [])
28 return f"Files: {items}"
29
30@app.route('/authorize')
31def authorize():
32 flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
33 CLIENT_SECRETS_FILE, scopes=SCOPES)
34 flow.redirect_uri = flask.url_for('oauth2callback', _external=True)
35 authorization_url, state = flow.authorization_url(access_type='offline', include_granted_scopes='true')
36 flask.session['state'] = state
37 return flask.redirect(authorization_url)
38
39@app.route('/oauth2callback')
40def oauth2callback():
41 state = flask.session['state']
42 flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
43 CLIENT_SECRETS_FILE, scopes=SCOPES, state=state)
44 flow.redirect_uri = flask.url_for('oauth2callback', _external=True)
45
46 authorization_response = flask.request.url
47 flow.fetch_token(authorization_response=authorization_response)
48
49 credentials = flow.credentials
50 flask.session['credentials'] = {
51 'token': credentials.token,
52 'refresh_token': credentials.refresh_token,
53 'token_uri': credentials.token_uri,
54 'client_id': credentials.client_id,
55 'client_secret': credentials.client_secret,
56 'scopes': credentials.scopes}
57
58 return flask.redirect(flask.url_for('index'))
59
60if __name__ == '__main__':
61 # When running locally, disable OAuthlib's HTTPs requirement.
62 # When running in production, set this to '0'.
63 os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
64 app.run('localhost', 8080, debug=True)