Merge branch 'master' of github.com:web2py/web2py
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
Written by Michele Comitini <mcm@glisco.it>
|
Written by Michele Comitini <mcm@glisco.it>
|
||||||
License: GPL v3
|
License: LGPL v3
|
||||||
|
|
||||||
Adds support for OAuth 2.0 authentication to web2py.
|
Adds support for OAuth 2.0 authentication to web2py.
|
||||||
|
|
||||||
@@ -22,7 +22,8 @@ class OAuthAccount(object):
|
|||||||
Login will be done via OAuth Framework, instead of web2py's
|
Login will be done via OAuth Framework, instead of web2py's
|
||||||
login form.
|
login form.
|
||||||
|
|
||||||
Include in your model (eg db.py)::
|
You need to override the get_user method to match your auth provider needs.
|
||||||
|
Example for facebook in your model (eg db.py)::
|
||||||
# define the auth_table before call to auth.define_tables()
|
# define the auth_table before call to auth.define_tables()
|
||||||
auth_table = db.define_table(
|
auth_table = db.define_table(
|
||||||
auth.settings.table_user_name,
|
auth.settings.table_user_name,
|
||||||
@@ -41,12 +42,54 @@ class OAuthAccount(object):
|
|||||||
CLIENT_SECRET=\"<put your fb application secret here>\"
|
CLIENT_SECRET=\"<put your fb application secret here>\"
|
||||||
AUTH_URL="http://..."
|
AUTH_URL="http://..."
|
||||||
TOKEN_URL="http://..."
|
TOKEN_URL="http://..."
|
||||||
|
# remember to download and install facebook GraphAPI module in your app
|
||||||
|
from facebook import GraphAPI, GraphAPIError
|
||||||
from gluon.contrib.login_methods.oauth20_account import OAuthAccount
|
from gluon.contrib.login_methods.oauth20_account import OAuthAccount
|
||||||
auth.settings.login_form=OAuthAccount(
|
class FaceBookAccount(OAuthAccount):
|
||||||
None,CLIENT_ID,CLIENT_SECRET,AUTH_URL, TOKEN_URL, **args)
|
'''OAuth impl for FaceBook'''
|
||||||
|
AUTH_URL="https://graph.facebook.com/oauth/authorize"
|
||||||
|
TOKEN_URL="https://graph.facebook.com/oauth/access_token"
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
OAuthAccount.__init__(self,
|
||||||
|
client_id=CLIENT_ID,
|
||||||
|
client_secret=CLIENT_SECRET,
|
||||||
|
auth_url=self.AUTH_URL,
|
||||||
|
token_url=self.TOKEN_URL,
|
||||||
|
scope='user_photos,friends_photos')
|
||||||
|
self.graph = None
|
||||||
|
|
||||||
|
def get_user(self):
|
||||||
|
'''
|
||||||
|
Returns the user using the Graph API.
|
||||||
|
'''
|
||||||
|
|
||||||
|
if not self.accessToken():
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not self.graph:
|
||||||
|
self.graph = GraphAPI((self.accessToken()))
|
||||||
|
|
||||||
|
user = None
|
||||||
|
try:
|
||||||
|
user = self.graph.get_object("me")
|
||||||
|
except GraphAPIError, e:
|
||||||
|
self.session.token = None
|
||||||
|
self.graph = None
|
||||||
|
|
||||||
|
|
||||||
|
if user:
|
||||||
|
return dict(first_name = user['first_name'],
|
||||||
|
last_name = user['last_name'],
|
||||||
|
username = user['id'])
|
||||||
|
|
||||||
|
|
||||||
|
auth.settings.actions_disabled=['register','change_password','request_reset_password','profile']
|
||||||
|
auth.settings.login_form=FaceBookAccount()
|
||||||
|
|
||||||
|
Any optional arg in the constructor will be passed asis to remote
|
||||||
|
server for requests. It can be used for the optional"scope" parameters for Facebook.
|
||||||
|
|
||||||
Any optional arg will be passed as is to remote server for requests.
|
|
||||||
It can be used for the optional "scope" parameters for Facebook.
|
|
||||||
"""
|
"""
|
||||||
def __redirect_uri(self, next=None):
|
def __redirect_uri(self, next=None):
|
||||||
"""
|
"""
|
||||||
@@ -142,11 +185,19 @@ class OAuthAccount(object):
|
|||||||
current.session.token = None
|
current.session.token = None
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def __init__(self, g,
|
def __init__(self, g=None,
|
||||||
client_id, client_secret, auth_url, token_url, **args):
|
client_id=None, client_secret=None,
|
||||||
|
auth_url=None, token_url=None, **args):
|
||||||
"""
|
"""
|
||||||
first argument is unused. Here only for legacy reasons.
|
first argument is unused. Here only for legacy reasons.
|
||||||
"""
|
"""
|
||||||
|
if [client_id, client_secret, auth_url, token_url].count(None) > 0:
|
||||||
|
raise RuntimeError("""Following args are mandatory:
|
||||||
|
client_id,
|
||||||
|
client_secret,
|
||||||
|
auth_url,
|
||||||
|
token_url.
|
||||||
|
""")
|
||||||
self.client_id = client_id
|
self.client_id = client_id
|
||||||
self.client_secret = client_secret
|
self.client_secret = client_secret
|
||||||
self.auth_url = auth_url
|
self.auth_url = auth_url
|
||||||
@@ -163,13 +214,17 @@ class OAuthAccount(object):
|
|||||||
|
|
||||||
def get_user(self):
|
def get_user(self):
|
||||||
"""
|
"""
|
||||||
Returns the user using the Graph API.
|
Override this method by sublcassing the class.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if not current.session.token: return None
|
if not current.session.token: return None
|
||||||
return dict(first_name = 'Pinco',
|
return dict(first_name = 'Pinco',
|
||||||
last_name = 'Pallino',
|
last_name = 'Pallino',
|
||||||
username = 'pincopallino')
|
username = 'pincopallino')
|
||||||
raise NotImplementedError, "Must override get_user()"
|
raise NotImplementedError, "Must override get_user()"
|
||||||
|
|
||||||
|
# Following code is never executed. It can be used as example
|
||||||
|
# for overriding in subclasses.
|
||||||
if not self.accessToken():
|
if not self.accessToken():
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user