mirror of
https://github.com/chillerlan/php-qrcode.git
synced 2026-08-17 13:24:06 +00:00
127 lines
3.4 KiB
PHP
127 lines
3.4 KiB
PHP
<?php
|
|
/**
|
|
* authenticator excample
|
|
*
|
|
* @created 09.07.2023
|
|
* @author smiley <smiley@chillerlan.net>
|
|
* @copyright 2023 smiley
|
|
* @license MIT
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
use chillerlan\Authenticator\{Authenticator, AuthenticatorOptionsTrait};
|
|
use chillerlan\Authenticator\Authenticators\AuthenticatorInterface;
|
|
use chillerlan\QRCode\{QRCode, QROptionsTrait};
|
|
use chillerlan\QRCode\Data\QRMatrix;
|
|
use chillerlan\QRCode\Output\QRMarkupSVG;
|
|
use chillerlan\Settings\SettingsContainerAbstract;
|
|
|
|
require_once __DIR__.'/../vendor/autoload.php';
|
|
|
|
// create a new options container on the fly that hosts both, authenticator and qrcode
|
|
$options = new class extends SettingsContainerAbstract{
|
|
use AuthenticatorOptionsTrait, QROptionsTrait;
|
|
};
|
|
|
|
/*
|
|
* AuthenticatorOptionsTrait
|
|
*
|
|
* @see https://github.com/chillerlan/php-authenticator
|
|
*/
|
|
$options->mode = AuthenticatorInterface::TOTP;
|
|
$options->digits = 8;
|
|
$options->algorithm = AuthenticatorInterface::ALGO_SHA512;
|
|
|
|
/*
|
|
* QROptionsTrait
|
|
*/
|
|
$options->version = 7;
|
|
$options->addQuietzone = false;
|
|
$options->outputInterface = QRMarkupSVG::class;
|
|
$options->outputBase64 = false;
|
|
$options->svgAddXmlHeader = false;
|
|
$options->cssClass = 'my-qrcode';
|
|
$options->drawLightModules = false;
|
|
$options->svgUseFillAttributes = false;
|
|
$options->drawCircularModules = true;
|
|
$options->circleRadius = 0.4;
|
|
$options->connectPaths = true;
|
|
$options->keepAsSquare = [
|
|
QRMatrix::M_FINDER_DARK,
|
|
QRMatrix::M_FINDER_DOT,
|
|
QRMatrix::M_ALIGNMENT_DARK,
|
|
];
|
|
$options->svgDefs = '
|
|
<linearGradient id="gradient" x1="1" y2="1">
|
|
<stop id="stop1" offset="0" />
|
|
<stop id="stop2" offset="0.5"/>
|
|
<stop id="stop3" offset="1"/>
|
|
</linearGradient>';
|
|
|
|
|
|
// invoke the worker instances
|
|
$authenticator = new Authenticator($options);
|
|
$qrcode = new QRCode($options);
|
|
|
|
// create a secret and URI, generate the QR Code
|
|
$secret = $authenticator->createSecret(24);
|
|
/** @phan-suppress-next-line PhanDeprecatedFunction */
|
|
$uri = $authenticator->getUri('your authenticator', 'this website');
|
|
$svg = $qrcode->render($uri);
|
|
|
|
// dump the output
|
|
header('Content-type: text/html');
|
|
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
<title>QRCode Authenticator Example</title>
|
|
<style>
|
|
#authenticator-qrcode{
|
|
width: 500px;
|
|
margin: 2em auto;
|
|
}
|
|
#secret{
|
|
box-sizing: border-box;
|
|
display: inline-block;
|
|
width: 100%;
|
|
font-size: 20px;
|
|
}
|
|
|
|
/* styles for the embedded SVG QR code */
|
|
.my-qrcode.qr-svg{
|
|
margin-bottom: 1em;
|
|
background: #eee; /* example for https://github.com/chillerlan/php-qrcode/discussions/199 */
|
|
}
|
|
.my-qrcode.qr-data-dark{
|
|
fill: url(#gradient); /* the gradient defined in the SVG defs */
|
|
}
|
|
|
|
.my-qrcode > defs > #gradient > #stop1{
|
|
stop-color: #D70071;
|
|
}
|
|
.my-qrcode > defs > #gradient > #stop2{
|
|
stop-color: #9C4E97;
|
|
}
|
|
.my-qrcode > defs > #gradient > #stop3{
|
|
stop-color: #0035A9;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="authenticator-qrcode">
|
|
<!-- embed the SVG directly -->
|
|
<?php echo $svg ?>
|
|
<!-- the input that holds the authenticator secret -->
|
|
<input value="<?php echo $secret; ?>" id="secret" type="text" readonly="readonly" onclick="this.select();" />
|
|
<label for="secret">secret</label>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
<?php
|
|
|
|
exit;
|