예제 #1
0
    def post(self, request, provider):
        data = request.DATA
        uid = data.get('uid')
        access_token = data.get('access_token')
        strategy = get_strategy(provider)
        social_response = {
            'access_token': access_token,
            'uid': uid,
            'openid': uid,
            'provider': provider,
        }
        log.info('api.oauth.bind.outer.login\n{}'.format(social_response))
        if provider == 'qq':
            social_response.update({
                'SOCIAL_AUTH_QQ_KEY': settings.SOCIAL_AUTH_MOBILE_QQ_OAUTH_CONSUMER_KEY
            })
        try:
            # 请求三方接口获得用户信息
            detail = strategy.backend.user_data(access_token, response=social_response)
            log.info('api.user.bind.oauth.login.response\n{}'.format(detail))
            if 'errcode' in detail:
                server_track(request, 'api.user.oauth.bind_failure', {
                    'bind_type': 'social_oauth',
                    'provider': provider,
                    'uid': request.user.id,
                    'error': {
                        'msg': u'三方登录失败',
                        'detail': detail,
                    },
                })
                raise error.Error(error.SOCIAL_OAUTH_LOGIN_FAILED, u'三分登陆失败')
        except Exception as ex:
            server_track(request, 'api.user.oauth.bind_failure', {
                'bind_type': 'social_oauth',
                'provider': provider,
                'uid': request.user.id,
                'error': {
                    'msg': ex.__class__.__name__,
                }
            })
            raise error.Error(error.SOCIAL_OAUTH_LOGIN_FAILED, u'三分登陆失败')

        try:
            _new_association(strategy, detail, request.user, created_on='mobile_bind')
            server_track(request, 'api.user.oauth.bind_success', {
                'unbind_type': 'social_oauth',
                'provider': provider,
                'uid': request.user.id
            })
        except AuthAlreadyAssociated as ex:
            server_track(request, 'api.user.oauth.bind_failure', {
                'bind_type': 'social_oauth',
                'provider': provider,
                'uid': request.user.id,
                'error': {
                    'msg': ex.__class__.__name__,
                }
            })
            raise error.Error(error.SOCIAL_OAUTH_AUTH_ALREADY_ASSOCIATED, u'该账号已被其它账号绑定')
        return Response(status=status.HTTP_201_CREATED)
예제 #2
0
def new_association(request):
    detail = request.session.get("authentication_user_detail")
    provider = detail["social_provider"]
    strategy = get_strategy(provider)
    _new_association(strategy, detail, request.user)
    provider_platform = PROVIDER_MAPPER.get(provider, {}).get("platform", u"三方")
    context = {"provider": provider_platform}
    return render_to_response("oauth/oauth_bind_success.html", context)
예제 #3
0
def new_association(request):
    detail = request.session.get('authentication_user_detail')
    provider = detail['social_provider']
    strategy = get_strategy(provider)
    _new_association(strategy, detail, request.user)
    provider_platform = PROVIDER_MAPPER.get(provider, {}).get('platform', u'三方')
    context = {'provider': provider_platform}
    return render_to_response('xuetangx/oauth/oauth_bind_success.html', context)
예제 #4
0
def new_association(request):
    detail = request.session.get('authentication_user_detail')
    provider = detail['social_provider']
    strategy = get_strategy(provider)
    _new_association(strategy, detail, request.user)
    provider_platform = PROVIDER_MAPPER.get(provider,
                                            {}).get('platform', u'三方')
    context = {'provider': provider_platform}
    return render_to_response('xuetangx/oauth/oauth_bind_success.html',
                              context)
예제 #5
0
def authentication_success(request):
    """
    新用户注册时
    用户直接走oauth后通过python-social-auth的auth后,成功会回调到此处,
    此时django的用户应该是未登录状态 request.user.is_authenticated() is False
    """
    detail = request.session.get("authentication_user_detail")
    # inviter_id = request.session.get('inviter_id')
    provider = detail["social_provider"]
    strategy = get_strategy(provider)
    enrollment_action = request.session.get("enrollment_action")
    classroom_id = request.session.get("classroom_id")
    user, _created = _get_or_create_oauth_user(strategy, detail, request)
    # # 如果有邀请
    # if inviter_id:
    #     _create_user_invite(inviter_id, user)
    login(request, user)
    user_profile = user.profile
    user_profile.last_login_ip = request.META.get("REMOTE_ADDR", None)
    user_profile.save()
    # 如果用户没有登录就选课,并且这时候选择的是oauth,尝试enroll课程
    if enrollment_action:
        request.method = "POST"
        request.POST = request.POST.copy()
        request.POST["enrollment_action"] = enrollment_action
        request.POST["classroom_id"] = classroom_id

        classroom = Classroom.objects.get(id=classroom_id)
        classroom.user = request.user
        classroom.save()
        # try_change_enrollment(request)
    next_url = request.session.get("next", "")
    context = {"next": next_url}

    # track_log(request, 'oauth.user.login_success', {
    #     'success': True,
    #     'uid': user.id,
    #     'provider': strategy.backend.name,
    # })
    return render_to_response("oauth/oauth_login_success.html", context)
예제 #6
0
def authentication_success(request):
    '''
    新用户注册时
    用户直接走oauth后通过python-social-auth的auth后,成功会回调到此处,
    此时django的用户应该是未登录状态 request.user.is_authenticated() is False
    '''
    detail = request.session.get('authentication_user_detail')
    inviter_id = request.session.get('inviter_id')
    provider = detail['social_provider']
    strategy = get_strategy(provider)
    enrollment_action = request.session.get('enrollment_action')
    course_id = request.session.get('course_id')
    user, _created = _get_or_create_oauth_user(strategy, detail, request)
    # 如果有邀请
    if inviter_id:
        _create_user_invite(inviter_id, user)
    login(request, user)
    user_profile = user.profile
    user_profile.last_login_ip = request.META.get('REMOTE_ADDR', None)
    user_profile.save()
    # 如果用户没有登录就选课,并且这时候选择的是oauth,尝试enroll课程
    if enrollment_action:
        request.method = 'POST'
        request.POST = request.POST.copy()
        request.POST['enrollment_action'] = enrollment_action
        request.POST['course_id'] = course_id
        try_change_enrollment(request)
    next_url = request.session.get('next', '')
    context = {'next': next_url}

    track_log(request, 'oauth.user.login_success', {
        'success': True,
        'uid': user.id,
        'provider': strategy.backend.name,
    })
    return render_to_response('xuetangx/oauth/oauth_login_success.html',
                              context)
예제 #7
0
def authentication_success(request):
    '''
    新用户注册时
    用户直接走oauth后通过python-social-auth的auth后,成功会回调到此处,
    此时django的用户应该是未登录状态 request.user.is_authenticated() is False
    '''
    detail = request.session.get('authentication_user_detail')
    inviter_id = request.session.get('inviter_id')
    provider = detail['social_provider']
    strategy = get_strategy(provider)
    enrollment_action = request.session.get('enrollment_action')
    course_id = request.session.get('course_id')
    user, _created = _get_or_create_oauth_user(strategy, detail, request)
    # 如果有邀请
    if inviter_id:
        _create_user_invite(inviter_id, user)
    login(request, user)
    user_profile = user.profile
    user_profile.last_login_ip = request.META.get('REMOTE_ADDR', None)
    user_profile.save()
    # 如果用户没有登录就选课,并且这时候选择的是oauth,尝试enroll课程
    if enrollment_action:
        request.method = 'POST'
        request.POST = request.POST.copy()
        request.POST['enrollment_action'] = enrollment_action
        request.POST['course_id'] = course_id
        try_change_enrollment(request)
    next_url = request.session.get('next', '')
    context = {'next': next_url}    

    track_log(request, 'oauth.user.login_success', {
        'success': True,
        'uid': user.id,
        'provider': strategy.backend.name,
    })
    return render_to_response('xuetangx/oauth/oauth_login_success.html', context)
예제 #8
0
    def social_oauth(self, request, data, client):
        """
        Handle ``grant_type=social_oauth`` requests as defined in :draft:`4.3`.
        """

        data = self.get_social_oauth_grant(request, data, client)
        uid = data.get('uid')
        access_token = data.get('access_token')
        provider = data.get('provider')
        scope = data.get('scope')
        strategy = get_strategy(provider)
        social_response = {
            'access_token': access_token,
            'uid': uid,
            'openid': uid,
            'provider': provider,
        }
        logging.info('api.oauth.outer.login\n{}'.format(social_response))
        if provider == 'qq':
            social_response.update({
                'SOCIAL_AUTH_QQ_KEY': settings.SOCIAL_AUTH_MOBILE_QQ_OAUTH_CONSUMER_KEY
            })
        user = _created = detail = None
        try:
            # 请求三方接口获得用户信息
            detail = strategy.backend.user_data(access_token, response=social_response)
            logging.info('api.user.oauth.login.response\n{}'.format(detail))
            if 'errcode' in detail:
                server_track(request, 'api.user.oauth.login_failure', {
                    'login_type': 'social_oauth',
                    'error': {
                        'msg': u'三方登录失败',
                        'detail': detail,
                    },
                })
                return self.error_response({
                    'error': u'三方登录失败',
                    'error_description': u"三方登录失败"
                }, request=request)
        except Exception as ex:
            server_track(request, 'api.user.oauth.login_failure', {
                'login_type': 'social_oauth',
                'error': {
                    'msg': ex.__class__.__name__,
                }
            })
            return self.error_response({
                'error': u'三方登录失败',
                'error_description': u"三方登录失败"
            }, request=request)

        try:
            # 创建用户: TODO: 异常处理
            user, _created = _get_or_create_oauth_user(strategy, detail,
                    request, mobile_client=True, created_on='mobile')
            if _created:
                server_track(request, 'api.user.oauth.register_success', {
                    'uid': user.id,
                    'username': user.username,
                    'provider': strategy.backend.name,
                })
        except Exception as ex:
            if not user and (_created is None):
                server_track(request, 'api.user.oauth.register_failure', {
                    'register_type': 'social_oauth',
                    'error': {
                        'msg': ex.__class__.__name__,
                    },
                })
            return self.error_response({
                'error': u'三方登录失败',
                'error_description': u"三方登录失败"
            }, request=request)

        if constants.SINGLE_ACCESS_TOKEN:
            at = self.get_access_token(request, user, scope, client)
        else:
            at = self.create_access_token(request, user, scope, client)
            rt = self.create_refresh_token(request, user, scope, at, client)

        # track user login ip
        # TODO: track in authorization grant typer last login ip in auth_userprofile
        user_profile = UserProfile.objects.get(user=user)
        user_profile.last_login_ip = request.META.get('REMOTE_ADDR', None)
        user_profile.save()

        sid = request.META.get('HTTP_SID')
        uid = user.id
        uuid = request.META.get('HTTP_UUID')
        if uuid:
            device, _ = DeviceInfo.objects.get_or_create(uuid=uuid)
            device.uid = uid
            device.save()
        if sid:
            timestamp = time.time()
            IDsInfo.new(sid, uid, uuid, timestamp)
        uuid = request.META.get('HTTP_UUID')

        response = self.access_token_response(at)
        set_login_response_header(request, response)
        login_type = response.get('login_type', '')
        server_track(request, 'api.user.oauth.login_success', {
            'uid': user.id,
            'username': user.username,
            'provider': strategy.backend.name,
            'login_type': login_type,
        })
        if _created:
            response['register_type'] = 'social_oauth'
        return response