1. Go to this page and download the library: Download simplesamlphp/openid library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
simplesamlphp / openid example snippets
declare(strict_types=1);
namespace Your\Super\App;
use SimpleSAML\OpenID\Algorithms\SignatureAlgorithmBag;
use SimpleSAML\OpenID\Algorithms\SignatureAlgorithmEnum;
use SimpleSAML\OpenID\SupportedAlgorithms;
use Psr\SimpleCache\CacheInterface;
use Psr\Log\LoggerInterface;
use SimpleSAML\OpenID\Federation;
use Symfony\Component\HttpFoundation\Response;
class Test
{
public function __construct(
protected CacheInterface $cache,
protected LoggerInterface $logger,
) {
}
public function __invoke(): Response
{
// Instantiation example by using default options.
// * 'RS256' as supported algorithm
// * no caching support (not recommended for production environment)
// * no logging support
$federationTools = new Federation();
// Instantiation example by injecting some of the dependencies
// Define the supported signature algorithms:
$supportedAlgorithms = new SupportedAlgorithms(
new SignatureAlgorithmBag(
SignatureAlgorithmEnum::RS256,
// ... if needed, add other supported signature algorithms here
)
);
// Define the maximum cache Time-To-Live (TTL) for federation artifacts. This will be used together with 'exp'
// claim to resolve the maximum cache time for trust chains, entity statements, etc.
$maxCacheDuration = new DateInterval('PT6H');
// Instantiate by injecting own options / dependencies:
$federationTools = new Federation(
supportedAlgorithms: $supportedAlgorithms,
maxCacheDuration: $maxCacheDuration,
cache: $this->cache, // \Psr\SimpleCache\CacheInterface
logger: $this->logger, // \Psr\Log\LoggerInterface
);
// Continue with using available tools ...
return new Response();
}
}
// ...
try {
/** @var \SimpleSAML\OpenID\Federation\TrustChain $trustChain */
/** @var \SimpleSAML\OpenID\Federation\TrustChainBag $trustChainBag */
// Simply get the shortest available chain.
$trustChain = $trustChainBag->getShortest();
// Get the shortest chain, but take into account the Trust Anchor priority.
$trustChain = $trustChainBag->getShortestByTrustAnchorPriority(
'https://other-trust-achor-id.example.org/', // Get chain for this Trust Anchor even if the chain is longer.
'https://trust-achor-id.example.org/',
);
} catch (\Throwable $exception) {
$this->logger->error('Could not resolve trust chain: ' . $exception->getMessage())
return;
}
// ...
$entityType = \SimpleSAML\OpenID\Codebooks\EntityTypesEnum::OpenIdRelyingParty;
try {
/** @var \SimpleSAML\OpenID\Federation\TrustChain $trustChain */
$metadata = $trustChain->getResolvedMetadata($entityType);
} catch (\Throwable $exception) {
$this->logger->error(
sprintf(
'Error resolving metadata for entity type %s. Error: %s.',
$entityType->value,
$exception->getMessage(),
),
);
return;
}
if (is_null($metadata)) {
$this->logger->error(
sprintf(
'No metadata available for entity type %s.',
$entityType->value,
),
);
return;
}
// ...
// Get entity statement for the resolved Trust Anchor:
/** @var \SimpleSAML\OpenID\Federation\TrustChain $trustChain */
$trustAnchorConfigurationStatement = $trustChain->getResolvedTrustAnchor();
// Get data that you need to prepare appropriate public keys, for example, the entity ID:
$trustAnchorEntityId = $trustAnchorConfigurationStatement->getIssuer();
// Prepare JWKS array containing Trust Anchor public keys that you have acquired in secure out-of-band way ...
/** @var array $trustAnchorJwks */
try {
$trustAnchorConfigurationStatement->verifyWithKeySet($trustAnchorJwks);
} catch (\Throwable $exception) {
$this->logger->error('Could not verify trust anchor configuration statement signature: ' .
$exception->getMessage());
return;
}
// ...
/** @var \SimpleSAML\OpenID\Federation $federationTools */
// Trust Mark Type that you want to fetch.
$trustMarkType = 'https://example.com/trust-mark/member';
// ID of Subject for which to fetch the Trust Mark.
$subjectId = 'https://leaf-entity.org'
// ID of the Trust Mark Issuer from which to fetch the Trust Mark.
$trustMarkIssuerEntityId = 'https://trust-mark-issuer.org'
try {
// First, fetch the Configuration Statement for Trust Mark Issuer.
$trustMarkIssuerConfigurationStatement = $this->federation
->entityStatementFetcher()
->fromCacheOrWellKnownEndpoint($trustMarkIssuerEntityId);
// Fetch the Trust Mark from Issuer.
$trustMarkEntity = $federationTools->trustMarkFetcher()->fromCacheOrFederationTrustMarkEndpoint(
$trustMarkType,
$subjectId,
$trustMarkIssuerConfigurationStatement
);
} catch (\Throwable $exception) {
$this->logger->error('Trust Mark fetch failed. Error was: ' . $exception->getMessage());
return;
}
// ...
/** @var \SimpleSAML\OpenID\Federation $federationTools */
/** @var \SimpleSAML\OpenID\Federation\TrustChain $trustChain */
// Trust Mark Type that you want to validate.
$trustMarkType = 'https://example.com/trust-mark/member';
// Leaf for which you want to validate the Trust Mark with ID above.
$leafEntityConfigurationStatement = $trustChain->getResolvedLeaf();
// Trust Anchor under which you want to validate Trust Mark.
$trustAnchorConfigurationStatement = $trustChain->getResolvedTrustAnchor();
try {
// Example which queries cache for previously validated Trust Mark, and does formal validation if not cached.
$federationTools->trustMarkValidator()->fromCacheOrDoForTrustMarkType(
$trustMarkType,
$leafEntityConfigurationStatement,
$trustAnchorConfigurationStatement,
$expectedJwtType = \SimpleSAML\OpenID\Codebooks\JwtTypesEnum::TrustMarkJwt,
);
// Example which always does formal validation (does not use cache).
$federationTools->trustMarkValidator()->doForTrustMarkType(
$trustMarkType,
$leafEntityConfigurationStatement,
$trustAnchorConfigurationStatement,
$expectedJwtType = \SimpleSAML\OpenID\Codebooks\JwtTypesEnum::TrustMarkJwt,
);
} catch (\Throwable $exception) {
$this->logger->error('Trust Mark validation failed. Error was: ' . $exception->getMessage());
return;
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.