一个使用 Google Firebase 令牌的库。您可以使用它来创建自定义令牌并验证 ID 令牌。
使用适用于 PHP 的 Firebase Admin SDK(使用此库)实现更多目标。
请在 SDK 的 GitHub 存储库上了解 Firebase Admin PHP SDK 的未来。
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...
Firebase 管理 SDK 中包含的 ID 令牌验证方法旨在验证来自客户端 SDK 的 ID 令牌,而不是您使用管理 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验证类似于ID Token验证。
有关更多信息,请参阅管理会话 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 ;
}
从生成器和验证器返回的令牌是KreaitFirebaseJWTContractToken
的实例,代表 JWT。显示的输出是示例,并且根据项目身份验证数据库中与给定用户关联的信息而有所不同。
根据 JWT 规范,您可以预期以下有效负载字段始终可用: iss
、 aud
、 auth_time
、 sub
、 iat
、 exp
。其他字段取决于给定帐户的身份验证方法以及项目的身份验证数据库中存储的信息。
$ 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 目前不支持租户。
为了验证 ID 令牌,验证者会调用以获取 Firebase 当前可用的公钥。默认情况下,密钥缓存在内存中。
如果您想更有效地缓存公钥,可以使用 psr/simple-cache 或 psr/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 的安全支持结束时,安全支持也将结束。
版本 | 初始版本 | 支持的 PHP 版本 | 地位 |
---|---|---|---|
5.x | 2023 年 11 月 25 日 | ~8.1.0, ~8.2.0, ~8.3.0 | 积极的 |
4.x | 2022 年 11 月 26 日 | ~8.1.0, ~8.2.0, ~8.3.0 | 安全支持 |
3.x | 2022 年 4 月 25 日 | ^7.4, ^8.0 | 生命终结 |
2.x | 2022 年 1 月 3 日 | ^7.4, ^8.0 | 生命终结 |
1.x | 2017 年 2 月 6 日 | >=5.5 | 生命终结 |
麻省理工学院许可证 (MIT)。请参阅许可证文件以获取更多信息。