Files
svc-api-x/v1/lib/TokenGenerator.cfc

57 lines
1.3 KiB
Plaintext

component
output = false
hint = "Генерирует случайные токены с помощью Java SecureRandom."
{
public any function init() {
generator = createObject( "java", "java.security.SecureRandom" )
.getInstance(
javaCast( "string", "SHA1PRNG" ),
javaCast( "string", "SUN" )
)
;
generator.nextBytes( charsetDecode( " ", "utf-8" ) );
reseedAt = getNextReseedAt();
return( this );
}
public string function nextToken( numeric byteCount = 32 ) {
if ( now() >= reseedAt ) {
lock
name = "TokenGenerator.reseedCheck"
type = "exclusive"
timeout = 1
throwOnTimeout = false
{
if ( now() >= reseedAt ) {
reseedAt = getNextReseedAt();
generator.setSeed( generator.generateSeed( javaCast( "int", 32 ) ) );
}
}
}
var byteBuffer = charsetDecode( repeatString( " ", byteCount ), "utf-8" );
generator.nextBytes( byteBuffer );
return( encodeBytes( byteBuffer ) );
}
private string function encodeBytes( required binary bytes ) {
var token = binaryEncode( bytes, "base64" );
token = replace( token, "+", "a", "all" );
token = replace( token, "/", "b", "all" );
token = replace( token, "=", "c", "all" );
return( token );
}
private date function getNextReseedAt() {
return( dateAdd( "h", 1, now() ) );
}
}