Symfony 2.8 Guard AbstractGuardAuthenticator, как вернуть настоящий токен?

Я играю с AbstractGuardAuthenticator из относительно новой подсистемы Guard, добавленной в Symfony 2.8.

Моя установка очень проста. Я отправляю запрос на защищенный URL-адрес, который принимает имя пользователя: пароль в кодировке base64. Он проверяет оба по базе данных и должен возвращать токен.

Метод успешной аутентификации:

 public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    {
        //If login successful, return token
        return new Response($this->tokenStorage->getToken());        
    }

Что он возвращает:

 PostAuthenticationGuardToken(user="test", authenticated=true, roles="ROLE_ADVANCED,
 ROLE_USER")

Это то, чего я ожидал, учитывая, что AbstractGuardAuthenticator точно определяет метод создания этого токена.

public function createAuthenticatedToken(UserInterface $user, $providerKey)
    {
        return new PostAuthenticationGuardToken(
            $user,
            $providerKey,
            $user->getRoles()
        );
    }

ОБНОВЛЕНИЕ 1.1:

Используя LexikJWTAuthenticationBundle, теперь я пытаюсь внедрить веб-токены Json в AbstractGuardAuthenticator. Пакет Lexik предоставляет обработчик как успеха, так и отказа: lexik_jwt_authentication.handler.authentication_success и lexik_jwt_authentication.handler.authentication_failure, которые указывают на классы, в которые вводятся определенные переменные JWT. Как мне подключить их к обработчикам успеха и неудачи AbstractGuardAuthenticator?

 crud:
         anonymous: ~
         guard:
             authenticators:
                - app.token_authenticator
         pattern: ^/database/

И Guard методы успеха и неудачи

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
    if ($token = $request->headers->get('X-AUTH-TOKEN')) {
        //on success, let the request continue
    } else {
        //If login successful, return token
        return new Response($this->tokenStorage->getToken());
    }
}

public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
    $data = array(
        'message' => strtr($exception->getMessageKey(), $exception->getMessageData())

        // or to translate this message
        // $this->translator->trans($exception->getMessageKey(), $exception->getMessageData())
    );

    return new JsonResponse($data, 403);
}

В настоящее время я расширяю и объединяю JWTTokenAuthenticator с моим собственным аутентификатором токена вместо AbstractGuardAuthenticator, поскольку оба реализуют GuardAuthenticatorInterface.


person G_V    schedule 29.10.2016    source источник


Ответы (1)


Я хотел бы знать, как вернуть реальный токен, который можно использовать для аутентификации пользователя вместо того, чтобы каждый раз отправлять имя пользователя: пароль.

Компонент Symfony Guard

Guard стремится упростить подсистему аутентификации.

До появления Guard настройка пользовательской аутентификации требовала гораздо больше работы. Вам нужно было создать несколько частей/классов и заставить их работать вместе. Он гибкий, вы можете создать любую систему аутентификации, которую захотите, но для этого потребуются некоторые усилия. С Guard это становится намного проще, сохраняя при этом всю гибкость.

Это не компонент, который вам нужен.

Токен безопасности Symfony

При чтении слова «токен» в документации о компоненте Guard подразумевается реализация TokenInterface. Symfony использует эти реализации для отслеживания состояния аутентификации. Эти реализации никогда не покидают ваше приложение, это внутреннее дело.

Это не токен, который вы ищете.

Веб-токен JSON

«Токен», о котором вы говорите, представляет собой некоторую информацию, которую клиент может использовать для аутентификации. Это может быть случайная строка, такая как «токен доступа» протокола OAuth 2.0, или автономный и подписанный набор информации, такой как веб-токены JSON (JWT).

ИМХО JWT был бы самым перспективным токеном на данный момент. Анатомия веб-токена JSON — хороший прочтите, чтобы ознакомиться с JWT.

Существует несколько пакетов, которые могут легко интегрировать JWT в ваш проект Symfony. LexikJWTAuthenticationBundle сейчас самый популярный. Предлагаю посмотреть :)

person Jasper N. Brouwer    schedule 02.11.2016
comment
Спасибо, Джаспер, сейчас я прочитаю и свяжусь с вами как можно скорее. Поскольку GuardTokenInterface реализует только TokenInterface, я был довольно озадачен тем, что с ними делать. - person G_V; 03.11.2016
comment
Я какое-то время возился с LexikJWTAuthenticationBundle, и я думаю, что большая часть его работает сейчас, но я не понимаю, как реализовать это в моем AbstractGuardAuthenticator, поскольку документация предлагает внедрить эти обработчики аутентификации через form_login который Я не использую. Я обновлю свой вопрос с деталями конфигурации. - person G_V; 06.11.2016