| #!/usr/bin/env python | |
| # | |
| # Copyright 2014 Google Inc. All Rights Reserved. | |
| # | |
| # 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. | |
| # | |
| """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 os | |
| from googleapiclient import discovery | |
| from oauth2client import client | |
| from oauth2client.contrib import appengine | |
| 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("plus", "v1", http=http) | |
| decorator = appengine.oauth2decorator_from_clientsecrets( | |
| CLIENT_SECRETS, | |
| scope="https://www.googleapis.com/auth/plus.me", | |
| 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() | |
| user = service.people().get(userId="me").execute(http=http) | |
| text = "Hello, %s!" % user["displayName"] | |
| template = JINJA_ENVIRONMENT.get_template("welcome.html") | |
| self.response.write(template.render({"text": text})) | |
| except client.AccessTokenRefreshError: | |
| self.redirect("/") | |
| app = webapp2.WSGIApplication( | |
| [ | |
| ("/", MainHandler), | |
| ("/about", AboutHandler), | |
| (decorator.callback_path, decorator.callback_handler()), | |
| ], | |
| debug=True, | |
| ) |