ossipesonen/azureadb2ctokenvalidator

简单的 Azure AD B2C 访问令牌验证器

1.0.1 2021-12-13 07:43 UTC

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