Ejemplo n.º 1
0
def login_view(request):
    if request.user is not None and request.user.is_active:
        response = HttpResponseRedirect(reverse('blog:index'))
        return set_jwt_and_response(request.user, response)
    if request.method == 'POST':  # 本地用户登录
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = auth.authenticate(username=username, password=password)
        next_url = decide_next_url(request.POST.get('next', ''))
        if user is not None and user.is_active:
            # Correct password, and the user is marked 'active'
            auth.login(request, user)
            response = HttpResponseRedirect(next_url)
            return set_jwt_and_response(request.user, response)
        else:
            # Show an error page
            return render(request, 'blog/login.html', {'next': next_url})
    else:  # GET method
        code = request.GET.get('code', '')
        next_url = decide_next_url(request.GET.get('next', ''))
        if len(code) > 0:  # 多说登录
            api = DuoshuoAPI(settings.DUOSHUO_SHORT_NAME,
                             settings.DUOSHUO_SECRET)
            response = api.get_token(code=code)
            print 'api.get_token %s' % code
            print response
            if response.has_key('user_key'):  # 这个多说账号已经绑定过本地账户了
                user = User.objects.get(pk=int(response['user_key']))
                user.backend = 'django.contrib.auth.backends.ModelBackend'
                auth.login(request, user)
                user_profile = User_Profile.objects.filter(user=user)
                if not user_profile:  # 手动绑定了多说账号和本地账号, 但是本地没有对应的 user_profile
                    user_profile = User_Profile(user=user,
                                                duoshuo_id=int(
                                                    response['user_id']),
                                                avatar=response['avatar_url'])
                    user_profile.save()
            else:  # 这个多说账户还没有绑定
                access_token = response['access_token']
                user_profile = User_Profile.objects.filter(
                    duoshuo_id=int(response['user_id']))
                if user_profile:  #此多说账号在本站已经注册过了, 但是没有绑定, 则先绑定, 然后直接登录
                    user = user_profile.first().user
                    user.backend = 'django.contrib.auth.backends.ModelBackend'
                    auth.login(request, user)
                else:  # 此多说账号在本站未注册, 添加一个用户
                    print 'api.users.profile user_id %s' % response['user_id']
                    response = api.users.profile(
                        user_id=response['user_id'])['response']
                    print response
                    username = '******' % response['user_id']
                    while User.objects.filter(username=username).count():
                        username = username + str(random.randrange(
                            1, 9))  #如果多说账号用户名和本站用户名重复,就加上随机数字
                    tmp_password = ''.join([
                        random.choice('abcdefg&#%^*f') for i in range(8)
                    ])  #随机长度8字符做密码
                    new_user = User.objects.create_user(
                        username=username,
                        email='*****@*****.**',
                        password=tmp_password,
                        first_name=response['name'])  #默认密码和邮箱,之后让用户修改
                    user_profile = User_Profile.objects.get_or_create(
                        user=new_user)[0]
                    user_profile.duoshuo_id = int(
                        response['user_id'])  #把返回的多说ID存到profile
                    user_profile.avatar = response['avatar_url']
                    user_profile.save()

                    user = auth.authenticate(username=username,
                                             password=tmp_password)
                    auth.login(request, user)
                # SSO 同步多说账户
                sync_sso_duoshuo(access_token, request.user)
            response = HttpResponseRedirect(next_url)
            return set_jwt_and_response(request.user, response)
        # absolute_next_url = request.build_absolute_uri(next_url)
        sso_login_url = '%s?next=%s' % (request.build_absolute_uri(
            reverse('blog:login_view')), next_url)
        sso_logout_url = request.build_absolute_uri(
            reverse('blog:logout_view'))
        context = {
            'next': next_url,
            'sso_login_url': sso_login_url,
            'sso_logout_url': sso_logout_url,
        }
        return render(request, 'blog/login.html', context)