This document shows how to integrate PPS-PHP with Slim Framework.
composer require slim/slim slim/psr7 pps-protocol/pps-php
<?php
use Pps\Server\AuthenticationHandler;
use Pps\Server\ChallengeGenerator;
use Pps\Storage\PdoStorage;
use Pps\Util\SystemTimeProvider;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$rpId = 'example.com';
$app->get('/pps/challenge', function (Request $request, Response $response) use ($rpId) {
$generator = new ChallengeGenerator(new SystemTimeProvider());
$challenge = $generator->create($rpId);
$response->getBody()->write(json_encode([
'nonce' => $challenge->nonceB64u,
'epoch' => $challenge->epoch,
'qr_payload' => $challenge->qrPayload,
]));
return $response->withHeader('Content-Type', 'application/json');
});
$app->post('/pps/verify', function (Request $request, Response $response) use ($rpId) {
$body = $request->getParsedBody();
$pdo = new PDO('sqlite:/tmp/pps.sqlite');
$storage = new PdoStorage($pdo);
$handler = new AuthenticationHandler($storage, new SystemTimeProvider());
$result = $handler->verify(
pulseToken: $body['pulse_token'] ?? '',
rpId: $rpId,
nonceB64u: $body['nonce'] ?? null,
trustCode: $body['trust_code'] ?? null
);
$response->getBody()->write(json_encode([
'status' => $result->ok ? 'ok' : 'error',
]));
return $response
->withHeader('Content-Type', 'application/json')
->withStatus($result->ok ? 200 : 401);
});
$app->run();