pps-php

Symfony Integration

This document shows how to integrate PPS-PHP with Symfony.


Install

composer require pps-protocol/pps-php

Service Definition

# 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'

Controller

<?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']);
    }
}