Отдыхайте звонки в DEV Env каждый раз, ответ 401 Несанкционированный, PROD работает нормально - PullRequest
0 голосов
/ 30 сентября 2019

Я использую API отдыха. В производстве все звонки работают. В среде разработки он каждый раз завершается с 401. Есть пользовательский провайдер API и он проверяет, есть ли у пользователя доступ к API. Логин - http_basic с учетными данными пользователя.

Я попробовал несколько вещей, чтобы выяснить, в чем проблема. Но ничего не работает.

Я сделал отладочный вывод в UserApiProvider, но меня не будут вызывать.

security.yaml

providers:
        user_provider:
            id: dashboard.user_provider.email
        api_provider:
            id: dashboard.user_provider.api
        internal_provider:
            id: dashboard.user_provider.internal

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

        internal_status:
            pattern: ^/internal/status$
            stateless: true
            http_basic:
                provider: internal_provider

        api:
            pattern: ^/api/
            stateless: true
            http_basic:
                provider: api_provider

        main:
            pattern: ^/
            form_login:
                provider: user_provider
                failure_handler: security.login_failure_handler
                success_handler: security.login_success_handler
                csrf_provider: security.csrf.token_manager
            logout:
                csrf_provider: security.csrf.token_manager
                success_handler: security.custom_logout_success_handler
            anonymous: true
            switch_user: true

ApiUserProvider

class ApiUserProvider extends UserProvider
{
    /**
     * {@inheritDoc}
     */
    protected function findUser($username)
    {
        /** @var User $user */
        $user = $this->userManager->findUserByEmail($username);

        if ($user && !$user->hasApiAccess()) {
            return null;
        }

        return $user;
    }
}

Ошибка будет:

{"error": {"code": 401, "message": "Unauthorized","исключение": [{"сообщение": "Вы не прошли проверку подлинности", "класс": "Symfony \ Component \ HttpKernel \ Exception \ HttpException", "trace": [{"namespace": "", "short_class":"", "класс": "", "типа": "", "функция": "", "файл": "/ приборная панель / Библиотека / продавец / friendsofsymfony / остальное-расслоение / FOS / RestBundle / EventListener / AccessDeniedListener. PHP " "линии": 77, "арг": []}, { "пространства имен": "ФОС \ RestBundle \ EventListener", "short_class": "AccessDeniedListener", "класс":" ФОС \ RestBundle \ EventListener \ AccessDeniedListener», "тип": "->", "функция": "", "файл onKernelException": "/ панель / Библиотека / поставщика / Symfony / Symfony / SRC / Symfony / Компонент / EventDispatcher / Debug / WrappedListener.php","линия": 61, "арг": [[ "объект", "Symfony \ Component \ HttpKernel \ Event \ GetResponseForExceptionEvent"], ["string", "kernel.exception"], ["object", "Symfony \ Component \ HttpKernel \ Debug \ TraceableEventDispatcher"]]}

...

Из dev.log

[request ERROR] Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\HttpException: "You are not authenticated" at /dashboard/lib/vendor/friendsofsymfony/rest-bundle/FOS/RestBundle/EventListener/AccessDeniedListener.php line 77 {"exception":"[object] (Symfony\\Component\\HttpKernel\\Exception\\HttpException(code: 0): You are not authenticated at /dashboard/lib/vendor/friendsofsymfony/rest-bundle/FOS/RestBundle/EventListener/AccessDeniedListener.php:77, Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): A Token was not found in the TokenStorage. at /dashboard/lib/vendor/symfony/symfony/src/Symfony/Component/Security/Http/Firewall/AccessListener.php:51)"}

У кого-нибудь есть идеи?

С уважением, Кай

1 Ответ

0 голосов
/ 30 сентября 2019

Конечно, я думал, что это проблема с приложением.

Проблема заключалась в отсутствии заголовка аутентификации для php-cgi. на моем движке prod есть mod_php и локальный cgi: /

Workaround for missing Authorization header under CGI/FastCGI Apache:
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
...