avn / auth-by-token
0.1.5
2023-06-12 11:42 UTC
Requires
- php: >=7.4
- ext-json: *
- fakerphp/faker: ^1.19
- firebase/php-jwt: ^6.3
- psr/cache: 1.0.1
README
How it works
For Symfony framework
First add services to services.yml
Avn\Security\AuthByToken\CreateTokenAction: null
Avn\Security\AuthByToken\ValidateTokenAction: null
Create route to create token for user and send to user email
/**
* @Route("/api/v1/public/create-token-and-send-by-email", methods={"GET"})
*/
public function authByEmail(
Request $httpRequest,
MailerInterface $mailer,
UserRepository $userRepository,
CreateTokenAction $createTokenAction,
ParameterBagInterface $parameterBag,
UrlGeneratorInterface $urlGenerator
) {
$user = $userRepository->findOneBy(['email' => $httpRequest->toArray()['email'] ]);
if (is_null($user)) {
throw new \Exception(sprintf('User[email: %s] not found', $httpRequest->toArray()['email']));
}
$token = $createTokenAction->execute($user->getCode()->toBase32());
$url = $parameterBag->get('app.host')
. $urlGenerator->generate('app_login_from_email', ['token' => $token])
;
$mailer->send(
(new Email())
->from($parameterBag->get('app.email.from'))
->to($user->getEmail())
->subject('Now you can login')
->text('Here is your link to login')
->html(sprintf('<p>You can login. Just follow the <a href="%s">link</a>.</p>', $url))
);
return new Response();
}
Create route to validate token after user follows the link from email
/**
* @Route("/api/v1/public/login-from-email-link", methods={"POST"}, name="app_login_from_email")
*/
public function register(
Request $httpRequest,
ValidateTokenAction $validateTokenAction,
ParameterBagInterface $parameterBag,
UserRepository $userRepository
) {
$response = new RedirectResponse(
$this->generateUrl('app_dashboard_home')
);
$validateTokenAction->execute(
$httpRequest->get('token'),
function (AuthTokenData $tokenData, array $payload) use ($response, $parameterBag, $userRepository) {
$user = $userRepository->findOneByCodeOrFail($payload['sub']);
$response->headers->setCookie(
new Cookie(
'dashboard-user',
$user->getCode(),
60 * 60 * 12,
'/dashboard',
$parameterBag->get('app.host'),
true,
true
)
);
}
);
return $response;
}