added the ability to change the algorithm used to generate the token strings

This commit is contained in:
Joseph Deray 2014-03-11 12:39:09 -04:00
parent 54ffa58e7b
commit 901aab9deb
2 changed files with 41 additions and 10 deletions

View File

@ -11,11 +11,16 @@
namespace League\OAuth2\Server\Util; namespace League\OAuth2\Server\Util;
use League\OAuth2\Server\Util\KeyAlgorithm\DefaultAlgorithm;
use League\OAuth2\Server\Util\KeyAlgorithm\KeyAlgorithmInterface;
/** /**
* SecureKey class * SecureKey class
*/ */
class SecureKey class SecureKey
{ {
protected static $algorithm;
/** /**
* Generate a new unique code * Generate a new unique code
* @param integer $len Length of the generated code * @param integer $len Length of the generated code
@ -23,18 +28,27 @@ class SecureKey
*/ */
public static function make($len = 40) public static function make($len = 40)
{ {
// We generate twice as many bytes here because we want to ensure we have return self::getAlgorithm()->make($len);
// enough after we base64 encode it to get the length we need because we }
// take out the "/", "+", and "=" characters.
$bytes = openssl_random_pseudo_bytes($len * 2, $strong);
// We want to stop execution if the key fails because, well, that is bad. /**
if ($bytes === false || $strong === false) { * @param KeyAlgorithmInterface $algorithm
// @codeCoverageIgnoreStart */
throw new \Exception('Error Generating Key'); public static function setAlgorithm(KeyAlgorithmInterface $algorithm)
// @codeCoverageIgnoreEnd {
self::$algorithm = $algorithm;
}
/**
* @return KeyAlgorithmInterface
*/
public static function getAlgorithm()
{
if (!self::$algorithm) {
self::$algorithm = new DefaultAlgorithm();
} }
return substr(str_replace(array('/', '+', '='), '', base64_encode($bytes)), 0, $len); return self::$algorithm;
} }
} }

View File

@ -12,4 +12,21 @@ class Secure_Key_test extends PHPUnit_Framework_TestCase
$this->assertTrue($v1 !== $v2); $this->assertTrue($v1 !== $v2);
$this->assertEquals(50, strlen($v3)); $this->assertEquals(50, strlen($v3));
} }
public function test_make_with_different_algorithm()
{
$algorithm = $this->getMock('League\OAuth2\Server\Util\KeyAlgorithm\KeyAlgorithmInterface');
$result = 'dasdsdsaads';
$algorithm
->expects($this->once())
->method('make')
->with(11)
->will($this->returnValue($result))
;
League\OAuth2\Server\Util\SecureKey::setAlgorithm($algorithm);
$this->assertSame($algorithm, League\OAuth2\Server\Util\SecureKey::getAlgorithm());
$this->assertEquals($result, League\OAuth2\Server\Util\SecureKey::make(11));
}
} }