401 Несанкционированный на незащищенном ресурсе - PullRequest
2 голосов
/ 20 марта 2020

Мои настройки

У меня есть сервер с API REST, который работает на Symfony с платформой API. Запросы GET для моих ресурсов не требуют авторизации, однако другие операции требуют. Авторизация обрабатывается токеном JWT Bearer.

Клиент использует React-admin с администратором платформы API. Я добавил этот код для отправки токена JWT вместе с операциями:

// dataProvider.js
import React from "react";
import { hydraDataProvider, fetchHydra as baseFetchHydra } from "@api-platform/admin";

export default entrypoint => {

    const fetchHeaders = { Authorization: `Bearer ${localStorage.getItem("token")}` };
    const fetchHydra = (url, options = {}) => baseFetchHydra(url, {
        ...options,
        headers: new Headers(fetchHeaders),
    });

    return hydraDataProvider(entrypoint, fetchHydra);
};

Проблема

Когда я вхожу в свой интерфейс администратора сейчас, я получаю 401 Unauthorized ответ, поскольку сервер не ожидал токен для запроса GET.

Заголовки запроса :

Host: localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: application/ld+json
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://localhost:3000/
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE1ODQ2NzcwMTYsImV4cCI6MTU4NDY4MDYxNiwicm9sZXMiOlsiUk9MRV9BRE1JTiJdLCJ1c2VybmFtZSI6IlNvbWVib2R5In0.O_StagfEJy5VQS-5s-DjuwzOlUgrl3MTmxPfZUU0J1go06tKOpLjiBrEIJpjo5AK67w93SfsUaIBop8apoacHQ
Content-Type: application/ld+json
Origin: http://localhost:3000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
TE: Trailers

Заголовки ответа :

HTTP/2 401 Unauthorized
access-control-allow-origin: http://localhost:3000
access-control-expose-headers: link
cache-control: no-cache, private
content-type: application/json
date: Fri, 20 Mar 2020 04:40:39 GMT
link: <https://localhost:8000/api/docs.jsonld>; rel="http://www.w3.org/ns/hydra/core#apiDocumentation"
www-authenticate: Bearer
x-debug-token: 720652
x-debug-token-link: https://localhost:8000/_profiler/720652
x-powered-by: PHP/7.4.1
x-robots-tag: noindex
content-length: 282
X-Firefox-Spdy: h2

Когда я вручную удаляю строку авторизации из заголовков запросов в браузере и повторяю ее, она работает.


Мои вопросы:

  1. Есть это даже ожидаемое поведение?
  2. Должен ли клиент всегда отправлять токен?
    • Если токен нужно всегда отправлять, как я могу сказать API Platform принять его, даже если он не нужен?
    • Если токен нужно отправлять только тогда, когда он требуется, как это сделать? Я знаю, что HydraDataProvider знает?

1 Ответ

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

После многих часов проб разных решений я наконец-то исправил эту проблему.

Ответы на мои вопросы

  1. Нет, отправка действительного токена не должна приводить к ответу 401 .
  2. Маркер можно отправлять при каждом запросе.

Мое решение

Проблема заключалась в том, что на моем сервере неправильно настроена аутентификация JWT. Ни одно из руководств, которым я следовал, на самом деле не охватывало следующий случай: У меня в качестве идентификатора есть электронная почта пользователя, а не имя пользователя.

Так что в итоге токен содержал закодированный имя пользователя , который не является уникальным идентификатором в моем случае. Чтобы указать JWT использовать электронную почту вместо этого, мне пришлось установить user_identity_field на email .

// config/packages/lexik_jwt_authentication.yaml
lexik_jwt_authentication:
    secret_key: '%env(resolve:JWT_SECRET_KEY)%'
    public_key: '%env(resolve:JWT_PUBLIC_KEY)%'
    pass_phrase: '%env(JWT_PASSPHRASE)%'
    user_identity_field: email
...