Я создал страницу оформления заказа, где можно войти в систему Vue, и во время входа учетные данные отправляются в API с топором ios.
Как получить Symfony для распознать этот логин и также сохранить его в сеансе / готовить ie.
В настоящее время у меня есть следующий код, но я застрял в том, где я должен продолжить. Я смог создать аутентифицированный токен и обнаружил, что GuardHandler должен иметь возможность войти в систему, но я не знаю, как это сделать.
Код ниже:
<?php declare(strict_types=1);
namespace App\Commerce\Controller;
use Contao\FrontendUser;
use Contao\MemberModel;
use Contao\System;
use Contao\Versions;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Router;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder;
use Symfony\Component\Security\Core\Encoder\EncoderFactory;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\InMemoryUserProvider;
use Symfony\Component\Security\Core\User\User;
use Symfony\Component\Security\Core\User\UserChecker;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use function array_key_exists;
/**
* Handles the FrontendUser routes.*
* @Route("/api", defaults={"_scope" = "frontend", "_token_check" = false})
*/
class FrontendUserController extends ApiController
{
/**
* @var string Uniquely identifies the secured area
*/
private $providerKey = 'secured_area';
/**
* @Route("/user/login/", name="userLogin")
* @param Request $request
* @return Response
*/
public function loginAction(Request $request): Response
{
$parameters = null;
$loggedIn = false;
if ($content = $request->getContent()) {
//$parameters = json_decode($content,false);
$parameters = json_decode($content, true);
if (count($parameters)) {
$candidate = MemberModel::findByUsername($parameters['email']);
if ($candidate) {
$loggedIn = password_verify($parameters['password'], $candidate->password);
if ($loggedIn) {
$unauthenticatedToken = new UsernamePasswordToken(
$parameters['email'],
$parameters['password'],
$this->providerKey
);
$userProvider = new InMemoryUserProvider(
[
'emiel.burgman@gmail.com' => [
// password is "123456789"
'password' => '$2y$10$5fBhOQZqBCqaR8YHPL7MCuBZHsS.9hr/.N9ZhPUXwtBVIAndHuBt6',
'roles' => ['ROLE_MEMBER'],
],
]
);
// for some extra checks: is account enabled, locked, expired, etc.
$userChecker = new UserChecker();
$defaultEncoder = new BCryptPasswordEncoder(13);
$encoders = [
User::class => $defaultEncoder,
FrontendUser::class => $defaultEncoder,
];
// an array of password encoders (see below)
$encoderFactory = new EncoderFactory($encoders);
$daoProvider = new DaoAuthenticationProvider(
$userProvider,
$userChecker,
$this->providerKey,
$encoderFactory
);
$authenticatedToken = $daoProvider->authenticate($unauthenticatedToken);
var_dump($authenticatedToken);
$session = System::getContainer()->get('session');
$session->set('_security_'.$this->providerKey, serialize($authenticatedToken));
$session->save();
//$cookie = System::getContainer()->get('cookie');
//$cookie = new Cookie($session->getName(), $session->getId());
//print_r($daoProvider->authenticate($unauthenticatedToken));
//
// var_dump($this->getUser()); exit;
//
// $b = $guardHandler->authenticateUserAndHandleSuccess(
// $authenticatedToken->getUser(), // the User object you just created
// $request,
// $daoProvider, // authenticator whose onAuthenticationSuccess you want to use
// 'main' // the name of your firewall in security.yaml
// );
//var_dump(System::getContainer()->get('security.authorization_checker'));
// var_dump($b);
#var_dump($authenticatedToken);
// var_dump(System::getContainer()->get('contao.security.token_checker')->hasFrontendUser());
$loggedIn = $candidate->id;
}
}
}
}
return new JsonResponse($loggedIn);
}