This document shows how to integrate PPS-PHP with Symfony.
composer require pps-protocol/pps-php
# config/services.yaml
services:
Pps\Storage\StorageInterface:
class: Pps\Storage\PdoStorage
arguments:
- '@database_connection'
Pps\Server\AuthenticationHandler:
arguments:
- '@Pps\Storage\StorageInterface'
Pps\Server\RegistrationHandler:
arguments:
- '@Pps\Storage\StorageInterface'
<?php
namespace App\Controller;
use Pps\Server\AuthenticationHandler;
use Pps\Server\ChallengeGenerator;
use Pps\Util\SystemTimeProvider;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class PpsController extends AbstractController
{
#[Route('/pps/challenge', name: 'pps_challenge', methods: ['GET'])]
public function challenge(): JsonResponse
{
$generator = new ChallengeGenerator(new SystemTimeProvider());
$challenge = $generator->create('example.com');
return $this->json([
'nonce' => $challenge->nonceB64u,
'epoch' => $challenge->epoch,
'qr_payload' => $challenge->qrPayload,
]);
}
#[Route('/pps/verify', name: 'pps_verify', methods: ['POST'])]
public function verify(Request $request, AuthenticationHandler $handler): JsonResponse
{
$result = $handler->verify(
pulseToken: $request->request->get('pulse_token'),
rpId: 'example.com',
nonceB64u: $request->request->get('nonce'),
trustCode: $request->request->get('trust_code')
);
if ($result->honey) {
return $this->json(['status' => 'ok']);
}
if (!$result->ok) {
return $this->json(['status' => 'error'], 401);
}
return $this->json(['status' => 'ok']);
}
}