У меня есть веб-приложение Django, которое использует структуру Django REST для создания различных конечных точек API. Я могу гарантировать, что только зарегистрированные пользователи могут просматривать / читать эти конечные точки, но сейчас я нахожусь на стадии разработки, когда я хочу, чтобы пользователи публиковали в API, используя токены. Я успешно сделал это, однако я жестко запрограммировал токен пользователя в почтовый запрос в Javascript ... Это сработало для тестирования, но, очевидно, не является хорошим окончательным решением.

Можно ли как-нибудь запросить токен текущего пользователя? Могу ли я автоматически включить этот токен в заголовок запроса POST?

Заранее благодарим за любую помощь / обратную связь!

РЕДАКТИРОВАТЬ: Я думаю, что близок, но я получаю несколько ошибок в хром-консоли и все еще не могу получить токен.

Ошибки консоли:

toggleScript.js:25 Uncaught DOMException: Failed to execute 
'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.
    at getToken (http://127.0.0.1:8000/static/defaults/toggleScript.js:25:7)
    at manageDefaults 
(http://127.0.0.1:8000/static/defaults/toggleScript.js:62:5)
    at HTMLInputElement.onclick (http://127.0.0.1:8000/defaults/:1:1)
getToken @ toggleScript.js:25
manageDefaults @ toggleScript.js:62
onclick @ (index):1
toggleScript.js:24 POST http://127.0.0.1:8000/api-token-auth/ 415 
(Unsupported Media Type)

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

toggleScript.js

function getToken(){
  var xhr = new XMLHttpRequest();
  var url = 'http://127.0.0.1:8000/api-token-auth/';
  xhr.open("POST", url, true);
  var data = JSON.stringify({"username": "myusername", "password": "mypassword"});
  xhr.send(data);
  xhr.setRequestHeader("Content-Type", "application/json");
  xhr.onreadystatechange = function () {
      if (xhr.readyState === 4 && xhr.status === 200) {
          var json = JSON.parse(xhr.responseText);
          console.log(json.token);
      }
  };
}
0
MattG 5 Окт 2018 в 18:46

1 ответ

Лучший ответ

Django Rest Framework предоставляет конечную точку API для запроса токена пользователя с учетом имени пользователя и пароля. Вы можете подключить вид к своему urls.py:

from rest_framework.authtoken import views
urlpatterns += [
    url(r'^auth-token/', views.obtain_auth_token)
]

Затем, когда вы отправляете POST действительное имя пользователя и пароль в это представление, он вернет токен в ответе JSON:

{ 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' }

Затем ваше приложение может сохранить это и отправлять в последующих запросах.

Пример получения токена с помощью JQuery (при условии, что представление было сопоставлено с путем ^auth-token/ в вашем urls.py):

$.post('/auth-token/', { username: 'admin', password: 'whatever' }, function(data) {
    // Token available as data.token
});

Если вы попытаетесь отправить сообщение в представление auth-token из уже аутентифицированного сеанса, Django, скорее всего, отклонит запрос с ответом CSRF token missing or incorrect. Вы должны либо убедиться, что сеанс не аутентифицирован при получении токена, либо вы можете потенциально включить в запрос заголовок X-CSRFToken. Вам нужно будет извлечь значение из файла cookie csrftoken. Например (с использованием JQuery и подключаемого модуля JQuery Cookie):

$.ajax({
    url: "/auth-token/",
    type: "POST",
    headers: { 
        "X-CSRFToken": $.cookie("csrftoken")  # Extract the csrftoken from the cookie
    },
    data:{ username: "admin", password: "whatever" },
    dataType:"json"
}).done(function(data) {
    // Token available as data.token
});

Дополнительная информация о получении токена аутентификации здесь

1
Will Keeling 6 Окт 2018 в 12:45