JWT-токен React-Admin в заголовке - PullRequest
       48

JWT-токен React-Admin в заголовке

0 голосов
/ 26 февраля 2020

Я тестирую React-Admin https://github.com/marmelab/react-admin и остальной API https://github.com/hagopj13/node-express-mongoose-boilerplate

Я хочу перечислить пользователей в базе данных, но я получаю ошибка:

GET http://localhost:4000/v1/users?filter=%7B%7D&range=%5B0%2C24%5D&sort=%5B%22createdAt%22%2C%22desc%22%5D 401 (Unauthorized)

Вот поставщик данных:

import { fetchUtils } from "react-admin";
import { stringify } from "query-string";

const apiUrl = "http://localhost:4000/v1";
const httpClient = fetchUtils.fetchJson;

export default {
  getList: (resource, params) => {
    console.log(params.pagination);
    console.log(params.sort);
    const { page, perPage } = params.pagination;
    const { field, order } = params.sort;
    const query = {
      sort: JSON.stringify([field, order]),
      range: JSON.stringify([(page - 1) * perPage, page * perPage - 1]),
      filter: JSON.stringify(params.filter)
    };
    const url = `${apiUrl}/${resource}?${stringify(query)}`;

    return httpClient(url).then(({ headers, json }) => ({
      data: json,
      total: parseInt(
        headers
          .get("content-range")
          .split("/")
          .pop(),
        10
      )
    }));
  },

  getOne: (resource, params) =>
    httpClient(`${apiUrl}/${resource}/${params.id}`).then(({ json }) => ({
      data: json
    })),

  getMany: (resource, params) => {
    const query = {
      filter: JSON.stringify({ id: params.ids })
    };
    const url = `${apiUrl}/${resource}?${stringify(query)}`;
    return httpClient(url).then(({ json }) => ({ data: json }));
  },

  getManyReference: (resource, params) => {
    const { page, perPage } = params.pagination;
    const { field, order } = params.sort;
    const query = {
      sort: JSON.stringify([field, order]),
      range: JSON.stringify([(page - 1) * perPage, page * perPage - 1]),
      filter: JSON.stringify({
        ...params.filter,
        [params.target]: params.id
      })
    };
    const url = `${apiUrl}/${resource}?${stringify(query)}`;

    return httpClient(url).then(({ headers, json }) => ({
      data: json,
      total: parseInt(
        headers
          .get("content-range")
          .split("/")
          .pop(),
        10
      )
    }));
  },

  update: (resource, params) =>
    httpClient(`${apiUrl}/${resource}/${params.id}`, {
      method: "PUT",
      body: JSON.stringify(params.data)
    }).then(({ json }) => ({ data: json })),

  updateMany: (resource, params) => {
    const query = {
      filter: JSON.stringify({ id: params.ids })
    };
    return httpClient(`${apiUrl}/${resource}?${stringify(query)}`, {
      method: "PUT",
      body: JSON.stringify(params.data)
    }).then(({ json }) => ({ data: json }));
  },

  create: (resource, params) =>
    httpClient(`${apiUrl}/${resource}`, {
      method: "POST",
      body: JSON.stringify(params.data)
    }).then(({ json }) => ({
      data: { ...params.data, id: json.id }
    })),

  delete: (resource, params) =>
    httpClient(`${apiUrl}/${resource}/${params.id}`, {
      method: "DELETE"
    }).then(({ json }) => ({ data: json })),

  deleteMany: (resource, params) => {
    const query = {
      filter: JSON.stringify({ id: params.ids })
    };
    return httpClient(`${apiUrl}/${resource}?${stringify(query)}`, {
      method: "DELETE",
      body: JSON.stringify(params.data)
    }).then(({ json }) => ({ data: json }));
  }
};

Для getList, как добавить токен в заголовок для авторизации?

Обновление:

dataProvider. js

getList: (resource, params) => {
    /*
    console.log(params.pagination);
    console.log(params.sort);
    const {
      page,
      perPage
    } = params.pagination;
    const {
      field,
      order
    } = params.sort;
    */
    const query = {
      /*
      sort: JSON.stringify([field, order]),
      range: JSON.stringify([(page - 1) * perPage, page * perPage - 1]),
      filter: JSON.stringify(params.filter)
      */
    };
    const url = `${apiUrl}/${resource}/${stringify(query)}`;
    const token = localStorage.getItem('token');
    return httpClient(url).then(({
        headers: {
          "authorization": token
        }
      }, json
    }) => ({
      data: json,
      total: parseInt(
        headers
        .get("content-range")
        .split("/")
        .pop(),
        10
      )
    }));
  },

Но я получаю эту ошибку:

./src/middlewares/dataProvider.js
  Line 35:5:  Parsing error: Unexpected token, expected ","

  33 |         }
  34 |       }, json
> 35 |     }) => ({
     |     ^
  36 |       data: json,
  37 |       total: parseInt(
  38 |         headers

Спасибо и С уважением

Ludo

1 Ответ

1 голос
/ 26 февраля 2020

Добавьте const const token = localStorage.getItem('token'); и используйте его следующим образом

getList: (resource, params) => {
  console.log(params.pagination);
  console.log(params.sort);
  const {
    page,
    perPage
  } = params.pagination;
  const {
    field,
    order
  } = params.sort;
  const query = {
    sort: JSON.stringify([field, order]),
    range: JSON.stringify([(page - 1) * perPage, page * perPage - 1]),
    filter: JSON.stringify(params.filter)
  };
  const url = `${apiUrl}/${resource}?${stringify(query)}`;
  const token = localStorage.getItem('token');
  return httpClient(url).then(({
      headers: {
        "authorization": token
      }
    }, json
  }) => ({
    data: json,
    total: parseInt(
      headers
      .get("content-range")
      .split("/")
      .pop(),
      10
    )
  }));
},

Вы можете сделать то же самое для других запросов.

...