Drupal 8 POST / user / login? _Format = json 500 (500 Сервис недоступен (с сообщением)) - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь получить простой пользовательский логин для работы с использованием fetch POST в приложении ReactJS против конечной точки Drupal 8.8 Rest, чтобы я мог POST с CSRF или другими методами. Если я выдаю следующее с запросом CURL:

curl --header "Content-type: application/json" --request POST   --data '{"name":"myname", "pass":"mypassword123"}' http://example.com/user/login?_format=json

... Я получаю ...

    {"current_user":{"uid":"1","roles":["authenticated","administrator"],"name":"myname"},"csrf_token":"xxxxx","logout_token":"xxxx"}

В моем приложении, с другой стороны, я использую запрос на выборку .. .

 _handleSubmit = async event => {
    event.preventDefault();
    const response = await fetch(
      "http://example.com/user/login?_format_json",
      {
        method: "POST",
        headers: {
          "Content-type": "application/json"
        },
        body: {
          data: {
            user: "myname",
            pass: "mypassword123"
          }
        }
      }
    );

Я получаю

Drupal 8 POST / user / login? _Format = json 500 (500 Служба недоступна (с сообщением))

Имею также попытался удалить ключ "body" следующим образом:

  _handleSubmit = async event => {
event.preventDefault();
const response = await fetch(
  "http://example.com/entity/user?_format_json",
  {
    method: "POST",
    headers: {
      "Content-type": "application/json"
    },
      data: {
        user: "myname",
        pass: "mypassword123"
      }
  }
);

... также у меня есть модуль REST UI, но для / user / login не определена конечная точка. есть конечная точка / user / edit. Правильно ли я предполагаю, что / user / login? _Format = json POST настроен по умолчанию?

Любая помощь в этом была бы высоко оценена.

Я повторил запрос ajax и увидел, что это проблема, связанная с "cors". Тем не менее, я не понимаю, почему это проблема. Я включил мою конфигурацию "cors" из файла services.yml на моем сайте. По моему опыту, это должно включить запросы POST из браузера. Если только я что-то упустил ...

   cors.config:
enabled: true
allowedHeaders:
  [
    "x-csrf-token",
    "authorization",
    "content-type",
    "accept",
    "origin",
    "x-requested-with",
    "access-control-allow-origin",
    "x-allowed-header",
    "*",
  ]
allowedMethods: ["*"]
allowedOrigins: ["*"]
exposedHeaders: false
maxAge: false
supportsCredentials: true

Также вот последний запрос на выборку, который я использую. Он ничем не отличается от другого.

  _handleSubmit = async event => {
event.preventDefault();
const response = await fetch(
  "http://example.com/user/login?_format=json",
  {
    method: "POST",
    headers: {
      "Content-type": "application/json"
    },
    data: JSON.stringify({
      user: "myname",
      pass: "mypassword"
    })
  }
);
console.log(response);

};

1 Ответ

0 голосов
/ 20 марта 2020

Ладно, все .... Я получил его на работу. IDK, если другие люди сталкивались с этим, но с помощью Почтальона я смог извлечь конфигурацию выборки, которая не столкнулась с ошибкой «cors» 500. Так что я опубликую решение ниже после следующих уведомлений:

1 - На данный момент я отказался от синтаксиса "ожидание", поскольку Обещание, созданное Почтальоном, "только что сработало". 2 - Ответ доставляет токен CSRF очень хорошо, но я не захватил токен и не использовал его для CRUD GET или POST, et c. Если это работает отлично. Если нет, то мне придется бездельничать с сессионными cookie-файлами, JWT или «кто-что знает все».

Другими словами, я просто счастлив, что получил ответ и делюсь своим решением.

3 - Перед этим решением в определенных точках я смог получить ответ 200 с пустым телом. Но я заметил (и вы тоже), что Почтальон добавил что-то, чего у меня раньше не было ... "redirect:" follow ". Я думаю, что здесь был ключ.

Ну, вот оно для тех, кто может бороться или смеяться над моим невежеством ...

_handleSubmit = async event => {
event.preventDefault();
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const body = JSON.stringify({ name: "myname", pass: "myPW" });
const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: body,
  redirect: "follow"
};
fetch("http://example.com/user/login?_format=json", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log("error", error)); };
...