Ejemplo n.º 1
0
def reset_password():
    """重置密码 (GET|POST)

    :uri: /users/reset_password
    :param phone: 手机号
    :param password: 密码
    :param code: 短信验证码
    :returns: {}
    """
    params = request.values
    phone = params.get('phone', None)
    code = params.get('code', None)
    password = params.get("password", None)
    if not phone or not code or not password:
        return error.InvalidArguments

    invalid_error = User.invalid_password(password)
    if invalid_error:
        return invalid_error

    user = User.get_by_phone(phone)
    if not user:
        return error.UserNotExist

    if not SMS.verify_code(phone, code):
        return error.VerifyCodeFailed

    User.change_pwd(user, password)
    return {}
Ejemplo n.º 2
0
def change_pwd(uid):
    """修改密码 (GET|POST&LOGIN)

    :uri: /users/<string:uid>/change-password
    :param old_pwd: 旧密码
    :param new_pwd: 新密码
    :returns: {}
    """
    user = request.authed_user
    params = request.values
    old_pwd = params.get('old_pwd', None)
    new_pwd = params.get('new_pwd', None)
    user = User.login(user.name, old_pwd)
    if not user:
        return error.AuthFailed('原密码不正确')

    invalid_error = User.invalid_password(new_pwd)
    if invalid_error:
        return invalid_error

    User.change_pwd(user, new_pwd)
    return {}
Ejemplo n.º 3
0
def platform_login():
    """第三方平台token登录 (GET|POST)

    :uri: /platform/users/login
    :param platform: 平台标识{'csdk':付费SDK, 'weixin':微信, 'qq':QQ, 'migu':咪咕}
    :param token: 用户平台token
    :returns: {'user': object, 'ut': string}
    """
    params = request.values
    platform = params.get('platform', None)
    token = params.get("token", None)
    if not token or platform not in const.PARTNER:
        return error.InvalidArguments

    data = Migu.token_validate(token)
    if isinstance(data, error.ApiError):
        return data

    openid = data.get('msisdn', None)
    migu_uid = data.get('identityID', None)
    passid = data.get('passID', None)
    if isinstance(migu_uid, error.ApiError):
        return migu_uid

    if platform == 'migu':
        # 进行用户绑定
        user = User.get_platform_user('migu', migu_uid)
        if not user:
            user = User.get_by_phone(openid)
            if user:
                info = dict(partner_migu={
                    'id': migu_uid,
                    'passid': passid
                },
                            name='$mg$%s%s' %
                            (migu_uid[-4:], random.randint(1000, 9999)))
                user = user.update_model({'$set': info})
            else:
                info = dict(phone=openid,
                            nickname=u'咪咕用户%s%s' %
                            (migu_uid[-4:], random.randint(1000, 9999)),
                            name='$mg$%s%s' %
                            (migu_uid[-4:], random.randint(1000, 9999)),
                            partner_migu={
                                'id': migu_uid,
                                'passid': passid
                            })
                user = User.create_platform_user('migu', migu_uid, data=info)
        else:
            info = {}
            # 如果用户没有绑定手机并且手机号没有被绑定, 则自动进行手机号绑定
            if not user.phone and not User.get_by_phone(openid):
                info = dict(phone=openid)
            # 如果用户未绑定passid,则自动进行passid绑定
            if passid not in user.partner_migu:
                info.update(
                    dict(partner_migu={
                        'id': migu_uid,
                        'passid': passid
                    }))
            if info:
                user = user.update_model({'$set': info})

        # 同步咪咕用户名密码
        if user:
            User.change_pwd(user, token)
    else:
        # 判断平台用户是否已经用户系统中存在
        user = User.get_platform_user(platform, openid)
        first_login = not user

        info = {}
        if platform == 'csdk':
            info = ChargeSDK(token).get_open_info()
        elif platform == 'weixin':
            info = WeiXin(token, openid).get_open_info(first_login)
        elif platform == 'qq':
            info = QQ(token, openid).get_open_info(first_login)

        if not info:
            return error.LoginFailed

        # 如果平台用户在用户系统中不存在, 则创建, 通过平台ID(openid)进行关联
        if first_login:
            open_id = info.pop('openid')
            user = User.create_platform_user(platform, open_id, data=info)
            # 给咪咕平台发送请求进行咪咕账号注册并登录绑定
            try:
                if platform in ['qq', 'weixin'] and user:
                    password = '******' % (openid[-4:])
                    ret = Migu.center_register(open_id, password,
                                               const.CENTER_ACCOUNT_INDIV)
                    if not isinstance(ret, error.ApiError):
                        openid = Migu.get_identityid(
                            open_id, password, const.CENTER_ACCOUNT_INDIV)
                        if not isinstance(openid, error.ApiError):
                            if not User.get_platform_user('migu', openid):
                                info = {'partner_migu': {'id': openid}}
                                user.update_model({'$set': info})
            except:
                pass

    if not user:
        return error.LoginFailed

    ut = User.gen_token(str(user._id))
    return {'user': user.format(include_fields=['passid']), 'ut': ut}