#!/usr/bin/env python3
import pickle
+import base64
import os.path
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
-# If modifying these scopes, delete the file token.pickle.
-SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
+TOKEN_FILE = ".gsheets-pickle.base64"
-TOKEN_FILE = ".gsheets-token.pickle"
+# If modifying these scopes, delete the token file
+SCOPES = [
+ 'https://www.googleapis.com/auth/spreadsheets',
+ 'https://www.googleapis.com/auth/drive'
+]
def main():
"""Allows user to authenticate for the Sheets API.
Resulting authorization token is stored in token.pickle.
"""
creds = None
- # The file token.pickle stores the user's access and refresh tokens, and is
+ # The token file stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists(TOKEN_FILE):
- with open(TOKEN_FILE, 'rb') as token:
- creds = pickle.load(token)
+ with open(TOKEN_FILE, 'rb') as token_file:
+ creds_base64 = token_file.read()
+ creds_pickle = base64.b64decode(creds_base64)
+ creds = pickle.loads(creds_pickle)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
+ print("Token seems to have expired. Refreshing.")
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
- 'credentials.json', SCOPES)
+ '.gsheets-creds.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
- with open(TOKEN_FILE, 'wb') as token:
- pickle.dump(creds, token)
-
- print("Token now saved in {}".format(TOKEN_FILE))
+ with open(TOKEN_FILE, 'wb') as token_file:
+ creds_pickle = pickle.dumps(creds)
+ creds_base64 = base64.b64encode(creds_pickle)
+ token_file.write(creds_base64)
+ print("Token now saved in {}".format(TOKEN_FILE))
+ else:
+ print("Valid token in {} left unchanged.".format(TOKEN_FILE))
if __name__ == '__main__':
main()