malenki/token-generator

简单的基于十六进制的令牌生成器,可用于许多任务,如slug、令牌等。

dev-master 2019-06-28 21:42 UTC

This package is auto-updated.

Last update: 2024-08-29 05:07:01 UTC


README

为什么?

为了生成指定字节长度的随机十六进制字符串(默认)。

非常基本的示例

use Malenki\TokenGenerator\TokenGenerator;
echo new TokenGenerator(); // yes, __toString available

// a560bd176d5961817050a4c09408b156952d8d53bd7602d28f2844b1faa2995c

这灵感来源于 Akam 在 php.net 网站上提供的示例: https://php.ac.cn/manual/fr/function.random-bytes.php#118932

如何获取它?

使用 composer 是一个好方法。

composer require malenki/token-generator

玩转它

起始字节

在构造函数中,您可以指定所需的字节长度。如果没有指定,默认为 32。

use Malenki\TokenGenerator\TokenGenerator;

$tg = new TokenGenerator(4);
echo $tg->run(); // the method computing token and returning it

// 791f4dd3 by example

但请注意,这并不是输出长度。例如,字节长度为 4 的结果默认为具有 8 个字节的输出,因为默认的口味输出十六进制字符串。

口味

内部,此生成器使用 3 种不同的口味来构建令牌,按此顺序加载:

  • 随机 口味定义在 Malenki\TokenGenerator\Flavor\RandomFlavor
  • OpenSSL 口味定义在 Malenki\TokenGenerator\Flavor\OpensslFlavor
  • Mcrypt 口味定义在 Malenki\TokenGenerator\Flavor\McryptFlavor(注意:如果您的 PHP 版本为 7.2 或更高,则不可用)

默认情况下,它会检查第一个(随机),是否可以在您的系统上运行,并运行它。如果无法运行,则测试第二个(OpenSSL),依此类推。

格式化器

格式化器允许您具有不同的输出令牌类型。因此,默认情况下,使用的格式化器是 hex(简称)定义在 Malenki\TokenGenerator\Formater\HexFormater(FQCN)中。

格式化器包括:

  • hex 以十六进制字符串的形式获取令牌
  • alpha 以从 az 的 ASCII 字母组成的令牌
  • num 以数字组成的令牌
  • base64 以从其起始生成的字节为基础 64 编码的字符串获取令牌

您可以通过将格式化器的简称传递给 TokenGenerator::run() 方法来选择格式化器。示例

$tg = new TokenGenerator(2);
printf('A token using `alpha` formater: "%s"'.PHP_EOL, $tg->run('alpha'));
// A token using `alpha` formater: "rkv"
printf('A token using `num` formater: "%s"'.PHP_EOL, $tg->run('num'));
// A token using `num` formater: "60286"
printf('A token using `base64` formater: "%s"'.PHP_EOL, $tg->run('base64'));
// A token using `base64` formater: "8Yk="
printf('A token using `hex` formater: "%s"'.PHP_EOL, $tg->run('hex'));
// A token using `hex` formater: "971b"

令牌对象

生成器返回的不是简单字符串,而是一个来自 Token 类的对象,该对象具有 __toString() 以在字符串上下文中获取十六进制格式。

此对象包含有关

  • 口味 用于构建它
  • 格式化器 用于格式化它
  • 字节长度 选择用于生成它
  • 原始字节字符串 用于获取它
  • 它的有效性,如果用于创建它的自定义口味有一些错误(通常是空字符串)

示例

$tg = new TokenGenerator(2);
$token = $tg->run();

echo $token->getOriginalBytesLength() . PHP_EOL;
echo $token->getUsedFlavor() . PHP_EOL;
echo $token->getUsedFormater() . PHP_EOL;
echo $token->get() . PHP_EOL;
echo ($token->valid() ?  'yes' : 'no') . PHP_EOL;
echo $token . PHP_EOL;

// 2
// Malenki\TokenGenerator\Flavor\RandomFlavor
// Malenki\TokenGenerator\Formater\HexFormater
// 4b31
// yes
// 4b31

添加您自己的口味

好的,你喜欢这个生成器,但你想令牌有一些特定的构建规则。

您可以创建自己的口味并使用它。

首先 创建一个继承自 Malenki\TokenGenerator\Flavor\Flavor 抽象类的口味类。

此抽象类具有您必须实现的方法

abstract class Flavor
{
    abstract public function valide() : bool; // can load on the system?
    abstract public function generate(int $length) : string; // generate the token
}

让我们将您的类 FQCN 定义为 Some\Namespace\YourFlavor

其次,在实例化时声明它,因此,它知道它的存在并可以将其使用。

use Malenki\TokenGenerator\TokenGenerator;
use Some\Namespace\YourFlavor;

$tg = new TokenGenerator(32, new YourFlavor);
echo $tg->run();

然后,您就可以使用自己的口味来生成第一个令牌了!

添加您自己的格式化器

和创建自定义口味一样简单。

只需实现抽象类 Malenki\TokenGenerator\Formater\Formater

abstract class Formater
{
    abstract public function format(string $original) : string;
}

例如,您的格式化器可能包括在十六进制部分之前包含一个日期字符串

use Malenki\TokenGenerator\Formater\Formater;

class CustomFormater extends Formater
{
    public function format(string $original) : string
    {
        $dt = new \DateTime();
        $dtStr = $dt->format('Y-m-d-');
        $preToken = bin2hex($original);

        return $dtStr.$preToken;
    }
}

现在,将其声明给生成器

$tg = new TokenGenerator(2);
$tg->addFormater('custom', CustomFormater::class);
echo $tg->run('custom'). PHP_EOL;

// 2019-06-28-ea15

简单,不是吗?