ossipesonen / azureadb2ctokenvalidator
简单的 Azure AD B2C 访问令牌验证器
1.0.1
2021-12-13 07:43 UTC
Requires
- php: >=7.4
- firebase/php-jwt: ^5.4
- phpseclib/phpseclib: ^3.0
Requires (Dev)
- pestphp/pest: 1.x-dev
This package is auto-updated.
Last update: 2024-09-13 13:49:08 UTC
README
使用 PHP 实现的 Azure AD B2C 令牌验证简单实现。AD B2C 的技巧是从您的租户密钥中获取公钥,并使用模和指数来计算公钥。为此,我们使用 phpseclib3 的 PublicKeyLoader。
要求
- PHP 7.1
安装
composer require ossipesonen/azureadb2ctokenvalidator
如何使用
<?php use AzureADB2CTokenValidator; $token = ""; $validator = new AzureADB2CTokenValidator\Validator("tenant", "B2C_1_SignUpSignIn", "clientId"); $claims = $validator->validateToken($token);
非常简单。Firebase 的 JWT 包已经验证了令牌的签名和过期。
缓存
Azure 中的公钥每 24 小时旋转一次。强烈建议在附近缓存密钥并使用它,如果 kid(密钥 ID)值仍然匹配的话。您可以通过提供缓存的密钥有效载荷(JSON 格式)来完成此操作。
use AzureADB2CTokenValidator; # Requires all properties to exist $cachedKey = new AzureADB2CTokenValidator\PublicKey(["kid" => "", "..."]); $accessToken = "..."; $verified = new AzureADB2CTokenValidator\Validator("tenant", "B2C_1_SignUpSignIn", "ClientId"); $kid = $verified->getAccessTokenKid($accessToken); if ($kid === $cachedKey->kid) { $claims = $this->validateToken($accessToken, $cachedKey); }
例如,以下是如何使用本地目录来存储密钥(它们是公开的,所以无需担心)
$validator = new AzureADB2CTokenValidator\Validator("tenant", "B2C_1_SignUpSignIn", "ClientId"); $kid = $validator->getAccessTokenKid($jwt); $cachedKid = null; $cachePath = CACHE_PATH . 'auth-token-kid'; if (file_exists($cachePath)) { /** @var string $cachedKid */ $cachedKid = file_get_contents($cachePath); if ($cachedKid) { $cachedKid = json_decode($cachedKid); } } $claims = $validator->validateToken($jwt, ($kid === $cachedKid->kid ? new AzureADB2CTokenValidator\PublicKey((array)$cachedKid) : null)); if ($validator->getPublicKey()) { file_put_contents($cachePath, json_encode((array)$validator->getPublicKey())); }
测试
要运行单元测试,您必须使用 RSA-SHA 256 签名创建一个私钥和公钥对。通常,这可以通过在您的终端中运行 openssl 命令来完成。
openssl rsa -in private.key -pubout -outform PEM -out public.key
一旦您创建了您的密钥,请将它们放入 /tests/resources/keys。不要更改名称(private.key 和 public.key)。此文件夹的内容在 git 中被忽略,并且永远不应提交!
密钥是单元测试的要求。我们不希望针对带有 Azure 生成的密钥的实时 B2C 账户进行测试。我们也没有权限访问那里的私钥,这意味着我们无论如何都无法生成签名。针对已过期的令牌进行测试不会使我们取得太大进展。
可以使用 Pest 运行单元测试
composer run test