kreait/firebase-tokens

用于处理Firebase令牌的库

5.2.0 2024-08-16 23:28 UTC

README

一个用于处理Google Firebase令牌的库。您可以使用它来创建自定义令牌验证ID令牌

通过使用此库的PHP Firebase Admin SDK(用于PHP)来获得更多功能。

Current version Supported PHP version Monthly Downloads Total Downloads Tests Sponsor

Firebase Admin PHP SDK的未来

请阅读Firebase Admin PHP SDK的GitHub仓库中的关于其未来的信息。

安装

composer require kreait/firebase-tokens

简单用法

创建自定义令牌

关于自定义令牌是什么以及如何使用的更多信息,可以在Google官方文档中找到。

<?php

use Kreait\Firebase\JWT\CustomTokenGenerator;

$clientEmail = '...';
$privateKey = '...';

$generator = CustomTokenGenerator::withClientEmailAndPrivateKey($clientEmail, $privateKey);
$token = $generator->createCustomToken('uid', ['first_claim' => 'first_value' /* ... */]);

echo $token;
// Output: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.e...

验证ID令牌

包含在Firebase Admin SDK中的ID令牌验证方法旨在验证来自客户端SDK的ID令牌,而不是您使用Admin SDK创建的自定义令牌。有关更多信息,请参阅身份验证令牌

<?php

use Kreait\Firebase\JWT\Error\IdTokenVerificationFailed;
use Kreait\Firebase\JWT\IdTokenVerifier;

$projectId = '...';
$idToken = 'eyJhb...'; // An ID token given to your backend by a Client application

$verifier = IdTokenVerifier::createWithProjectId($projectId);

try {
    $token = $verifier->verifyIdToken($idToken);
} catch (IdTokenVerificationFailed $e) {
    echo $e->getMessage();
    // Example Output:
    // The value 'eyJhb...' is not a verified ID token:
    // - The token is expired.
    exit;
}

try {
    $token = $verifier->verifyIdTokenWithLeeway($idToken, $leewayInSeconds = 10000000);
} catch (IdTokenVerificationFailed $e) {
    print $e->getMessage();
    exit;
}

验证会话cookie

会话cookie验证类似于ID令牌验证。

有关更多信息,请参阅管理会话cookie

<?php

use Kreait\Firebase\JWT\Error\SessionCookieVerificationFailed;
use Kreait\Firebase\JWT\SessionCookieVerifier;

$projectId = '...';
$sessionCookie = 'eyJhb...'; // A session cookie given to your backend by a Client application

$verifier = SessionCookieVerifier::createWithProjectId($projectId);

try {
    $token = $verifier->verifySessionCookie($sessionCookie);
} catch (SessionCookieVerificationFailed $e) {
    echo $e->getMessage();
    // Example Output:
    // The value 'eyJhb...' is not a verified ID token:
    // - The token is expired.
    exit;
}

try {
    $token = $verifier->verifySessionCookieWithLeeway($sessionCookie, $leewayInSeconds = 10000000);
} catch (SessionCookieVerificationFailed $e) {
    print $e->getMessage();
    exit;
}

令牌

生成器和验证器返回的令牌是\Kreait\Firebase\JWT\Contract\Token的实例,代表一个JWT。显示的输出是示例,并且取决于您的项目认证数据库中给定用户的关联信息。

根据JWT规范,您可以期望以下载荷字段始终可用:issaudauth_timesubiatexp。其他字段取决于给定账户的认证方法和您项目认证数据库中存储的信息。

$token = $verifier->verifyIdToken('eyJhb...'); // An ID token given to your backend by a Client application

echo json_encode($token->headers(), JSON_PRETTY_PRINT);
// {
//     "alg": "RS256",
//     "kid": "e5a91d9f39fa4de254a1e89df00f05b7e248b985",
//     "typ": "JWT"
// }                                                   

echo json_encode($token->payload(), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// {
//     "name": "Jane Doe",
//     "picture": "https://domain.tld/picture.jpg",
//     "iss": "https://securetoken.google.com/your-project-id",
//     "aud": "your-project-id",
//     "auth_time": 1580063945,
//     "user_id": "W0IturDwy4TYTmX6ilkd2ZbAXRp2",
//     "sub": "W0IturDwy4TYTmX6ilkd2ZbAXRp2",
//     "iat": 1580063945,
//     "exp": 1580067545,
//     "email": "[email protected]",
//     "email_verified": true,
//     "phone_number": "+1234567890",
//     "firebase": {
//         "identities": {
//             "phone": [
//                 "+1234567890"
//             ],
//             "email": [
//                 "[email protected]"
//             ]
//         },
//         "sign_in_provider": "custom"
//     }
// }

echo $token->toString();
// eyJhb...

$tokenString = (string) $token; // string
// eyJhb...

租户感知

您可以为特定的租户创建自定义令牌。

<?php

use Kreait\Firebase\JWT\CustomTokenGenerator;

$generator = CustomTokenGenerator::withClientEmailAndPrivateKey('...', '...');

$tenantAwareGenerator = $generator->withTenantId('my-tenant-id');

同样,您还可以验证ID令牌是在特定租户的范围内发布的。

<?php

use Kreait\Firebase\JWT\IdTokenVerifier;

$verifier = IdTokenVerifier::createWithProjectId('my-project-id');

$tenantAwareVerifier = $verifier->withExpectedTenantId('my-tenant-id');

会话cookie目前不支持租户。

高级用法

从Google安全令牌存储缓存结果

为了验证ID令牌,验证器会调用以获取Firebase当前可用的公钥。默认情况下,这些密钥在内存中缓存。

如果您想更有效地缓存公钥,您可以初始化验证器,使用psr/simple-cachepsr/cache的实现来减少对Google服务器的HTTP请求。

以下是一个使用 Symfony 缓存组件 的示例。

use Kreait\Firebase\JWT\IdTokenVerifier;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

$cache = new FilesystemAdapter();

$verifier = IdTokenVerifier::createWithProjectIdAndCache($projectId, $cache);

支持的版本

仅支持最新版本。

早先版本在它们的最低 PHP 要求仍然获得安全修复的情况下,将继续收到安全修复。例如,当某个版本支持 PHP 7.4 和 PHP 8.0 时,当 PHP 7.4 的安全支持结束时,安全支持也将结束。

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件