1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- <?php
- /*
- * This file is part of the FOSUserBundle package.
- *
- * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace FOS\UserBundle\Util;
- use Symfony\Component\HttpKernel\Log\LoggerInterface;
- class TokenGenerator implements TokenGeneratorInterface
- {
- private $logger;
- private $useOpenSsl;
- public function __construct(LoggerInterface $logger = null)
- {
- $this->logger = $logger;
- // determine whether to use OpenSSL
- if (defined('PHP_WINDOWS_VERSION_BUILD') && version_compare(PHP_VERSION, '5.3.4', '<')) {
- $this->useOpenSsl = false;
- } elseif (!function_exists('openssl_random_pseudo_bytes')) {
- if (null !== $this->logger) {
- $this->logger->notice('It is recommended that you enable the "openssl" extension for random number generation.');
- }
- $this->useOpenSsl = false;
- } else {
- $this->useOpenSsl = true;
- }
- }
- public function generateToken()
- {
- return rtrim(strtr(base64_encode($this->getRandomNumber()), '+/', '-_'), '=');
- }
- private function getRandomNumber()
- {
- $nbBytes = 32;
- // try OpenSSL
- if ($this->useOpenSsl) {
- $bytes = openssl_random_pseudo_bytes($nbBytes, $strong);
- if (false !== $bytes && true === $strong) {
- return $bytes;
- }
- if (null !== $this->logger) {
- $this->logger->info('OpenSSL did not produce a secure random number.');
- }
- }
- return hash('sha256', uniqid(mt_rand(), true), true);
- }
- }
|