Запрос текущих пользователей API-токен Django REST Framework - PullRequest
0 голосов
/ 05 октября 2018

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

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

Спасибо за любую помощь / отзыв заранее !!

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

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

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);
      }
  };
}

1 Ответ

0 голосов
/ 05 октября 2018

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

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

Затем, когда вы поместите действительное имя пользователя и пароль в это представление, он вернет токен в ответе 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
});

Подробнее о получении токена аутентификации здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...