def get(self): oauth_token = self.request.get('oauth_token') oauth_verifier = self.request.get('oauth_verifier') twitter_helper = twitter.TwitterAuth(self) user_data = twitter_helper.auth_complete(oauth_token, oauth_verifier) if self.user: # new association with twitter user_info = models.User.get_by_id(long(self.user_id)) if models.SocialUser.check_unique(user_info.key, 'twitter', str(user_data['id'])): social_user = models.SocialUser(user=user_info.key, provider='twitter', uid=str(user_data['id']), extra_data=user_data) social_user.put() message = _('Twitter association added!') self.add_message(message, 'success') else: message = _('This Twitter account is already in use!') self.add_message(message, 'error') self.redirect_to('edit-profile') else: # login with twitter social_user = models.SocialUser.get_by_provider_and_uid( 'twitter', str(user_data['id'])) if social_user: # Social user is exist. Need authenticate related site account user = social_user.user.get() self.auth.set_session(self.auth.store.user_to_dict(user), remember=True) visitLog = models.VisitLog(user=user.key, uastring=self.request.user_agent, ip=self.request.remote_addr, timestamp=utils.get_date_time()) visitLog.put() self.redirect_to('secure') else: # Social user is not exist. Need show login and registration forms twitter_helper.save_association_data(user_data) message = _( 'Account with association to your Twitter does not exist. You can associate it right now, if you login with existing site account or create new on Sign up page.' ) self.add_message(message, 'info') self.redirect_to('login') """
def get(self, provider_name): provider_display_name = models.SocialUser.PROVIDERS_INFO[ provider_name]['label'] if not config.enable_federated_login: message = _('Federated login is disabled.') self.add_message(message, 'warning') return self.redirect_to('login') callback_url = "%s/social_login/%s/complete" % (self.request.host_url, provider_name) if provider_name == "twitter": twitter_helper = twitter.TwitterAuth(self, redirect_uri=callback_url) self.redirect(twitter_helper.auth_url()) else: message = _('%s authentication is not implemented yet.' ) % provider_display_name self.add_message(message, 'warning') self.redirect_to('edit-profile')
def post(self): """ username: Get the username from POST dict password: Get the password from POST dict """ if not self.form.validate(): return self.get() username = self.form.username.data.lower() try: if utils.is_email_valid(username): user = models.User.get_by_email(username) if user: auth_id = user.auth_ids[0] else: raise InvalidAuthIdError else: auth_id = "own:%s" % username user = models.User.get_by_auth_id(auth_id) password = self.form.password.data.strip() remember_me = True if str( self.request.POST.get('remember_me')) == 'on' else False # Password to SHA512 password = utils.encrypt(password, config.salt) # Try to login user with password # Raises InvalidAuthIdError if user is not found # Raises InvalidPasswordError if provided password # doesn't match with specified user self.auth.get_user_by_password(auth_id, password, remember=remember_me) # if user account is not activated, logout and redirect to home if (user.activated == False): # logout self.auth.unset_session() # redirect to home with error message resend_email_uri = self.uri_for('resend-account-activation', encoded_email=utils.encode( user.email)) message = _('Sorry, your account') + ' <strong>{0:>s}</strong>'.format(username) + " " +\ _('has not been activated. Please check your email to activate your account') + ". " +\ _('Or click') + " <a href='"+resend_email_uri+"'>" + _('this') + "</a> " + _('to resend the email') self.add_message(message, 'error') return self.redirect_to('home') # check twitter association in session twitter_helper = twitter.TwitterAuth(self) twitter_association_data = twitter_helper.get_association_data() if twitter_association_data is not None: if models.SocialUser.check_unique( user.key, 'twitter', str(twitter_association_data['id'])): social_user = models.SocialUser( user=user.key, provider='twitter', uid=str(twitter_association_data['id']), extra_data=twitter_association_data) social_user.put() logVisit = models.LogVisit(user=user.key, uastring=self.request.user_agent, ip=self.request.remote_addr, timestamp=utils.get_date_time()) logVisit.put() self.redirect_to('home') except (InvalidAuthIdError, InvalidPasswordError), e: # Returns error message to self.response.write in # the BaseHandler.dispatcher message = _("Login invalid, Try again.") + "<br/>" + _("Don't have an account?") + \ ' <a href="' + self.uri_for('register') + '">' + _("Sign Up") + '</a>' self.add_message(message, 'error') return self.redirect_to('login')
def post(self): """ Get fields from POST dict """ if not self.form.validate(): return self.get() username = self.form.username.data.lower() name = self.form.name.data.strip() last_name = self.form.last_name.data.strip() email = self.form.email.data.lower() password = self.form.password.data.strip() country = self.form.country.data # Password to SHA512 password = utils.encrypt(password, config.salt) # Passing password_raw=password so password will be hashed # Returns a tuple, where first value is BOOL. # If True ok, If False no new user is created unique_properties = ['username', 'email'] auth_id = "own:%s" % username user = self.auth.store.user_model.create_user(auth_id, unique_properties, password_raw=password, username=username, name=name, last_name=last_name, email=email, country=country, activated=False) if not user[0]: #user is a tuple message = _('Sorry, This user') + ' <strong>{0:>s}</strong>'.format(username) + " " +\ _('is already registered.') self.add_message(message, 'error') return self.redirect_to('register') else: # User registered successfully # But if the user registered using the form, the user has to check their email to activate the account ??? try: user_info = models.User.get_by_email(email) if (user_info.activated == False): # send email subject = config.app_name + " Account Verification Email" encoded_email = utils.encode(email) confirmation_url = self.uri_for( "account-activation", encoded_email=encoded_email, _full=True) # load email's template template_val = { "app_name": config.app_name, "username": username, "confirmation_url": confirmation_url, "support_url": self.uri_for("contact", _full=True) } body_path = "emails/account_activation.txt" body = self.jinja2.render_template(body_path, **template_val) email_url = self.uri_for('taskqueue-send-email') taskqueue.add(url=email_url, params={ 'to': str(email), 'subject': subject, 'body': body, }) message = _('Congratulations') + ", " + str(username) + "! " + _('You are now registered') +\ ". " + _('Please check your email to activate your account') self.add_message(message, 'success') return self.redirect_to('home') # If the user didn't register using registration form ??? db_user = self.auth.get_user_by_password( user[1].auth_ids[0], password) # Check twitter association in session twitter_helper = twitter.TwitterAuth(self) twitter_association_data = twitter_helper.get_association_data( ) if twitter_association_data is not None: if models.SocialUser.check_unique( user[1].key, 'twitter', str(twitter_association_data['id'])): social_user = models.SocialUser( user=user[1].key, provider='twitter', uid=str(twitter_association_data['id']), extra_data=twitter_association_data) social_user.put() message = _('Welcome') + " " + str(username) + ", " + _( 'you are now logged in.') self.add_message(message, 'success') return self.redirect_to('home') except (AttributeError, KeyError), e: message = _('Unexpected error creating '\ 'user') + " " + '{0:>s}.'.format(username) self.add_message(message, 'error') self.abort(403)
def get(self, provider_name): if not config.enable_federated_login: message = _('Federated login is disabled.') self.add_message(message, 'warning') return self.redirect_to('login') if provider_name == "twitter": oauth_token = self.request.get('oauth_token') oauth_verifier = self.request.get('oauth_verifier') twitter_helper = twitter.TwitterAuth(self) user_data = twitter_helper.auth_complete(oauth_token, oauth_verifier) if self.user: # new association with twitter user_info = models.User.get_by_id(long(self.user_id)) if models.SocialUser.check_unique(user_info.key, 'twitter', str(user_data['id'])): social_user = models.SocialUser(user=user_info.key, provider='twitter', uid=str(user_data['id']), extra_data=user_data) social_user.put() message = _('Twitter association added!') self.add_message(message, 'success') else: message = _('This Twitter account is already in use!') self.add_message(message, 'error') self.redirect_to('edit-profile') else: # login with twitter social_user = models.SocialUser.get_by_provider_and_uid( 'twitter', str(user_data['id'])) if social_user: # Social user exists. Need authenticate related site account user = social_user.user.get() self.auth.set_session(self.auth.store.user_to_dict(user), remember=True) logVisit = models.LogVisit( user=user.key, uastring=self.request.user_agent, ip=self.request.remote_addr, timestamp=utils.get_date_time()) logVisit.put() self.redirect_to('home') else: # Social user does not exists. Need show login and registration forms twitter_helper.save_association_data(user_data) message = _( 'Account with association to your Twitter does not exist. You can associate it right now, if you login with existing site account or create new on Sign up page.' ) self.add_message(message, 'info') self.redirect_to('login') # Debug Callback information provided # for k,v in user_data.items(): # print(k +":"+ v ) # google, myopenid, yahoo OpenID Providers elif provider_name in models.SocialUser.open_id_providers(): provider_display_name = models.SocialUser.PROVIDERS_INFO[ provider_name]['label'] # get info passed from OpenId Provider from google.appengine.api import users current_user = users.get_current_user() if current_user: if current_user.federated_identity(): uid = current_user.federated_identity() else: uid = current_user.user_id() email = current_user.email() else: message = _( 'No user authentication information received from %s. Please ensure you are logging in from an authorized OpenID Provider (OP).' % provider_display_name) self.add_message(message, 'error') return self.redirect_to('login') if self.user: # add social account to user user_info = models.User.get_by_id(long(self.user_id)) if models.SocialUser.check_unique(user_info.key, provider_name, uid): social_user = models.SocialUser(user=user_info.key, provider=provider_name, uid=uid) social_user.put() message = provider_display_name + _(' association added!') self.add_message(message, 'success') else: message = _('This %s account is already in use!' % provider_display_name) self.add_message(message, 'error') self.redirect_to('edit-profile') else: # login with OpenId Provider social_user = models.SocialUser.get_by_provider_and_uid( provider_name, uid) if social_user: # Social user found. Authenticate the user user = social_user.user.get() self.auth.set_session(self.auth.store.user_to_dict(user), remember=True) logVisit = models.LogVisit( user=user.key, uastring=self.request.user_agent, ip=self.request.remote_addr, timestamp=utils.get_date_time()) logVisit.put() self.redirect_to('home') else: # Social user does not exist yet so create it with the federated identity provided (uid) # and create prerequisite user and log the user account in if models.SocialUser.check_unique_uid(provider_name, uid): # create user # Returns a tuple, where first value is BOOL. # If True ok, If False no new user is created # Assume provider has already verified email address # if email is provided so set activated to True auth_id = "%s:%s" % (provider_name, uid) if email: unique_properties = ['email'] user_info = self.auth.store.user_model.create_user( auth_id, unique_properties, email=email, activated=True) else: user_info = self.auth.store.user_model.create_user( auth_id, activated=True) if not user_info[0]: #user is a tuple message = _('This %s account is already in use!' % provider_display_name) self.add_message(message, 'error') return self.redirect_to('register') user = user_info[1] # create social user and associate with user social_user = models.SocialUser(user=user.key, provider=provider_name, uid=uid) social_user.put() # authenticate user self.auth.set_session( self.auth.store.user_to_dict(user), remember=True) logVisit = models.LogVisit( user=user.key, uastring=self.request.user_agent, ip=self.request.remote_addr, timestamp=utils.get_date_time()) logVisit.put() self.redirect_to('home') message = provider_display_name + _( ' association added!') self.add_message(message, 'success') self.redirect_to('home') else: message = _('This %s account is already in use!' % provider_display_name) self.add_message(message, 'error') self.redirect_to('login') else: message = _('%s authentication is not implemented yet.' ) % provider_display_name self.add_message(message, 'warning') self.redirect_to('login')
def get(self): callback_url = "%s/login/twitter/complete" % self.request.host_url twitter_helper = twitter.TwitterAuth(self, redirect_uri=callback_url) self.redirect(twitter_helper.auth_url())