Сбой аутентификации Django с 403 без подробного сообщения - PullRequest
3 голосов
/ 17 сентября 2011

У меня есть кое-что довольно простое, что я бросил вместе.У меня есть такая маленькая форма:

<form id="loginForm" action>
    <input name="email_address" type="text" placeholder="Email">
    <input name="password" type="password">
    <a id="loginButton">Login</a>
</form>

Мой JavaScript выполняет следующие действия:

$("#loginButton").click(function(){
    $.post("/login/",$("#loginForm").serialize(), function(data) {
        console.log("login.");
    });
});

Я написал пользовательский сервер аутентификации Django:

from my.custom.project.models import User

class MyBackend:

    def authenticate(self, email_address=None, password=None):
        print "Trying to auth"
        try:
            return User.objects.get(email_address=email_address, password=password)
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

У меня это настроено в моем settings.py, например, так:

AUTHENTICATION_BACKENDS = (
    "my.custom.project.auth.MyBackend",
)

В моем действительном представлении пути /login/ вот что у меня есть:

from django.contrib import auth

def login(request):
    print "Trying to auth..."
    email_address = request.POST['email_address']
    password = request.POST['password']

    user = auth.authenticate(email_address=email_address, password=password)

    if user != None:
        auth.login(request, user)

    direct_to_template(request, "my/login/template.json")

Вот мой URLкарта:

from django.conf.urls.defaults import * 
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

admin.autodiscover()

urlpatterns = staticfiles_urlpatterns

urlpatterns += patterns('',
    (r'^admin/', include(admin.site.urls)),
    (r'^admin/doc', include('django.contrib.admindocs.urls')),
)

urlpatterns += patterns('my.project.views',
    (r'^$', 'root'),
    (r'^login/?$', 'login'),
    (r'^logout/?$', 'logout'),
)

Кто-нибудь может увидеть, что я здесь делаю не так?Все, что я получаю на сервере Django, это:

[16/Sep/2011 20:17:47] "POST /login/ HTTP/1.1" 403 2326

Я принимаю сумасшедшие таблетки?Что я упустил?

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Это все из-за встроенной системы CSRF в Django: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

1 голос
/ 17 сентября 2011

Ну, одна вещь, которую вы делаете, это

from django.contrib.auth import authenticate,login,logout

, а затем переопределяете логин

def login(request):

и затем вызываете другой, который больше недоступен (перезаписывается вашим собственнымфункция входа в систему).

login(request, user)

Хотя не уверен, что это вызывает ошибку.

0 голосов
/ 17 сентября 2011

Также строка:

return User.objects.get(email_address=email_address, password=password)

подразумевает, что запись пользователя хранит пароль как есть, в виде открытого текста. Принимая во внимание, что на самом деле он хранит соленый хеш пароля, поэтому вам может потребоваться реализовать все эти функции самостоятельно.

...