diff --git a/composer.json b/composer.json index 3332066..4eafa37 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,6 @@ ], "require": { "php": "^8.1", - "ext-openssl": "*", "symfony/framework-bundle": "^6.4|^7.4|^8.0", "doctrine/common": "^3.0", "doctrine/orm": "^3.0", diff --git a/config/services.xml b/config/services.xml index 5fde9fb..447147a 100644 --- a/config/services.xml +++ b/config/services.xml @@ -26,8 +26,8 @@ - prototype('array') ->children() ->scalarNode('generator') - ->defaultValue('yokai_security_token.open_ssl_token_generator') + ->defaultValue('yokai_security_token.bin2hex_token_generator') ->end() ->scalarNode('duration') ->defaultValue('+2 days') diff --git a/src/Generator/Bin2HexTokenGenerator.php b/src/Generator/Bin2HexTokenGenerator.php new file mode 100644 index 0000000..35b1011 --- /dev/null +++ b/src/Generator/Bin2HexTokenGenerator.php @@ -0,0 +1,30 @@ + + */ +final class Bin2HexTokenGenerator implements TokenGeneratorInterface +{ + public function __construct( + /** + * @var int<1, max> The token length + */ + private readonly int $length = 64, + ) { + } + + public function generate(): string + { + $byteLength = (int)\ceil($this->length / 2); + \assert($byteLength >= 1); + $hex = \bin2hex(\random_bytes($byteLength)); + + return \substr($hex, 0, $this->length); + } +} diff --git a/src/Generator/OpenSslTokenGenerator.php b/src/Generator/OpenSslTokenGenerator.php deleted file mode 100644 index 05d5cdc..0000000 --- a/src/Generator/OpenSslTokenGenerator.php +++ /dev/null @@ -1,28 +0,0 @@ - - */ -final class OpenSslTokenGenerator implements TokenGeneratorInterface -{ - public function __construct( - private readonly int $length = 32, - ) { - if (!\function_exists('openssl_random_pseudo_bytes')) { - throw new LogicException('The extension "openssl" is required to use "open ssl" token generator.'); - } - } - - public function generate(): string - { - return \rtrim(\strtr(\base64_encode(\openssl_random_pseudo_bytes($this->length)), '+/', '-_'), '='); - } -} diff --git a/tests/Generator/Bin2HexTokenGeneratorTest.php b/tests/Generator/Bin2HexTokenGeneratorTest.php new file mode 100644 index 0000000..98aebff --- /dev/null +++ b/tests/Generator/Bin2HexTokenGeneratorTest.php @@ -0,0 +1,33 @@ +generate(); + self::assertSame($length, \mb_strlen($value)); + } + + self::assertSame(\array_unique($tokens), $tokens); + } + + public static function length(): \Generator + { + yield [64]; + yield [10]; + yield [11]; + } +} diff --git a/tests/Generator/OpenSslTokenGeneratorTest.php b/tests/Generator/OpenSslTokenGeneratorTest.php deleted file mode 100644 index a82e967..0000000 --- a/tests/Generator/OpenSslTokenGeneratorTest.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * phpcs:ignoreFile PSR1.Methods.CamelCapsMethodName.NotCamelCaps - */ -final class OpenSslTokenGeneratorTest extends TestCase -{ - public function test_it_generate_unique_token(): void - { - $generator = new OpenSslTokenGenerator(); - - $tokens = []; - - for ($i = 1; $i <= 1000; $i++) { - $tokens[] = $generator->generate(); - } - - self::assertSame(\array_unique($tokens), $tokens); - } -}