Esempio n. 1
0
    def post(self):
        # 获取参数
        parser = RequestParser()
        parser.add_argument('mobile',
                            type=type_mobile,
                            required=True,
                            location='json')
        parser.add_argument('code',
                            type=regex(r'^\d{6}$'),
                            required=True,
                            location='json')
        args = parser.parse_args()
        mobile = args.mobile
        code = args.code

        # 校验短信验证码
        key = "app:code:{}".format(mobile)
        try:
            real_code = current_app.redis_master.get(key)
        except BaseException as e:
            current_app.logger.error(e)  # 记录日志
            real_code = current_app.redis_slave.get(
                key)  # 如果主数据库连接失败, 再到数据库中获取

        # 一旦取出, 验证码就要删除 (验证码只能使用一次)
        # try:
        #     current_app.redis_master.delete(key)
        # except BaseException as e:
        #     current_app.logger.error(e)

        if not real_code or real_code.decode() != code:
            return {'message': "Invalid code", "data": None}, 400

        # 到数据库中查询该用户
        user = User.query.filter_by(mobile=mobile).first()

        if not user:  # 如果没有, 生成一条新的用户数据
            # 生成分布式id
            user_id = current_app.id_worker.get_id()
            # 添加user记录
            user = User(id=user_id,
                        mobile=mobile,
                        name=mobile,
                        last_login=datetime.now())
            db.session.add(user)
            # 添加user_profile记录
            user_profile = UserProfile(id=user_id)
            db.session.add(user_profile)
        else:
            user.last_login = datetime.now()
            user_id = user.id

        db.session.commit()

        # 记录用户状态, 生成jwt
        access_token, refresh_token = self._generate_tokens(user_id)

        # 返回json数据
        return {'access_token': access_token, "refresh_token": refresh_token}
Esempio n. 2
0
 async def on_turn(self, context: TurnContext,
                   logic: Callable[[TurnContext], Awaitable]):
     context_user_id = context.activity.from_property.id
     if context_user_id.isdigit():
         await context.send_activity(f'Valid UserId: {context_user_id}')
         user_profile = UserProfile()
         user_profile.user_id = context_user_id
         context.turn_state['user_profile'] = user_profile
         await logic()
Esempio n. 3
0
    def post(self):
        """
        登录创建token
        """
        json_parser = RequestParser()
        json_parser.add_argument('mobile',
                                 type=parser.mobile,
                                 required=True,
                                 location='json')
        json_parser.add_argument('code',
                                 type=parser.regex(r'^\d{6}$'),
                                 required=True,
                                 location='json')
        args = json_parser.parse_args()
        mobile = args.mobile
        code = args.code

        # 从redis中获取验证码
        key = 'app:code:{}'.format(mobile)
        try:
            real_code = current_app.redis_master.get(key)
        except ConnectionError as e:
            current_app.logger.error(e)
            real_code = current_app.redis_slave.get(key)

        try:
            current_app.redis_master.delete(key)
        except ConnectionError as e:
            current_app.logger.error(e)

        if not real_code or real_code.decode() != code:
            return {'message': 'Invalid code.'}, 400

        # 查询或保存用户
        user = User.query.filter_by(mobile=mobile).first()

        if user is None:
            # 用户不存在,注册用户
            # 雪花算法生成一个分布式ID
            user_id = current_app.id_worker.get_id()

            user = User(id=user_id,
                        mobile=mobile,
                        name=mobile,
                        last_login=datetime.now())
            db.session.add(user)
            profile = UserProfile(id=user.id)
            db.session.add(profile)
            db.session.commit()
        else:
            if user.status == User.STATUS.DISABLE:
                return {'message': 'Invalid user.'}, 403

        token, refresh_token = self._generate_tokens(user.id)

        return {'token': token, 'refresh_token': refresh_token}, 201
Esempio n. 4
0
    def test_create_profile_missing_fields(self):
        user = self.register_user()
        payload = {
            "photoFsRef": "https://google.com",
            "coverPhotoFsRef": "https://google.com",
            "tagline": "Some Tagline",
            "user_id": user.id
        }

        profile = UserProfile(**payload)
        profile.save()

        self.assertEqual(1, profile.id)
Esempio n. 5
0
    def test_create_profile(self):
        user = self.register_user()
        payload = {
            "photoFsRef": "https://google.com",
            "coverPhotoFsRef": "https://google.com",
            "tagline": "Some Tagline",
            "short_bio": "Short Bio",
            "country": "PH",
            "user_id": user.id
        }

        profile = UserProfile(**payload)
        profile.save()

        self.assertEqual(1, profile.id)
Esempio n. 6
0
    def post(self):
        """登录、注册创建token(JWT)"""
        """接收参数、校验参数"""
        # 验证手机号、验证码
        rep = reqparse.RequestParser()
        rep.add_argument('mobile',
                         required=True,
                         type=parser.moblie,
                         location='json')
        rep.add_argument('code',
                         required=True,
                         type=inputs.regex(r'^\d{6}$'),
                         location='json')
        # 启用验证并获取校验后的参数
        args = rep.parse_args()
        mobile = args.mobile
        code = args.code
        print('获取的手机号为:', mobile)
        print('获取的验证码为:', code)
        """数据处理"""
        # 根据mobile组合成key,去redis中取code
        key = f"app:code:{mobile}"
        try:
            # 先从主中获取,主里面没有再去从里尝试获取
            real_code = current_app.redis_master.get(key)
        except ConnectionError as err:
            current_app.logger(err)
            print(err)
            print('主Redis中并没有找到code,开始尝试从从Redis中获取。')
            real_code = current_app.redis_slave.get(key)

        # 不管有没有,先删除code,保证验证码只能使用一次
        try:
            current_app.redis_master.delete(key)
        except ConnectionError as err:
            current_app.logger(err)
            print('因为Redis中只有主可以进行写操作,所以可能从从中删除', err)

        # 如果Code不正确,直接返回错误信息
        if (not real_code) or (code != real_code.decode()):
            return {'message': '验证码无效'}, 400

        # 正确的话开始判断用户是否存在
        user = User.query.filter(User.mobile == mobile).first()
        # 如果用户不存在注册用户
        if not user:
            user_id = current_app.id_worker.get_id()
            user = User(id=user_id,
                        mobile=mobile,
                        name=mobile,
                        last_login=datetime.now())
            db.session.add(user)
            user_profile = UserProfile(id=user_id)
            db.session.add(user_profile)
            db.session.commit()
        else:
            if user.status == User.STATUS.DISABLE:
                print('用户已经被禁用')
                return {'message': '用户已经被禁用'}, 403

        print('用户正常,开始获取JWT。')
        token, refresh_token = self._generate_tokens(user.id)
        print('token:', token)
        print('refresh_token:', refresh_token)
        """返回响应"""
        return {'token': token, 'refresh_token': refresh_token}, 201