body { background: #222; color: #ddd; font-family: sans-serif; } a { color: #ddd !important; text-decoration: none; } img { padding: 1em; background: #ccc; border-radius: 10px; } h1 { font-weight: 600; } h2 { font-weight: 100; } pre { user-select: all; }
= $federationPublicKey ?>
db.tuttogare_keys.insertOne(
{
'kid' : 'federation',
'platform' : '{$idInstallazione}',
'public_key' : '{$publicKey}',
}
);
HTML;
}
/**
* Nota bene: richiede che la configurazione del tenant sia configurata
* Questo codice fa quanto segue:
* - Genera se necessario le chiavi di core e log per il tenant attuale
* - Effettua una richiesta di federazione a ProcurePlus
*
* @param boolean $force_generation Se true, forza la rigenerazione delle chiavi
* @return boolean
*/
public static function federate()
{
// Verifichiamo che la chiave di federazione esista
$federationKeyPath = KeyStore::getKeyPath("federation", "global");
if (!file_exists($federationKeyPath . ".rsa.pem") || !file_exists($federationKeyPath . ".rsa.pub")) {
throw new \Exception("Non hai ancora creato una chiave di federazione per questa piattaforma.");
}
// Otteniamo il dominio corrente
$domain = getCurrentDomain();
// Creiamo il keypair di federazione ma conserviamo solo la chiave privata su filesystem.
KeyStore::generateKeyPair("sign", $domain);
// La chiave pubblica rimarrà solo in memoria per essere inviata
$publicKey = KeyStore::get("sign", $domain, "public");
KeyStore::delete("sign", $domain, "public");
// Firmiamo la richiesta con la chiave di federazione
$federationPrivateKey = KeyStore::get("federation", "global", "private");
// Effettuiamo la richiesta a oidc-gateway
$raw_response = HTTP::signedRequest(
"federation-request", // Richiesta di federazione
[
"domain" => $domain, // Il dominio da federare viene specificato nel payload
"public_key" => $publicKey
],
"global", // La richiesta invece parte come globale di piattaforma
$federationPrivateKey // Firmata appunto con la chiave di piattaforma
);
if (valid_json($raw_response, $response, true)) {
if (!isset($response["public_key"])) {
throw new \Exception($raw_response);
}
KeyStore::set("sign", $domain, "public", $response["public_key"]);
return true;
} else {
return false;
}
}
}
}