IgorO2
@IgorO2
73

Как сделать авторизацию или по API key или по логин форме?

Добрый день!
Проблема такова, если пользователь заходит на API-firewall и у него токен не совпадает или токена нет, то смотрим другой firewall и проверяем:
-если залогинен на другом firewall то пускаем в API-firewall
-если не залогинен то отправляем на форму логина

пытался сделать используя Firewall context

пытался сделать используя multiple User Providers

в итоге сделал костыльно и прошу помощи сделать нормально
class ApiKeyAuthenticator implements SimplePreAuthenticatorInterface, AuthenticationFailureHandlerInterface
{

    /**
     * HttpHeaderAuthenticator constructor.
     */
    public function __construct()
    {
    }

    /**
     * @param Request $request
     * @param $providerKey
     * @return PreAuthenticatedToken
     */
    public function createToken(Request $request, $providerKey)
    {
        if (!$request->headers->has('apikey')) {

            $session = $request->getSession();

            if(null !== $session && ($token = $session->get('_security_main'))) {
                ...
                $request->headers->add(array('apikey' => $token->getCredentials()));
            } else {

                throw new BadCredentialsException('Not found access token!');
            }
        }

        return new PreAuthenticatedToken('anon.',
            $request->headers->get('apikey'),
            $providerKey);
    }
    /**
     * @param TokenInterface $token
     * @param $providerKey
     * @return bool
     */
    public function supportsToken(TokenInterface $token, $providerKey)
    {
        return $token instanceof PreAuthenticatedToken && $token->getProviderKey() === $providerKey;
    }

    /**
     * @param TokenInterface $token
     * @param UserProviderInterface $userProvider
     * @param $providerKey
     * @return PreAuthenticatedToken
     */
    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
    {
        ...
        $username = $userProvider->getUsernameForApiKey($token->getCredentials());

        if (!$username) {
            throw new AuthenticationException(
                sprintf('API Key "%s" does not exist.', $apiKey)
            );
        }
        $authenticatedToken = new PreAuthenticatedToken($username, $token->getCredentials(), $providerKey);
        $authenticatedToken->setAuthenticated(true);
        return $authenticatedToken;
    }

    /**
     * This is called when an interactive authentication attempt fails. This is
     * called by authentication listeners inheriting from
     * AbstractAuthenticationListener.
     *
     * @param Request $request
     * @param AuthenticationException $exception
     *
     * @return Response The response to return, never null
     */
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        return new Response("Please log in the system: <a href='/'>link</a>, or use token");
    }
  • Вопрос задан
  • 571 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы