def authenticate(self, code=None, group=None, openid=None, provider=None, request=None): """ Reads in a code and asks Provider if it's valid and what user it points to. """ keystone = KeystoneBackend() self.keystone = keystone try: profile_handle = getattr(self, '_get_%s_profile' % provider) except AttributeError: LOG.warn("Need to define _get_%s_profile function." % provider) return user_profile = profile_handle(code=code, openid=openid, request=request) if not user_profile: return if not user_profile['valid']: msg = "Failed to login, you are not in %s group: %s" % (provider, group) messages.error(request, msg) return external_id = user_profile['user_id'] external_email = user_profile['user_email'] access_token = user_profile['access_token'] username = "******" % (provider, external_id) tenant_name = username password = "" try: # Try and find existing user external_user = ExternalProfile.objects.get( external_id=external_id) user = external_user.user # Update access_token external_user.access_token = access_token password = external_user.password external_user.save() LOG.info("User: %s exists" % username) except ExternalProfile.DoesNotExist: LOG.info("User: %s not exists, creating..." % username) # No existing user try: user = User.objects.create_user(username, external_email) except IntegrityError: # Username already exists, make it unique existing_user = User.objects.get(username=username) existing_user.delete() user = User.objects.create_user(username, external_email) user.save() password = "".join([ random.choice(string.ascii_lowercase + string.digits) for i in range(8) ]) try: # Create the UserProfile external_user = ExternalProfile(user=user, external_id=external_id, access_token=access_token, password=password) keystone_admin = self._admin_client() tenant = keystone_admin.tenants.create(tenant_name, "Auto created account", True) user = keystone_admin.users.create(tenant_name, password, external_email, tenant.id, True) member_user_role = settings.MEMBER_USER_ROLE keystone_admin.roles.add_user_role(user.id, member_user_role, tenant.id) external_user.tenant_id = tenant.id external_user.save() except Exception as e: LOG.warn("Error creating user: %s, error: %s" % (username, e)) return try: user = keystone.authenticate( request=request, username=username, password=password, tenant=None, auth_url=settings.OPENSTACK_KEYSTONE_URL) return user except Exception as e: messages.error(request, "Failed to login: %s" % e)
def authenticate(self, code=None, group=None, openid=None, provider=None, request=None): """ Reads in a code and asks Provider if it's valid and what user it points to. """ keystone = KeystoneBackend() self.keystone = keystone try: profile_handle = getattr(self, '_get_%s_profile' % provider) except AttributeError: LOG.warn("Need to define _get_%s_profile function." % provider) return user_profile = profile_handle(code=code, openid=openid, request=request) if not user_profile: return if not user_profile['valid']: msg = "Failed to login, you are not in %s group: %s" % (provider, group) messages.error(request, msg) return external_id = user_profile['user_id'] external_email = user_profile['user_email'] access_token = user_profile['access_token'] username = "******" % (provider, external_id) tenant_name = username password = "" try: # Try and find existing user external_user = ExternalProfile.objects.get(external_id=external_id) user = external_user.user # Update access_token external_user.access_token = access_token password = external_user.password external_user.save() LOG.info("User: %s exists" % username) except ExternalProfile.DoesNotExist: LOG.info("User: %s not exists, creating..." % username) # No existing user try: user = User.objects.create_user(username, external_email) except IntegrityError: # Username already exists, make it unique existing_user = User.objects.get(username=username) existing_user.delete() user = User.objects.create_user(username, external_email) user.save() password = "".join([random.choice( string.ascii_lowercase + string.digits) for i in range(8)]) try: # Create the UserProfile external_user = ExternalProfile(user=user, external_id=external_id, access_token=access_token, password=password) keystone_admin = self._admin_client() tenant = keystone_admin.tenants.create(tenant_name, "Auto created account", True) user = keystone_admin.users.create(tenant_name, password, external_email, tenant.id, True) member_user_role = settings.MEMBER_USER_ROLE keystone_admin.roles.add_user_role(user.id, member_user_role, tenant.id) external_user.tenant_id = tenant.id external_user.save() except Exception as e: LOG.warn("Error creating user: %s, error: %s" % (username, e)) return try: user = keystone.authenticate(request=request, username=username, password=password, tenant=None, auth_url=settings.OPENSTACK_KEYSTONE_URL) return user except Exception as e: messages.error(request, "Failed to login: %s" % e)
def authenticate(self, token=None, openid=None, request=None): """ Reads in a Sina/Tencent code and asks Sina/Tencent if it's valid and what user it points to. """ keystone = KeystoneBackend() self.keystone = keystone # Sina weibo does not need `openid` if not openid: user_profile = self._get_sina_profile(token=token, request=request) else: user_profile = self._get_tencent_profile(token=token, openid=openid, request=request) if not user_profile: return if not user_profile['valid']: return external_id = user_profile['user_id'] external_email = user_profile['user_email'] access_token = user_profile['access_token'] if not openid: username = "******" % external_id tenant_name = "sina_%s" % external_id else: username = "******" % external_id tenant_name = "tencent_%s" % external_id password = "" try: # Try and find existing user external_user = ExternalProfile.objects.get(external_id=external_id) user = external_user.user # Update access_token external_user.access_token = access_token password = external_user.password external_user.save() except ExternalProfile.DoesNotExist: # No existing user try: try: user = User.objects.create_user(username, external_email) except IntegrityError: # Username already exists, make it unique existing_user = User.objects.get(username=username) existing_user.delete() user = User.objects.create_user(username, external_email) user.save() password = "".join([random.choice( string.ascii_lowercase + string.digits) for i in range(8)]) # Create the UserProfile external_user = ExternalProfile(user=user, external_id=external_id, access_token=access_token, password=password) keystone_admin = self._admin_client() tenant = keystone_admin.tenants.create(tenant_name, "Auto created account", True) user = keystone_admin.users.create(tenant_name, password, external_email, tenant.id, True) member_user_role = settings.MEMBER_USER_ROLE keystone_admin.roles.add_user_role(user.id, member_user_role, tenant.id) external_user.tenant_id = tenant.id external_user.save() except: external_user.delete() try: user = keystone.authenticate(request=request, username=username, password=password, tenant=None, auth_url=settings.OPENSTACK_KEYSTONE_URL) return user except Exception as e: messages.error(request, "Failed to login: %s" % e)