Lexik JWT Token не найден

Я видел подобные вопросы, но все еще не могу заставить это работать.

Я новичок в Symfony и использую пакет Lexik JWT с symfony3 для аутентификации API и форму входа для веб-аутентификации.

Я получаю токен в порядке, но когда я пытаюсь использовать его, я получаю 401 — Плохая аутентификация.
Я читал, что это может быть проблема apache, поэтому я пытаюсь использовать встроенный веб-сервер PHP, но все же не повезло.

Вот мой файл security.yml:

security:

encoders:
AppBundle\Entity\User:
algorithm: bcrypt

# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
in_memory:
memory: ~
our_db_provider:
entity:
class: AppBundle:User
property: username

firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false

login:
pattern:  ^/api/login
stateless: true
anonymous: true
form_login:
check_path:               /api/login_check
success_handler:          lexik_jwt_authentication.handler.authentication_success
failure_handler:          lexik_jwt_authentication.handler.authentication_failure
require_previous_session: false
provider: our_db_provider

api:
pattern:   ^/api
stateless: true
provider: our_db_provider
lexik_jwt:
authorization_header: # check token in Authorization Header
enabled: true
prefix:  Bearer
throw_exceptions:        true     # When an authentication failure occurs, return a 401 response immediately
create_entry_point:      true      # When no authentication details are provided, create a default entry point that returns a 401 responsemain:
anonymous: ~
form_login:
login_path: /login
check_path: /login_check
provider: our_db_provider

access_control:
- { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api,       roles: IS_AUTHENTICATED_FULLY }
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: [ROLE_ADMIN, ROLE_USER] }

Если я установил для create_entry_point значение false в моем брандмауэре API, я получаю ошибку 500: токен не найден в TokenStorage.

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

POST /api/notifications HTTP/1.1
Host: localhost:8000
Authorization: bearer {"token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJleHAiOjE0NTUwMDk1ODAsInVzZXJuYW1lIjoiYXNvcmlhIiwiaWF0IjoiMTQ1NDkyMzE4MCJ9.rwgAkLBesTYOZn3B96Jlsf9_3Qy-rjrRt2l5UxdXD8ZadJ2YbK-9m7qNqUd9-bhaA_MFL1lssPZ-0AzmQCZx8bL8XD_l2_df0wfVm6Le6pEJEJk0arbyxlEOZ-9LrRdOa6EjnzDcZT6Wn76QNOsCSjME7rjk0w0lLs4eXAaXGAYL6lqU4YoiM1xnifzHgGtJKc7RBBivY8yHjfs51S6GwEKzPGrYMUTZWmjhxFPlKZCqEJlaJ6NT82A3PuoISCMUvt7AuxhHdgeuS-TMjdTY-WhqaL7f7Z2FP0_FstKVORHDzC1vf7VlylF76SnF0Sh2tMTuvf70zYnD_gF0k7b9zoOp54e0mJt0XaLTyCtomPSeDhfJV1wJY6EZsrvdUrrHXXtXhA6K70FIM_nQJPVo4Raht-hQWmOnWb3Ib0SvvytQHP96klXVgKHyIaicEjvWhmonzgSRndme4HGXlPWmbKH6tVJpvWatOeaWD4jjS-ZLD_5oBr_o3vNPw81oZj0huI6OgzYvXDpLPw3P7Ma4LmBdQOLwpUEPG3LnuKIdU27umFTrN3T-Cfrb6kITU1BTaTL-AIOM-F6FDlcgJfYxOs6GEFOlFtjJ5KSAEiY8DWiubbrS-VH9uaMlc9YapTlNVsUI7whzO7QmXzC-V8idrNoWBWVftyMDlA9YR_D7N9E"}
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

Или же

    POST /api/notifications HTTP/1.1
Host: localhost:8000
Authorization: bearer {"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJleHAiOjE0NTUwMDk1ODAsInVzZXJuYW1lIjoiYXNvcmlhIiwiaWF0IjoiMTQ1NDkyMzE4MCJ9.rwgAkLBesTYOZn3B96Jlsf9_3Qy-rjrRt2l5UxdXD8ZadJ2YbK-9m7qNqUd9-bhaA_MFL1lssPZ-0AzmQCZx8bL8XD_l2_df0wfVm6Le6pEJEJk0arbyxlEOZ-9LrRdOa6EjnzDcZT6Wn76QNOsCSjME7rjk0w0lLs4eXAaXGAYL6lqU4YoiM1xnifzHgGtJKc7RBBivY8yHjfs51S6GwEKzPGrYMUTZWmjhxFPlKZCqEJlaJ6NT82A3PuoISCMUvt7AuxhHdgeuS-TMjdTY-WhqaL7f7Z2FP0_FstKVORHDzC1vf7VlylF76SnF0Sh2tMTuvf70zYnD_gF0k7b9zoOp54e0mJt0XaLTyCtomPSeDhfJV1wJY6EZsrvdUrrHXXtXhA6K70FIM_nQJPVo4Raht-hQWmOnWb3Ib0SvvytQHP96klXVgKHyIaicEjvWhmonzgSRndme4HGXlPWmbKH6tVJpvWatOeaWD4jjS-ZLD_5oBr_o3vNPw81oZj0huI6OgzYvXDpLPw3P7Ma4LmBdQOLwpUEPG3LnuKIdU27umFTrN3T-Cfrb6kITU1BTaTL-AIOM-F6FDlcgJfYxOs6GEFOlFtjJ5KSAEiY8DWiubbrS-VH9uaMlc9YapTlNVsUI7whzO7QmXzC-V8idrNoWBWVftyMDlA9YR_D7N9E"}
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

Есть идеи?

Заранее спасибо!

5

Решение

Заголовок авторизации должен быть


Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9....9YR_D7N9E

3

Другие решения

Первое решение работает, чтобы решить «401 — Плохая аутентификация» ошибка.

Но для апаш пользователи, у которых есть ошибка401 — токен JWT не найден«, решение состоит в том, чтобы переписать заголовок запроса HTTP Authorization, поместив следующие инструкции на вашем виртуальном хосте:

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

Вы можете найти дальнейшие чтения по этому вопросу на документация, на эта почта а также этот.

3

Если кто-то все еще испытывает эту проблему, особенно после выполнения всего вышеперечисленного, вы можете попробовать что-то подобное. Вместо того, чтобы использовать HTTP_AUTHORIZATION Вы можете использовать пользовательский заголовок http, такой как Php-Auth-Digest, С помощью HTTP_AUTHORIZATION может быть сложным и может быть удален из запроса из-за различных настроек сервера (особенно при использовании общих серверных сред, cPanel и т. д.)

Конфигурация для принятия пользовательского заголовка http в пакете LexikJWT это,

lexik_jwt_authentication:
# token extraction settings
token_extractors:
# look for a token as Authorization Header
authorization_header:
enabled: true
prefix: Bearer
name: Php-Auth-Digest

Чтобы узнать больше об этой ссылке, перейдите по этой ссылке — https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/1-configuration-reference.md

Отправка заголовка из вашего приложения API будет выглядеть следующим образом (это пример из Angular 6)

request = request.clone({
setHeaders: {
"Php-Auth-Digest": `Bearer ${currentUser.token}`,
}
});

Я надеюсь, что это помогает кому-то. Приветствия.

1
По вопросам рекламы [email protected]