isGranted возвращает false для вошедшего в систему пользователя JWT - Symfony API-платформа AWS -EB - PullRequest
0 голосов
/ 14 марта 2020

Я развернул приложение 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

1 Ответ

0 голосов
/ 22 марта 2020

После дальнейших исследований я обнаружил, что Apache удаляет токен авторизации из запроса.

По методу supports из /lexik/jwt-authenticator-bundle/Security/Guard/JWTTokenAuthenticator дамп, как показано ниже, не будет включать токен на AWS:

 var_dump($request->headers->all());
 var_dump($_SERVER);

Согласно этому вопросу, это проблема конфигурации Apache, которая не принимает заголовки авторизации.

Указанное решение заключается в добавлении следующего к .htaccess:

 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

Это решает проблему, хотя следует отметить, что локальная установка Apache работает нормально без вышеуказанного редактирования. на .htaccess.

Таким образом, также может быть возможно изменить конфигурацию Apache напрямую, но я не мог найти, как go об этом.

РЕДАКТИРОВАТЬ: Позже я нашел специальная инструкция c для документации 'JWT-Token', которая подтверждает следующее решение для этой ссылки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...