Hi. I'm a newbie trying web2py. I get this error when I try above code
*Cannot import module 'applications.admin.modules.oauth2'*
I'm assuming that I don't have oauth2 library set up in the module section.
How can I fix this?
On Thursday, April 9, 2015 at 7:30:46 AM UTC-5, piero crisci wrote:
>
> 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.