Hi,
I'm trying to build a software program in Python running on Google App Engine
which accesses the Google Analytics API. However, I'm receiving an
authentication error. I've found a Google Analytics Python command line example
(which I got to work) and a Google Calendar Google App Engine example (which I
got to work), but when I try and combine the two I can't get it to work.
I've used the Google Calendar appengine example provided here:
1.
https://code.google.com/p/google-api-python-client/source/browse/samples/appengi
ne/
That works successfully. However, when I modify the code to access the Google
Analytics API, it allows me to login, but when I reach the '/about' page I
receive this error message:
HttpError: <HttpError 401 when requesting
https://www.googleapis.com/analytics/v3/management/accounts?alt=json returned
"Login Required">
when it executes the line:
accounts = service.management().accounts().list().execute()
I've turned the Google Analytics API on in the API console, and I've downloaded
the client secret. What is odd is that I've already authenticated, and I
believe I have done so for the correct scope. I've tried clearing the
datastore/memecache, to force it refresh the token.
Any pointers would be much appreciated!
Here is my code:
"""Starting template for Google App Engine applications.
Use this project as a starting point if you are just beginning to build a Google
App Engine project. Remember to download the OAuth 2.0 client secrets which can
be obtained from the Developer Console <https://code.google.com/apis/console/>
and save them as 'client_secrets.json' in the project directory.
"""
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
import httplib2
import logging
import os
import pickle
from apiclient import discovery
from oauth2client import appengine
from oauth2client import client
from google.appengine.api import memcache
import webapp2
import jinja2
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
autoescape=True,
extensions=['jinja2.ext.autoescape'])
# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
# application, including client_id and client_secret, which are found
# on the API Access tab on the Google APIs
# Console <http://code.google.com/apis/console>
CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')
# Helpful message to display in the browser if the CLIENT_SECRETS file
# is missing.
MISSING_CLIENT_SECRETS_MESSAGE = """
<h1>Warning: Please configure OAuth 2.0</h1>
<p>
To make this sample run you will need to populate the client_secrets.json file
found at:
</p>
<p>
<code>%s</code>.
</p>
<p>with information found on the <a
href="https://code.google.com/apis/console">APIs Console</a>.
</p>
""" % CLIENT_SECRETS
http = httplib2.Http(memcache)
service = discovery.build('analytics', 'v3', http=http)
decorator = appengine.oauth2decorator_from_clientsecrets(
CLIENT_SECRETS,
scope=[
'https://www.googleapis.com/auth/analytics',
'https://www.googleapis.com/auth/analytics.edit',
'https://www.googleapis.com/auth/analytics.manage.users',
'https://www.googleapis.com/auth/analytics.readonly',
],
message=MISSING_CLIENT_SECRETS_MESSAGE)
class MainHandler(webapp2.RequestHandler):
@decorator.oauth_aware
def get(self):
variables = {
'url': decorator.authorize_url(),
'has_credentials': decorator.has_credentials()
}
template = JINJA_ENVIRONMENT.get_template('grant.html')
self.response.write(template.render(variables))
class AboutHandler(webapp2.RequestHandler):
@decorator.oauth_required
def get(self):
try:
http = decorator.http()
accounts = service.management().accounts().list().execute()
self.response.write(decorator.has_credentials())
for a in accounts.get('items'):
self.response.write("<a href='/account/" + a.get('id') + "'>Account Name: " + a.get('name') + "</a></br>")
except client.AccessTokenRefreshError:
self.redirect('/')
app = webapp2.WSGIApplication(
[
('/', MainHandler),
('/about', AboutHandler),
(decorator.callback_path, decorator.callback_handler()),
],
debug=True)
Kind Regards,
Milo
Original issue reported on code.google.com by milohar...@gmail.com on 20 Feb 2014 at 5:46
Original issue reported on code.google.com by
milohar...@gmail.com
on 20 Feb 2014 at 5:46