Как сделать почтовый запрос к защищенному Laravel маршруту API с JavaScript с помощью токена API? - PullRequest
0 голосов
/ 03 мая 2020

Описание

У меня есть таблица, в которой я собираю значения из флажков с JavaScript. Эти значения следует отправлять на защищенный маршрут API в бэкэнде Laravel. Я использую стандартную настройку аутентификации Laravel (из коробки).

Вопрос

Что я должен отправить с пост-запросом JavaScript для аутентификации и как мне это сделать? Могу ли я добавить токен или что-то подобное в заголовки? В данный момент я получаю ответ:

«Это действие не авторизовано».

exception: "Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException"

Редактировать

При текущая точка моего исследования api-токен кажется простым решением для моего случая. Но я не могу понять, как прикрепить токен API к почтовому запросу JavaScript.

Это функция JavaScript для сбора значений, хранящих их в объектах.

import SaveData from "../api/SaveData";

export default async function SaveMultipleReports() {
const table = document.getElementById("reports-dashboard");
const rows = table.querySelectorAll("div[class=report-tr]");

let reports = [];
for (const row of rows) {
    const checkbox_visible = row.querySelector("input[name=visible]")
        .checked;
    const checkbox_slider = document.querySelector(
        "input[name=show_in_slider]"
    ).checked;

    const report = {
        id: row.id,
        visible: checkbox_visible,
        show_in_slider: checkbox_slider
    };
    reports.push(report);
}

console.log(reports);
const response = await SaveData("/api/reports/update", reports);
console.log(response);
}

И это SavaData функция:

export default async function SaveData(api, data) {
    const token = document
        .querySelector('meta[name="csrf-token"]')
        .getAttribute("content");
    const url = window.location.origin + api;
    const response = await fetch(url, {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            "X-CSRF-TOKEN": token,
            Accept: "application/json"
        },
        body: JSON.stringify(data)
    });

    const result = await response.json();
    return result;
}

И это строка в api.php:

Route::middleware("can:administration")->post("reports/update", "ReportsController@UpdateAll");

Весь репо здесь .

Спасибо за ваше время заранее:)

Редактировать 2

Пока я справился без JavaScript. Поместите все значения, я хочу обновить в форме и загрузить скрытый ввод для идентификатора каждого объекта (идентификатор необходим для контроллера впоследствии). Благодаря этому сообщению .

{!! Form::open(["route" => ["admin.reports.multiupdate"], "method" => "PUT", "class" => "report-table"]) !!}

... // some HTML

@foreach ($reports as $report)
<div class="report-tr">
  <input type="hidden" name="reports[{{$loop->index}}][id]" value="{{$report->id}}">
  <div class="td-name">
    <p class="td-text">{{$report->name}}</p>
  </div>
  <div class="td-flex">{{$report->body}}</div>
  <div class="tr-wrapper">
    <div class="checkbox-visible">
      <div class="checkbox-container">
        <input class="checkbox" type="checkbox" name="reports[{{$loop->index}}][visible]" value="1" checked>
        <span class="checkmark"></span>
      </div>
      <label class="table-label" for="visible">Sichtbar</label>
    </div>
    <div class="checkbox-slider">
      <div class="checkbox-container">
        <input class="checkbox" type="checkbox" name="reports[{{$loop->index}}][show_in_slider]" value="1"
          {{($report->show_in_slider == 1 ? "checked" : "")}}>
        <span class="checkmark"></span>
      </div>
      <label class="table-label" for="show_in_slider">Im Slider</label>
    </div>
    <div class="td-buttons">

... 

@endforeach
<button class="floating-save">
  @svg("saveAll", "saveAll")
</button>
{!! Form::close() !!}

и фрагменту из контроллера:

public function MultipleUpate(ReportUpdate $request)
  {
     $reports = $request->input("reports");

foreach ($reports as $row) {
  $report = Report::find($row["id"]);

  // giving the checkbox 0, if it isn't checked

  $isVisible = isset($row["visible"]) ? 1 : 0;
  $inSlider = isset($row["show_in_slider"]) ? 1 : 0;

  $report->visible = $isVisible;
  $report->show_in_slider = $inSlider;

  $report->new = false;

  if ($report->save()) {
    $saved = true;
  }
}

if ($saved == true) {
  $request->session()->flash("success",  "Änderungen gespeichert!");
} else {
  $request->session()->flash("error",  "Das hat nicht geklappt!");
}

return back();

Функция ReportUdpate содержит только следующее:

public function authorize()
  {
    return true;
  }

  public function rules()
  {
    return [
      "visible" => "nullable",
      "show_in_slider" => "nullable"
    ];
  }

1 Ответ

0 голосов
/ 05 мая 2020

Вы говорите об аутентификации, но используете промежуточное ПО авторизации. Между ними есть разница.

Прочтите об этом здесь: https://medium.com/datadriveninvestor/authentication-vs-authorization-716fea914d55

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

Измените свой маршрут так, чтобы он был таким:

Route::middleware("auth")->post("reports/update", "ReportsController@UpdateAll");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...