Я развернул приложение API-платформы с помощью токена JWT в ElasticBeanstalk, который, как обычно, отлично работает на моем локальном сервере.
На EB, хотя он запрещает доступ вошедшим в систему пользователям, несмотря на правильные BearerToken
предоставляется.
Выдается ошибка:
{
"errors": [
{
"message": "Access Denied.",
"extensions": {
"category": "graphql"
},
"locations": [
{
"line": 6,
"column": 9
}
],
"path": [
"retrievedQueryUser"
]
}
],
"data": {
"retrievedQueryUser": null
}
}
Запрос, о котором идет речь, пытается получить информацию о профиле пользователя с помощью следующей конфигурации graphql
:
* "retrievedQuery"={
* "item_query"=UserProfileResolver::class,
* "normalization_context"={"groups"={"get-owner"}},
* "security"="is_granted('IS_AUTHENTICATED_FULLY') and object == user"
* },
Итак, нужно просто проверить, действительно ли пользователи IS_AUTHENTICATED_FULLY
и сам ли пользователь пытается выполнить запрос.
Насколько я могу судить, с помощью дампа ниже на /vendor/symfony/security-core/Authorization/AuthorizationChecker.php
, он не может получить токен.
var_dump($this->tokenStorage->getToken()->getUser()->getUsername());
Я сделал краткое сравнение phpinfo()
между моей локальной установкой и установкой в AWS -EB и не смог найти очевидного несоответствия.
Это конфигурация для JWT на /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
token_ttl: 1800
Просто чтобы подтвердить, что пользователи могут войти в систему. Он проходит через проверку isGranted()
, которая не проходит.
Есть идеи?
РЕДАКТИРОВАТЬ - добавить `/config/packages/security.yaml
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
encoders:
App\Entity\User:
algorithm: auto
#algorithm: bcrypt
#algorithm: argon2i
cost: 12
providers:
database:
entity:
class: App\Entity\User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
refresh:
pattern: ^/api/token/refresh
stateless: true
anonymous: true
api:
pattern: ^/api
stateless: true
anonymous: true
json_login:
check_path: /api/login_check
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
guard:
authenticators:
- app.google_login_authenticator
- App\Security\TokenAuthenticator
entry_point: App\Security\TokenAuthenticator
user_checker: App\Security\UserEnabledChecker
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: ROLE_SUPERADMIN }
- { path: ^/api/token/refresh, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api, roles: IS_AUTHENTICATED_ANONYMOUSLY }
role_hierarchy:
ROLE_PROVIDER: ROLE_USER
ROLE_ADMIN: [ROLE_PROVIDER, ROLE_EDITOR]
ROLE_SUPERADMIN: ROLE_ADMIN