Add oauth2client as a completely separate library.
Reviewed in http://codereview.appspot.com/4630079/
This commit is contained in:
7
MANIFEST_oauth2client.in
Normal file
7
MANIFEST_oauth2client.in
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
recursive-include httplib2 *.py
|
||||||
|
recursive-include simplejson *.py *.c
|
||||||
|
recursive-include samples *.py *.png *.html *.yaml *.json
|
||||||
|
include setup_utils.py
|
||||||
|
include gflags.py
|
||||||
|
include gflags_validators.py
|
||||||
|
include README
|
||||||
29
Makefile
29
Makefile
@@ -30,3 +30,32 @@ release: prerelease
|
|||||||
wget "http://support.googlecode.com/svn/trunk/scripts/googlecode_upload.py" -O googlecode_upload.py
|
wget "http://support.googlecode.com/svn/trunk/scripts/googlecode_upload.py" -O googlecode_upload.py
|
||||||
python googlecode_upload.py --summary="Version $(shell python setup.py --version)" --project=google-api-python-client snapshot/dist/*.tar.gz
|
python googlecode_upload.py --summary="Version $(shell python setup.py --version)" --project=google-api-python-client snapshot/dist/*.tar.gz
|
||||||
python googlecode_upload.py --summary="Version $(shell python setup.py --version)" --project=google-api-python-client snapshot/dist/*.zip
|
python googlecode_upload.py --summary="Version $(shell python setup.py --version)" --project=google-api-python-client snapshot/dist/*.zip
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: oauth2_prerelease
|
||||||
|
oauth2_prerelease:
|
||||||
|
-sudo rm -rf dist/
|
||||||
|
-sudo rm -rf snapshot/
|
||||||
|
mkdir snapshot
|
||||||
|
python expand-symlinks.py --source=oauth2client --dest=snapshot/oauth2client
|
||||||
|
python expand-symlinks.py --source=samples/oauth2/dailymotion --dest=snapshot/samples/dailymotion
|
||||||
|
python expand-symlinks.py --source=samples/appengine_with_decorator --dest=snapshot/samples/appengine_with_decorator
|
||||||
|
python expand-symlinks.py --source=samples/appengine_with_decorator2 --dest=snapshot/samples/appengine_with_decorator2
|
||||||
|
python expand-symlinks.py --source=samples/appengine --dest=snapshot/samples/appengine
|
||||||
|
cp setup_oauth2client.py snapshot/setup.py
|
||||||
|
cp setup_utils.py snapshot/setup_utils.py
|
||||||
|
cp MANIFEST_oauth2client.in snapshot/MANIFEST.in
|
||||||
|
cp README_oauth2client snapshot/README
|
||||||
|
cd snapshot; python setup.py clean
|
||||||
|
cd snapshot; python setup.py sdist --formats=gztar,zip
|
||||||
|
|
||||||
|
.PHONY: oauth2_release
|
||||||
|
oauth2_release: oauth2_prerelease
|
||||||
|
@echo "This target will upload a new release to PyPi and code.google.com hosting."
|
||||||
|
@echo "Are you sure you want to proceed? (yes/no)"
|
||||||
|
@read yn; [ "yes" == $$yn ]
|
||||||
|
@echo "Here we go..."
|
||||||
|
cd snapshot; python setup.py sdist --formats=gztar,zip register upload
|
||||||
|
wget "http://support.googlecode.com/svn/trunk/scripts/googlecode_upload.py" -O googlecode_upload.py
|
||||||
|
python googlecode_upload.py --summary="Version $(shell python setup.py --version)" --project=google-api-python-client snapshot/dist/*.tar.gz
|
||||||
|
python googlecode_upload.py --summary="Version $(shell python setup.py --version)" --project=google-api-python-client snapshot/dist/*.zip
|
||||||
|
|||||||
31
README_oauth2client
Normal file
31
README_oauth2client
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
This is a client library for accessing resources protected by OAuth 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
To install, simply say
|
||||||
|
|
||||||
|
$ python setup.py install
|
||||||
|
|
||||||
|
If you want to do a "mock install" and simply extend your PYTHONPATH
|
||||||
|
for the current shell to include this folder and the packages in it, do
|
||||||
|
|
||||||
|
$ source setpath.sh
|
||||||
|
|
||||||
|
from the root of the project directory.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Third Party Libraries
|
||||||
|
=====================
|
||||||
|
|
||||||
|
These libraries will be installed when you install the client library:
|
||||||
|
|
||||||
|
http://code.google.com/p/httplib2
|
||||||
|
http://code.google.com/p/python-gflags
|
||||||
|
|
||||||
|
Depending on your version of Python, these libraries may also be installed:
|
||||||
|
|
||||||
|
http://pypi.python.org/pypi/simplejson/
|
||||||
|
|
||||||
@@ -1,3 +1,45 @@
|
|||||||
|
#!/usr/bin/python2.4
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2010 Google Inc.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
"""Copy files from source to dest expanding symlinks along the way.
|
||||||
|
"""
|
||||||
|
|
||||||
from distutils.dir_util import copy_tree
|
from distutils.dir_util import copy_tree
|
||||||
|
|
||||||
copy_tree('.', 'snapshot', verbose=True)
|
import gflags
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
FLAGS = gflags.FLAGS
|
||||||
|
|
||||||
|
gflags.DEFINE_string('source', '.', 'Directory name to copy from.')
|
||||||
|
gflags.DEFINE_string('dest', 'snapshot', 'Directory name to copy to.')
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
# Let the gflags module process the command-line arguments
|
||||||
|
try:
|
||||||
|
argv = FLAGS(argv)
|
||||||
|
except gflags.FlagsError, e:
|
||||||
|
print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
copy_tree(FLAGS.source, FLAGS.dest, verbose=True)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main(sys.argv)
|
||||||
|
|||||||
@@ -36,6 +36,16 @@ from google.appengine.ext.webapp import util
|
|||||||
from google.appengine.ext.webapp.util import login_required
|
from google.appengine.ext.webapp.util import login_required
|
||||||
|
|
||||||
|
|
||||||
|
FLOW = OAuth2WebServerFlow(
|
||||||
|
# Visit https://code.google.com/apis/console to
|
||||||
|
# generate your client_id, client_secret and to
|
||||||
|
# register your redirect_uri.
|
||||||
|
client_id='<YOUR CLIENT ID HERE>',
|
||||||
|
client_secret='<YOUR CLIENT SECRET HERE>',
|
||||||
|
scope='https://www.googleapis.com/auth/buzz',
|
||||||
|
user_agent='buzz-cmdline-sample/1.0')
|
||||||
|
|
||||||
|
|
||||||
class Credentials(db.Model):
|
class Credentials(db.Model):
|
||||||
credentials = CredentialsProperty()
|
credentials = CredentialsProperty()
|
||||||
|
|
||||||
@@ -49,20 +59,9 @@ class MainHandler(webapp.RequestHandler):
|
|||||||
Credentials, user.user_id(), 'credentials').get()
|
Credentials, user.user_id(), 'credentials').get()
|
||||||
|
|
||||||
if credentials is None or credentials.invalid == True:
|
if credentials is None or credentials.invalid == True:
|
||||||
flow = OAuth2WebServerFlow(
|
callback = self.request.relative_url('/oauth2callback')
|
||||||
# Visit https://code.google.com/apis/console to
|
authorize_url = FLOW.step1_get_authorize_url(callback)
|
||||||
# generate your client_id, client_secret and to
|
memcache.set(user.user_id(), pickle.dumps(FLOW))
|
||||||
# register your redirect_uri.
|
|
||||||
client_id='<YOUR CLIENT ID HERE>',
|
|
||||||
client_secret='<YOUR CLIENT SECRET HERE>',
|
|
||||||
scope='https://www.googleapis.com/auth/buzz',
|
|
||||||
user_agent='buzz-cmdline-sample/1.0',
|
|
||||||
domain='anonymous',
|
|
||||||
xoauth_displayname='Google App Engine Example App')
|
|
||||||
|
|
||||||
callback = self.request.relative_url('/auth_return')
|
|
||||||
authorize_url = flow.step1_get_authorize_url(callback)
|
|
||||||
memcache.set(user.user_id(), pickle.dumps(flow))
|
|
||||||
self.redirect(authorize_url)
|
self.redirect(authorize_url)
|
||||||
else:
|
else:
|
||||||
http = httplib2.Http()
|
http = httplib2.Http()
|
||||||
@@ -99,7 +98,7 @@ def main():
|
|||||||
application = webapp.WSGIApplication(
|
application = webapp.WSGIApplication(
|
||||||
[
|
[
|
||||||
('/', MainHandler),
|
('/', MainHandler),
|
||||||
('/auth_return', OAuthHandler)
|
('/oauth2callback', OAuthHandler)
|
||||||
],
|
],
|
||||||
debug=True)
|
debug=True)
|
||||||
util.run_wsgi_app(application)
|
util.run_wsgi_app(application)
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../../../apiclient/
|
|
||||||
@@ -23,7 +23,6 @@ import logging
|
|||||||
import os
|
import os
|
||||||
import pickle
|
import pickle
|
||||||
|
|
||||||
from apiclient.discovery import build
|
|
||||||
from oauth2client.appengine import CredentialsProperty
|
from oauth2client.appengine import CredentialsProperty
|
||||||
from oauth2client.appengine import StorageByKeyName
|
from oauth2client.appengine import StorageByKeyName
|
||||||
from oauth2client.client import OAuth2WebServerFlow
|
from oauth2client.client import OAuth2WebServerFlow
|
||||||
@@ -36,6 +35,16 @@ from google.appengine.ext.webapp import util
|
|||||||
from google.appengine.ext.webapp.util import login_required
|
from google.appengine.ext.webapp.util import login_required
|
||||||
|
|
||||||
|
|
||||||
|
FLOW = OAuth2WebServerFlow(
|
||||||
|
client_id='2ad565600216d25d9cde',
|
||||||
|
client_secret='03b56df2949a520be6049ff98b89813f17b467dc',
|
||||||
|
scope='read',
|
||||||
|
user_agent='oauth2client-sample/1.0',
|
||||||
|
auth_uri='https://api.dailymotion.com/oauth/authorize',
|
||||||
|
token_uri='https://api.dailymotion.com/oauth/token'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Credentials(db.Model):
|
class Credentials(db.Model):
|
||||||
credentials = CredentialsProperty()
|
credentials = CredentialsProperty()
|
||||||
|
|
||||||
@@ -49,37 +58,23 @@ class MainHandler(webapp.RequestHandler):
|
|||||||
Credentials, user.user_id(), 'credentials').get()
|
Credentials, user.user_id(), 'credentials').get()
|
||||||
|
|
||||||
if credentials is None or credentials.invalid == True:
|
if credentials is None or credentials.invalid == True:
|
||||||
flow = OAuth2WebServerFlow(
|
|
||||||
client_id='2ad565600216d25d9cde',
|
|
||||||
client_secret='03b56df2949a520be6049ff98b89813f17b467dc',
|
|
||||||
scope='read',
|
|
||||||
user_agent='oauth2client-sample/1.0',
|
|
||||||
auth_uri='https://api.dailymotion.com/oauth/authorize',
|
|
||||||
token_uri='https://api.dailymotion.com/oauth/token'
|
|
||||||
)
|
|
||||||
|
|
||||||
callback = self.request.relative_url('/auth_return')
|
callback = self.request.relative_url('/auth_return')
|
||||||
authorize_url = flow.step1_get_authorize_url(callback)
|
authorize_url = FLOW.step1_get_authorize_url(callback)
|
||||||
memcache.set(user.user_id(), pickle.dumps(flow))
|
memcache.set(user.user_id(), pickle.dumps(FLOW))
|
||||||
self.redirect(authorize_url)
|
self.redirect(authorize_url)
|
||||||
else:
|
else:
|
||||||
http = httplib2.Http()
|
http = httplib2.Http()
|
||||||
|
|
||||||
resp, content1 = http.request('https://api.dailymotion.com/me?access_token=%s' %
|
|
||||||
credentials.access_token)
|
|
||||||
|
|
||||||
http = credentials.authorize(http)
|
http = credentials.authorize(http)
|
||||||
resp, content2 = http.request('https://api.dailymotion.com/me')
|
|
||||||
|
resp, content = http.request('https://api.dailymotion.com/me')
|
||||||
|
|
||||||
path = os.path.join(os.path.dirname(__file__), 'welcome.html')
|
path = os.path.join(os.path.dirname(__file__), 'welcome.html')
|
||||||
logout = users.create_logout_url('/')
|
logout = users.create_logout_url('/')
|
||||||
self.response.out.write(
|
variables = {
|
||||||
template.render(
|
'content': content,
|
||||||
path, {
|
'logout': logout
|
||||||
'content1': content1,
|
}
|
||||||
'content2': content2,
|
self.response.out.write(template.render(path, variables))
|
||||||
'logout': logout
|
|
||||||
}))
|
|
||||||
|
|
||||||
|
|
||||||
class OAuthHandler(webapp.RequestHandler):
|
class OAuthHandler(webapp.RequestHandler):
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<p><a href="{{ logout }}">Logout</a></p>
|
<p><a href="{{ logout }}">Logout</a></p>
|
||||||
<h2>First request with access_token in query parameter:</h2>
|
<h2>Response body:</h2>
|
||||||
<pre>{{ content1 }} </pre>
|
<pre>{{ content }} </pre>
|
||||||
<h2>Second request with access_token in header:</h2>
|
|
||||||
<pre>{{ content2 }} </pre>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -16,22 +16,21 @@ from django.http import HttpResponseRedirect
|
|||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response
|
||||||
|
|
||||||
STEP2_URI = 'http://localhost:8000/auth_return'
|
STEP2_URI = 'http://localhost:8000/auth_return'
|
||||||
|
FLOW = OAuth2WebServerFlow(
|
||||||
|
client_id='837647042410.apps.googleusercontent.com',
|
||||||
|
client_secret='+SWwMCL9d8gWtzPRa1lXw5R8',
|
||||||
|
scope='https://www.googleapis.com/auth/buzz',
|
||||||
|
user_agent='buzz-django-sample/1.0',
|
||||||
|
)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def index(request):
|
def index(request):
|
||||||
storage = Storage(CredentialsModel, 'id', request.user, 'credential')
|
storage = Storage(CredentialsModel, 'id', request.user, 'credential')
|
||||||
credential = storage.get()
|
credential = storage.get()
|
||||||
if credential is None or credential.invalid == True:
|
if credential is None or credential.invalid == True:
|
||||||
flow = OAuth2WebServerFlow(
|
|
||||||
client_id='837647042410.apps.googleusercontent.com',
|
|
||||||
client_secret='+SWwMCL9d8gWtzPRa1lXw5R8',
|
|
||||||
scope='https://www.googleapis.com/auth/buzz',
|
|
||||||
user_agent='buzz-django-sample/1.0',
|
|
||||||
)
|
|
||||||
|
|
||||||
authorize_url = flow.step1_get_authorize_url(STEP2_URI)
|
authorize_url = FLOW.step1_get_authorize_url(STEP2_URI)
|
||||||
f = FlowModel(id=request.user, flow=flow)
|
f = FlowModel(id=request.user, flow=FLOW)
|
||||||
f.save()
|
f.save()
|
||||||
return HttpResponseRedirect(authorize_url)
|
return HttpResponseRedirect(authorize_url)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
export PYTHONPATH=`pwd`:$PYTHONPATH
|
export PYTHONPATH=`pwd`:${PYTHONPATH}
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -79,7 +79,7 @@ setup(name="google-api-python-client",
|
|||||||
scripts=['bin/enable-app-engine-project'],
|
scripts=['bin/enable-app-engine-project'],
|
||||||
license="Apache 2.0",
|
license="Apache 2.0",
|
||||||
keywords="google api client",
|
keywords="google api client",
|
||||||
classifiers=['Development Status :: 3 - Alpha',
|
classifiers=['Development Status :: 4 - Beta',
|
||||||
'Intended Audience :: Developers',
|
'Intended Audience :: Developers',
|
||||||
'License :: OSI Approved :: Apache Software License',
|
'License :: OSI Approved :: Apache Software License',
|
||||||
'Operating System :: POSIX',
|
'Operating System :: POSIX',
|
||||||
|
|||||||
Reference in New Issue
Block a user