1. Go to this page and download the library: Download digitalcz/openid-connect 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/ */
use DigitalCz\OpenIDConnect\OidcFactory;
use DigitalCz\OpenIDConnect\Config\IssuerMetadata;
use Symfony\Component\HttpClient\HttpClient;
$httpClient = HttpClient::create();
$issuerMetadata = new IssuerMetadata([
'authorization_endpoint' => 'https://auth.example.com/authorize',
'token_endpoint' => 'https://auth.example.com/token',
'jwks_uri' => 'https://auth.example.com/.well-known/jwks.json',
'issuer' => 'https://auth.example.com',
]);
$oidc = OidcFactory::create(
httpClient: $httpClient,
issuer: $issuerMetadata,
clientId: 'my-client-id',
clientSecret: 'my-client-secret',
redirectUri: 'https://myapp.example.com/callback',
);
$authorizationCode = $oidc->authorizationCode();
// createAuthorizationUrl() auto-generates cryptographically random state, nonce, and PKCE
// code_verifier. Retrieve them from the result and persist in session before redirecting.
$result = $authorizationCode->createAuthorizationUrl();
// IMPORTANT: Store security parameters in session before redirecting.
// - state: must be verified on callback to prevent CSRF attacks
// - nonce: must be passed to fetchTokens() to validate the ID token
// - codeVerifier: must be passed to fetchTokens() when PKCE is enabled (default)
session_start();
$_SESSION['oauth_state'] = $result->state();
$_SESSION['oauth_nonce'] = $result->nonce();
$_SESSION['oauth_code_verifier'] = $result->codeVerifier();
// Redirect user to $result->url()
session_start();
// IMPORTANT: Always validate the state parameter before proceeding.
// A missing or mismatched state indicates a potential CSRF attack.
if (
empty($_GET['state'])
|| !isset($_SESSION['oauth_state'])
|| !hash_equals($_SESSION['oauth_state'], $_GET['state'])
) {
throw new RuntimeException('Invalid state parameter - possible CSRF attack.');
}
$code = $_GET['code'];
$tokens = $authorizationCode->fetchTokens(
code: $code,
nonce: $_SESSION['oauth_nonce'],
codeVerifier: $_SESSION['oauth_code_verifier'],
);
// Clear one-time security parameters from session
unset($_SESSION['oauth_state'], $_SESSION['oauth_nonce'], $_SESSION['oauth_code_verifier']);
echo "Access Token: " . $tokens->accessToken() . PHP_EOL;
echo "ID Token: " . $tokens->idToken() . PHP_EOL;
echo "Refresh Token: " . $tokens->refreshToken() . PHP_EOL;