pps-php

Slim Integration

This document shows how to integrate PPS-PHP with Slim Framework.


Install

composer require slim/slim slim/psr7 pps-protocol/pps-php

Routes

<?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();