2016-02-08 4 views
3

Я видел похожие вопросы, но до сих пор не могу заставить это работать.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 response 


    main: 
     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 к ложным в моем апи брандмауэре, я получаю ошибку 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 

Любые идеи?

Заранее благодарен!

ответ

2

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

Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9....9YR_D7N9E

+1

Да, это было! Проблема, казалось, была в нижнем регистре «носитель», так как теперь она работает с фигурными скобками и без них. Я бы поклялся, что сначала попробовал в верхнем регистре B, но, полагаю, что-то не так с моей конфигурацией. Большое вам спасибо! ^^ – NaryaV

+0

Да, и если вы внимательно прочитаете конфигурацию брандмауэра, вы увидите, что вы можете его изменить: измените 'prefix: Bearer' на' prefix: Foo', и вы можете передать свой токен, используя 'Authorization: Foo eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9 .. ..9YR_D7N9E' –

3

Первое решение работает, чтобы решить "401 - Bad аутентификации" ошибка.

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

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

Дополнительную информацию об этом выпуске можно найти по телефону documentation, по адресу this post и this one.

+1

в моем случае, он отсутствовал .htaccess в каталоге/web. Кроме того, условия перезаписи могут быть добавлены в .htaccess –