Lexik JWT returns 401 未经授权
Lexik JWT returns 401 Unauthorized
我正在使用 LexikJWTBundle RESTful API。
登录正常,我得到了我的令牌。但是当我发出 GET 请求时,我得到一个没有内容的 401。
授权 header 似乎没问题,因为我在探查器中得到了这个:
请求Headers:授权:Bearer {token}
请求服务器参数:HTTP_AUTHORIZATION: Bearer {token}
我得到的 401 来自:https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Security/Firewall/JWTListener.php#L80
我已经尝试了不同的解决方案,但仍然无法正常工作。
您知道如何resolve/debug吗?
我的配置:
# 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] }
LexikJWTBundle 生成令牌,因此用户的凭据有效。
当您尝试访问安全路由时出现问题(在“^/api”路径之后)。
您一定要检查分配给用户的角色。可能缺少 ROLE_API 且用户未完全通过身份验证。
我刚刚找到了解决相同问题的方法
这是我的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" 更改为 "_username" 并将 "password" 更改为 "_密码"
您应该在 security.yml 的 role_hierarchy
中添加 ROLE_API
:
role_hierarchy:
# ...
ROLE_API: [ROLE_USER]
那么,排名 ROLE_API
的用户可以访问限制在 IS_AUTHENTICATED_FULLY
的路由。
此外,如果您使用的是 Web 服务器,请尝试使用 built-in 服务器(即 app/console server:run
)来使用您的应用程序。
Apache 似乎修改了 headers 中的令牌。
我正在使用 LexikJWTBundle RESTful API。
登录正常,我得到了我的令牌。但是当我发出 GET 请求时,我得到一个没有内容的 401。 授权 header 似乎没问题,因为我在探查器中得到了这个: 请求Headers:授权:Bearer {token} 请求服务器参数:HTTP_AUTHORIZATION: Bearer {token}
我得到的 401 来自:https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Security/Firewall/JWTListener.php#L80
我已经尝试了不同的解决方案,但仍然无法正常工作。
您知道如何resolve/debug吗?
我的配置:
# 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] }
LexikJWTBundle 生成令牌,因此用户的凭据有效。 当您尝试访问安全路由时出现问题(在“^/api”路径之后)。
您一定要检查分配给用户的角色。可能缺少 ROLE_API 且用户未完全通过身份验证。
我刚刚找到了解决相同问题的方法
这是我的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" 更改为 "_username" 并将 "password" 更改为 "_密码"
您应该在 security.yml 的 role_hierarchy
中添加 ROLE_API
:
role_hierarchy:
# ...
ROLE_API: [ROLE_USER]
那么,排名 ROLE_API
的用户可以访问限制在 IS_AUTHENTICATED_FULLY
的路由。
此外,如果您使用的是 Web 服务器,请尝试使用 built-in 服务器(即 app/console server:run
)来使用您的应用程序。
Apache 似乎修改了 headers 中的令牌。