request.user.is_authenticated()始终返回false(Django)

时间:2016-09-11 01:11:31

标签: django session authentication cookies

我遇到的问题

  • 我目前正在使用Django v1.9作为我的Angular2应用程序的后端(我还没有使用Django REST Framework,只使用Django的身份验证系统并转储JSON)
  • 我尝试对用户进行身份验证,将其登录,然后允许他们编辑自己的个人资料。
  • 前两个步骤似乎有效。但是,我在使用 request.user.is_authenticated()时遇到了一些问题 - 它始终返回false,即使我之前已在用户上调用了login()函数。

似乎有用的部分

@csrf_exempt
def userlogin(request):

  body_unicode = request.body.decode('utf-8')
  body = json.loads(body_unicode)
  input_u = body['uname']
  input_p = body['pword']

  worked = False

  user = authenticate(username=input_u, password=input_p)

  if user is not None:
      login(request, user)
      context = { "login_data" : { "logged_in" : True, "user_id" : user.id } }
  else:
      context = { "login_data" : { "logged_in" : False, "user_id" : 0 } }

  return HttpResponse(json.dumps(context), content_type="application/json")

我正在努力解决

@ensure_csrf_cookie
def user(request):
  is_auth = False

  if request.user.is_authenticated():
    is_auth = True

  context = { "is_auth" : is_auth }

  return HttpResponse(json.dumps(context), content_type="application/json") 

注意:我使用 is_authenticated()(功能),而不是 is_authenticated (属性),因为我正在使用在Django v1.9而不是v.1.10(source)上。我以前犯了检查属性的错误,它总是返回true,但是当我尝试从请求对象返回用户的ID时,它总是为空。

我在这里一直都是假的。这是我第一次尝试使用Django进行身份验证,所以我只想在这里提出一些问题:

  • 我做错了什么吗?我想我在设置中拥有所需的所有东西:

    INSTALLED_APPS = [
        'search.apps.SearchConfig',
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'rest_framework',
        'corsheaders'
    ]
    

我也有' django.contrib.auth.middleware.AuthenticationMiddleware',     ' django.contrib.auth.middleware.SessionAuthenticationMiddleware'在我的中间件中。

  • Django究竟知道用户是否经过身份验证?我假设因为我激活了会话,所以它会检查会话cookie。但是,我怀疑这可能是个问题。在检查时,我今天下午为localhost安排了一个cookie。但是,从那时起我已登录并无法更新。我甚至尝试过Django内置的测试cookie功能(source),但是当我测试它时它不会起作用。我的设置应该没问题,我有以下内容:

    INSTALLED_APPS = ['django.contrib.sessions']
    
    SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
    
    MIDDLEWARE_CLASSES = [
      ...
      'django.contrib.sessions.middleware.SessionMiddleware',
      ...
      'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
      ...]
    

    我怀疑我错过了一些显而易见的东西,但我现在已经读了一段时间而没有运气。

谢谢,伙计们! 尼克

2 个答案:

答案 0 :(得分:0)

您没有在INSTALLED_APPS中使用contrib.auth应用。

答案 1 :(得分:0)

从我遇到的另一个问题找到解决我自己问题的方法。

问题是Angular没有向Django服务器发送cookie。由于Angular默认使用CORS,我不得不将{withCredentials:true}添加到RequestOptions对象。

实施例:     editUser(userdata){

    console.log("UserService: createUser function called");
    console.log(JSON.stringify(userdata));

    if(this.validateData(userdata)) {

        let headers = new Headers({
            'Content-Type': 'application/json',
            'X-CSRFToken': this.getCookie('csrftoken')
        });

        let options = new RequestOptions({ headers: headers, withCredentials: true });

        return this._http
            .post(
                this._editUserUri,
                JSON.stringify(userdata),
                options)
            .map(res => {
                console.log(res.json());
                return res.json();
            })
    }

}

在此详细解释:Angular2 and Django: CSRF Token Headache