Gmail python api authentication

I created a project on the google developer dashboard, gave it access to the Gmail API, and loaded my credentials as a JSON file.

Then I changed the JSON credential file path and tried to run the quickstart example, failing:

In [2]: run quickstart.py
---------------------------------------------------------------------------
InvalidClientSecretsError                 Traceback (most recent call last)
/Users/me/Code/gmail/quickstart.py in <module>()
     19 
     20 # Start the OAuth flow to retrieve credentials
---> 21 flow = flow_from_clientsecrets(CLIENT_SECRET_FILE, scope=OAUTH_SCOPE)
     22 http = httplib2.Http()
     23 

/Users/me/.virtualenvs/nlp/lib/python2.7/site-packages/oauth2client/util.pyc in positional_wrapper(*args, **kwargs)
    130         else: # IGNORE
    131           pass
--> 132       return wrapped(*args, **kwargs)
    133     return positional_wrapper
    134 

/Users/me/.virtualenvs/nlp/lib/python2.7/site-packages/oauth2client/client.pyc in flow_from_clientsecrets(filename, scope, redirect_uri, message, cache, login_hint, device_uri)
   1987   """
   1988   try:
-> 1989     client_type, client_info = clientsecrets.loadfile(filename, cache=cache)
   1990     if client_type in (clientsecrets.TYPE_WEB, clientsecrets.TYPE_INSTALLED):
   1991       constructor_kwargs = {

/Users/me/.virtualenvs/nlp/lib/python2.7/site-packages/oauth2client/clientsecrets.pyc in loadfile(filename, cache)
    141 
    142   if not cache:
--> 143     return _loadfile(filename)
    144 
    145   obj = cache.get(filename, namespace=_SECRET_NAMESPACE)

/Users/me/.virtualenvs/nlp/lib/python2.7/site-packages/oauth2client/clientsecrets.pyc in _loadfile(filename)
    104   except IOError:
    105     raise InvalidClientSecretsError('File not found: "%s"' % filename)
--> 106   return _validate_clientsecrets(obj)
    107 
    108 

/Users/me/.virtualenvs/nlp/lib/python2.7/site-packages/oauth2client/clientsecrets.pyc in _validate_clientsecrets(obj)
     71 def _validate_clientsecrets(obj):
     72   if obj is None or len(obj) != 1:
---> 73     raise InvalidClientSecretsError('Invalid file format.')
     74   client_type = tuple(obj)[0]
     75   if client_type not in VALID_CLIENT:

InvalidClientSecretsError: Invalid file format.

      

Here's the code:

#!/usr/bin/python

import httplib2

from apiclient.discovery import build
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import run


# Path to the client_secret.json file downloaded from the Developer Console
CLIENT_SECRET_FILE = 'gmail-api-eeac5a33ec79.json'

# Check https://developers.google.com/gmail/api/auth/scopes for all available scopes
OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.readonly'

# Location of the credentials storage file
STORAGE = Storage('gmail.storage')

# Start the OAuth flow to retrieve credentials
flow = flow_from_clientsecrets(CLIENT_SECRET_FILE, scope=OAUTH_SCOPE)
http = httplib2.Http()

# Try to retrieve credentials from storage or run the flow to generate them
credentials = STORAGE.get()
if credentials is None or credentials.invalid:
  credentials = run(flow, STORAGE, http=http)

# Authorize the httplib2.Http object with our credentials
http = credentials.authorize(http)

# Build the Gmail service from discovery
gmail_service = build('gmail', 'v1', http=http)

# Retrieve a page of threads
threads = gmail_service.users().threads().list(userId='me').execute()

# Print ID for each thread
if threads['threads']:
  for thread in threads['threads']:
    print 'Thread ID: %s' % (thread['id'])

      

I haven't changed the JSON file - just downloaded it from the developer console. I do admit that the Gmail API is so hard to get away with - does anyone know what I'm doing wrong?

+3


source to share


2 answers


When creating a new Client ID, be sure to select either the Web Application or the Installed Application.

If you selected a service account, then the resulting JSON is in a different format and the following process must be followed:



Service accounts

Google APIs such as API Prediction and Google Cloud Storage can act on behalf of your application without accessing user information. In these situations, your application must prove its own identity with the API, but user consent is not required. Likewise, in enterprise scenarios, your application might request delegated access to some resources.

For these types of server-to-server communication, you need a service account, which is an account that belongs to your application, not an individual end user. Your application calls the Google API on behalf of the service account and user consent is not required. (In non-service scenarios, your app calls Google APIs on behalf of end users, and sometimes user consent is required.)

Note. These service-account scripts require applications to generate and cryptographically sign JSON Web Tokens (JWT). We highly recommend using the library to accomplish these tasks. If you write this code without using a library that abstracts the creation and signing of tokens, you can make mistakes that have a serious impact on the security of your application. For a list of libraries that support this scenario, see the service documentation. The service account credentials that you receive from the Google Developers Console include a unique unique email address, customer ID, and at least one public / private key pair.You use a client ID and one private key to create a signed JWT and create a token access request in the appropriate format. Your app then sends a token request to the Google OAuth 2.0 authorization server, which returns an access token. The app uses a token to access the Google API. When the token expires, the application repeats the process.

from google page .

+2


source


I first went to the site and I generated the authentication After I gave the full path to the authentication file



CLIENT_SECRET_FILE = '' 'C: \ python27 \ Lib \ site-packages \ oauth2client \ client_secret_777909171445-9umvr7m509u4aabvujt5dofia5d8jlmb.apps.googleusercontent.com.json' ''

0


source







All Articles