<?php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use FOS\OAuthServerBundle\Model\ClientManagerInterface;
use App\Entity\User;
use App\Entity\Client;
class AuthenticationController extends Controller
{
/**
* Authorization flow route
* @Route("/2le-auth", name="2le-auth")
*/
public function grantAuthorization(Request $request, ClientManagerInterface $clientManager)
{
// To manually create a client:
// bin/console fos:oauth-server:create-client --redirect-uri="https://yourdomain.fr/your_check_path" --grant-type="token" --grant-type="authorization_code"
// Vérifications - pour que la cause des erreurs soit explicite
$client_id = $request->query->get('client_id');
$redirect_uri = urldecode($request->query->get('redirect_uri'));
$state = $request->query->get('state');
if (!$client_id || !$redirect_uri || !$state) {
return $this->redirectError('connect.missing.parameters');
}
// public id = id_randomId -> we get the id
$client = ($this->getDoctrine()->getRepository(Client::class))->findOneBy(['id' => explode("_", $client_id)[0]]);
if (!$client) {
return $this->redirectError('connect.client.not_found');
}
if ($client->getClientId() !== $client_id) {
return $this->redirectError('connect.invalid.client');
}
if (!in_array($redirect_uri, $client->getRedirectUris(), true)) {
return $this->redirectError("Redirection invalide. Vous avez fourni: " . $redirect_uri);
}
//$request->getSession()->set('redirect_uri', $redirect_uri);
// Redirection si tout est bon
return $this->redirect($this->generateUrl('fos_oauth_server_authorize', array(
'client_id' => $client_id,
'redirect_uri' => $redirect_uri,
'response_type' => $request->query->get('response_type'),
'state' => $state,
)));
}
private function redirectError($error_message)
{
return $this->render("security/client-error.html.twig", ["error_message" => $error_message]);
}
/**
* User details - without password
* @Route("/user-details", name="user-details")
*/
public function userDetails(Request $request)
{
$token = $request->query->get('token');
if (!$token) {
return new JsonResponse("No token supplied");
}
$data = $this->getDoctrine()->getRepository(User::class)->getUserDetails($this->getUser()->getId(), $token);
// If this JSON is empty, the token doesn't exist.
if ($data) {
return new JsonResponse($data);
} else {
return new JsonResponse("Token doesn't exist");
}
}
}