Я работаю с проектом в Symfony 4.3.Я пытаюсь реализовать протокол OAuth 2.0.
В начале мое приложение получает access_token на основе запроса к серверу авторизации Google.Затем я пытаюсь подтвердить access_token с помощью Google API, и это нормально.Наконец, я пытаюсь сгенерировать токен JWT приложением, и проблемы начинаются там.
Графически это можно изобразить как:
Для этой цели я установил LexikJWTAuthenticationBundle от композитора.У меня не было проблем с генерацией закрытого / открытого ключа.
Для генерации токена я использовал часть документации:
https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/7-manual-token-creation.md
Частьмоего контроллера для авторизации выглядит так:
public function auth(Request $request, ValidatorInterface $validator, ErrorService $errorService,
JsonFromDbObjectConverter $converter, JWTTokenManagerInterface $JWTManager,
AuthenticationSuccessHandler $handler): JsonResponse
{
/**
* some part of code: confirmation access token by google API
*
*/
$user = $this->getDoctrine()->getRepository(User::class)->findOneBy(['email' => 'kmichalski@trans.eu']);
$token = $JWTManager->create($user);
return $handler->handleAuthenticationSuccess($user, $token);
}
Работает нормально.На основе вышеуказанной ссылки эта часть кода должна генерировать события: Events :: JWT_CREATED, Events :: JWT_ENCODED, Events :: AUTHENTICATION_SUCCESS
В тестах с использованием Postman я получаю токен JWT, как показано ниже:
Проблема в том, что я пытаюсь вызвать конечные точки, для которых требуется токен JWT.Например, я звоню в enpoint / companies и получаю:
Как видите, я вставил правильный заголовок: Авторизация: Bearer eyJ0e ...
Ниже я показываю конфигурацию из security.yml:
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
# used to reload user from session & other features (e.g. switch_user)
app_user_provider:
entity:
class: App\Entity\User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
anonymous: true
json_login:
check_path: /auth
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
api:
pattern: ^/
stateless: true
anonymous: true
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
access_control:
- { path: ^/auth, roles: [ IS_AUTHENTICATED_ANONYMOUSLY ] }
- { path: ^/, roles: [IS_AUTHENTICATED_FULLY] }
Моя цель - аутентифицировать пользователя по маршруту: / auth, а затем я хотел бы защитить все остальные маршруты, такие как / audits/ компании и другие по токену JWT, но это не работает.Я не могу найти решение.Буду благодарен за помощь.
С уважением