Я развернул приложение 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
security.yaml
в тело вопроса. Что касается маршрутов, то этоgraphql
, все они выглядят так:https:mywebsite/api/graphql
- person BernardA   schedule 14.03.2020/api/graphql
не требует аутентификации. - person yivi   schedule 14.03.2020/api/graphql
и требуют аутентификации? Я бы переместил правилоIS_AUTHENTICATED
в ваш раздел управления доступом, а в аннотации безопасности оставил бы толькоobject == user
. - person yivi   schedule 14.03.2020/api/graphql
не требует аутентификации. Есть несколько вопросов, которые открыты для всех. Но чтобы получить большую часть информации о пользователе, контроль доступа осуществляется на уровне запроса, и, как и в случае с рассматриваемым запросом, как пользователь должен быть аутентифицирован, так и сам должен быть пользователем для доступа к информации. . В целом я не думаю, что это как-то связано с конфигурацией безопасности. Как было сказано, все отлично работает локально с той же конфигурацией. - person BernardA   schedule 14.03.2020