Я создаю API Rest с помощью symfony 3.4. Мне нужно аутентифицировать пользователя на моем API, используя систему Oauth.
Итак, я использую систему защиты на Symfony. Я создал аутентификатор, который получает access_token в запросе, отправляемом клиентской стороной.
Это моя конфигурация (security.yml):
oauth:
pattern: ^/
stateless: true
simple_preauth:
authenticator: Oauth_authenticator
provider: provider.google_user
Мой Oauth_authenticator:
class OauthAuthenticator implements SimplePreAuthenticatorInterface,AuthenticationFailureHandlerInterface
{
public function createToken(Request $request, $providerKey)
{
$bearer = $request->headers->get('Authorization');
$accessToken = substr($bearer, 7);
return new PreAuthenticatedToken(
'anon.',
$accessToken,
$providerKey
);
}
public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
{
$accessToken = $token->getCredentials();
$user = $userProvider->loadUserByUsername($accessToken);
return new PreAuthenticatedToken(
$user,
$accessToken,
$providerKey,
['ROLE_USER']
);
}
/**
* This is called when an interactive authentication attempt fails. This is
* called by authentication listeners inheriting from
* AbstractAuthenticationListener.
*
* @return Response The response to return, never null
*/
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
return new Response("Authentication Failed ", 401);
}
public function supportsToken(TokenInterface $token, $providerKey)
{
return $token instanceof PreAuthenticatedToken && $token->getProviderKey() === $providerKey;
}
}
Но, как вы видите, сейчас я напрямую добавляю google_provider.
Какой лучший способ реализовать ту же систему, но с двумя моими поставщиками (Google и Facebook) или более в будущем ??
Спасибо,