First of all you need to get the *google_auth.json file to use OAuth*
To get that you need to register your Google account as a webdeveloper
You can find how get the information on Google :)
Then u can change ur auth table in this way
In the model.py
from gluon.tools import Auth, Crud, Service, PluginManager, prettydate
auth = Auth(db,secure=True)
crud, service, plugins = Crud(db), Service(), PluginManager()
## ------------TABELLE USER ------------------- ##
## create all tables needed by auth if not custom tables
auth.settings.extra_fields['auth_user']= [
Field('phone', type='string', label='Telefono'),
Field('country',type='string', label='Nazione'),
Field('city',type='string', label='Città '),
Field('address',type='string', label='Indirizzo'),
Field('auth_login', type='string', default='basic', label='Tipo
Login',readable=False, writable=False),
Field('url_img', requires=IS_EMPTY_OR(IS_URL()), label='Link Immagine
Profile',readable=False, writable=False),
Field('nickname', type='string', label='Nickname'),
Field('birthdate', type='date', label='Data Di nascita'),
Field('gender', type = 'string', label='Genere' ,requires =
IS_IN_SET(['M','F']), default = 'M'),
Field('facebook_id', type='string', label='Username di
Facebook',readable=False, writable=False),
Field('twitter_id', type='string', label='Username di
Twitter',readable=False, writable=False),
Field('google_id', type='string', label='Username di
Google',readable=False, writable=False ),
Field('linkedin_id', type='string', label='Username di
Linkedin',readable=False, writable=False),
]
auth.define_tables(username=False, signature=True)
*In The Controller*
Import AccountAccess
def google():
if auth.is_logged_in():
redirect(URL(r=request, c='default', f='index'))
folder = request.folder
google_access = AccountAccess.GoogleAccount(folder)
auth.settings.login_form=google_access
return auth.login(next=URL(r=request, c='default', f='index'))
In the Module section
Create the *AccountAccess* module
import oauth2 as oauth
from gluon.contrib.login_methods.oauth10a_account import OAuthAccount as
OAuthAccount10a
from gluon.contrib.login_methods.oauth20_account import OAuthAccount
from oauthtwitter_account import OAuthAccount as OauthAccountTwitter
import os
import storage
import urllib2
from oauth2 import Client, Consumer, Token
class GoogleAccount(OAuthAccount):
"OAuth 2.0 for Google"
def __init__(self,db,session,request,response,folder):
with open(os.path.join(folder, *'private/google_auth.json'*), 'rb')
as f:
gai = storage.Storage(json.load(f)['web'])
self.db = db
self.request = request
self.response = response
self.session = session
g = dict(
request=request,
response=response,
session=session,
)
OAuthAccount.__init__(self,g, gai.client_id, gai.client_secret,
gai.auth_uri, gai.token_uri,
scope='https://www.googleapis.com/auth/userinfo.profile
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/plus.login',
approval_prompt='auto',
access_type = 'offline',
state="auth_provider=google")
def get_user(self):
token = self.accessToken()
if not token:
return None
uinfo_url =
'https://www.googleapis.com/oauth2/v1/userinfo?access_token=%s' %
urllib2.quote(token, safe='')
uinfo = None
try:
uinfo_stream = urllib2.urlopen(uinfo_url)
except:
session.token = None
return None
data = uinfo_stream.read()
uinfo = json.loads(data)
username = uinfo['id']
if uinfo:
gender = 'M'
if uinfo['gender'][0].lower() == 'f':
gender = 'F'
existent = self.db(self.db.auth_user.email ==
uinfo["email"]).select(self.db.auth_user.id,self.db.auth_user.auth_login).first()
if existent:
if existent.auth_login <> 'Google':
diz_account = dict(
username = uinfo['email'],
gender = gender,
auth_login = 'Google',
url_img = uinfo.get('picture', ''),
google_id = uinfo['id'],
registration_id = uinfo['id']
)
existent.update_record(**diz_account)
return dict(first_name = uinfo.get('given_name',
uinfo["name"].split()[0]),
last_name = uinfo.get('family_name',
uinfo["name"].split()[-1]),
username = uinfo['email'],
email = uinfo['email'],
gender = gender,
auth_login = 'Google',
birthdate = uinfo.get('birthday', ''),
url_img = uinfo.get('picture', ''),
google_id = uinfo['id'],
registration_id = uinfo['id']
)
else:
# self.db.auth.send_welcome_email(user)
return dict(first_name = uinfo.get('given_name',
uinfo["name"].split()[0]),
last_name = uinfo.get('family_name',
uinfo["name"].split()[-1]),
username = uinfo['email'],
email = uinfo['email'],
gender = gender,
auth_login = 'Google',
birthdate = uinfo.get('birthday', ''),
url_img = uinfo.get('picture', ''),
google_id = uinfo['id'],
registration_id = uinfo['id']
)
def call_api(self):
api_return = urllib.urlopen("
https://www.googleapis.com/oauth2/v1/userinfo?access_token=%s" %
self.accessToken())
user = json.loads(api_return.read())
if user:
return user
else:
session.token = None
return None
It worked for me
Il giorno martedì 7 aprile 2015 16:01:22 UTC+2, Moiz Nagpurwala ha scritto:
> Hello,
>
> Still waiting for a working example of OAuth2 with Google.
>
> It is very crucial for my application to integrate Google authentication
> in order to succeed.
>
> Hope this great community won't let me down.
>
> Thanks and regards.
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.