2015-01-15 3 views
5

Я использую LexikJWTBundle для API RESTful.Lexik JWT возвращает 401 Неавторизованный

Вход работает отлично, и я получаю свой токен. Но когда я делаю запрос GET, я получаю 401 без содержимого. Заголовок Authorization кажется нормально, так как я получаю это в профилировщика: заголовков запроса: авторизация: Знаменосец {лексем} Параметры запроса сервера: HTTP_AUTHORIZATION: Канал {маркер}

401 я получаю от: https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Security/Firewall/JWTListener.php#L80

Я пробовал разные решения, но все же он не работает.

Есть ли у вас какие-либо идеи относительно того, как разрешить/отладить это?

Мой конфиг:

# config.yml 
... 

lexik_jwt_authentication: 
    private_key_path: %kernel.root_dir%/var/jwt/private.pem # ssh private key path 
    public_key_path: %kernel.root_dir%/var/jwt/public.pem # ssh public key path 
    pass_phrase:  'TEST'          # ssh key pass phrase 
    token_ttl:  86400         # token ttl - defaults to 86400 

И

# security.yml 

security: 
role_hierarchy: 
    ROLE_SUPER_ADMIN:  [ROLE_ADMIN, ROLE_SONATA_ADMIN, ROLE_ALLOWED_TO_SWITCH] 
# http://sonata-project.org/bundles/admin/2-3/doc/reference/security.html 
# set access_strategy to unanimous, else you may have unexpected behaviors 
access_decision_manager: 
    strategy: unanimous 

encoders: 
    FOS\UserBundle\Model\UserInterface: sha512 

providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username_email 

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    api_login: 
     pattern: ^/api/login # Default: .* 
     provider: fos_userbundle 

     # form login 
     form_login: 
      login_path:  fos_user_security_login 
      # csrf_provider: form.csrf_provider # Default: my.csrf_provider.id 
      # LexikJWT # 09/01/15 - Note: provient de la configuration officielle. 
      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 
     anonymous: true # Default: ~ 

    api: 
     pattern: ^/api 
     stateless: true 
     lexik_jwt: 
      authorization_header: # check token in Authorization Header 
       enabled: true 
       prefix: Bearer 
     anonymous: true 

access_control: 
    # Secured part of the site 
    # This config requires being logged for the whole site and having the admin role for the admin part. 
    # Change these rules to adapt them to your needs 
    - { path: "^/api/contacts$", roles: IS_AUTHENTICATED_ANONYMOUSLY, methods: [POST] } 
    - { path: "^/api/users/dt$", roles: IS_AUTHENTICATED_ANONYMOUSLY, methods: [GET] } 
    - { path: "^/api/users$", roles: IS_AUTHENTICATED_ANONYMOUSLY, methods: [POST] } 
    - { path: "^/api",  roles: [IS_AUTHENTICATED_FULLY, ROLE_API] } 

ответ

4

Я просто нашел решение по одной и той же задачи

Вот мой security.yml

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt|error)|css|images|js)/ 
     security: false 

    login: 
     pattern: ^/api/login 
     stateless: true 
     anonymous: true 
     provider: user_db 
     form_login: 
      check_path:    /api/login_check 
      username_parameter:  _username 
      password_parameter:  _password 
      success_handler:   lexik_jwt_authentication.handler.authentication_success 
      failure_handler:   lexik_jwt_authentication.handler.authentication_failure 
      require_previous_session: false 

    api: 
     pattern: ^/api 
     stateless: true 
     lexik_jwt: 
      authorization_header: # check token in Authorization Header 
       enabled: true 
       prefix: Bearer 
      throw_exceptions:  false  # 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 
      authentication_provider: lexik_jwt_authentication.security.authentication.provider 

Моя проблема была имя пользователя и параметры пароля. Меняю "имя пользователя" по "_username" и "пароль" по "_password"

0

LexikJWTBundle генерирует маркер поэтому учетные данные пользователя являются действительными. Проблема возникает при попытке доступа к защищенным маршрутам (по пути «^/api»).

Обязательно проверьте роли, назначенные пользователю. Возможно, ROLE_API отсутствует, и пользователь не прошел полную проверку подлинности.

+0

Спасибо за ваш ответ. Проблема заключалась в отсутствии провайдера в брандмауэре api. Следовательно, это должно быть в api_login AND api. – Xavier13

1

Вы должны добавить ROLE_API в role_hierarchy вашего security.yml:

role_hierarchy: 
    # ... 
    ROLE_API: [ROLE_USER] 

Затем пользователи, имеющие рейтинг ROLE_API, могут получить доступ к маршрутам, ограниченным IS_AUTHENTICATED_FULLY.

Кроме того, если вы используете веб-сервер, попробуйте использовать приложение с помощью встроенного сервера (то есть app/console server:run).

Apache, похоже, модифицирует токен в заголовках.