uwebpro / okta-jwt-verifier
Okta JWT 的验证库
Requires
- php: ^7.4 || ^8.0
- ext-json: *
- bretterer/iso_duration_converter: ^0.1.0
- illuminate/cache: ^8.83.1 || ^9.0
- nesbot/carbon: ^2.0
- php-http/client-common: ^2.3
- php-http/curl-client: ^2.1
- php-http/discovery: ^1.9
- php-http/httplug: ^2.2
- php-http/message: ^1.8
- psr/http-message: ^1.0
Requires (Dev)
- firebase/php-jwt: ^5.2
- guzzlehttp/psr7: ~2.0.0
- mockery/mockery: ^1.5
- php-http/mock-client: ^1.4
- phpunit/phpunit: ^9.0
- squizlabs/php_codesniffer: ^3.5
- symfony/var-dumper: ^5.1
This package is auto-updated.
Last update: 2024-09-08 14:03:03 UTC
README
通知:我们对Auth0的收购感到兴奋,这将为您带来更好的PHP支持。这个仓库将仅用于安全补丁模式,我们不会添加任何新功能。如果您正在寻找本库不支持的功能,请直接调用API。我们支持的Management API的文档位于此处:[https://developer.okta.com/docs/reference/core-okta-api/](https://developer.okta.com/docs/reference/core-okta-api/)。如有任何问题,请访问[DevForum](https://devforum.okta.com/)。
PHP版本的Okta JWT Verifier
在用户成功认证(通过从用户处获取授权授予或使用Okta API)后,您将获得一个签名的JWT(id_token
和/或 access_token
)。这些访问令牌的常见用途是在Bearer认证头中使用它来让您的应用程序知道进行请求的用户是谁。为了验证这种使用是有效的,您需要了解如何将令牌与Okta进行验证。本指南提供了如何使用Okta的JWT验证库进行验证的示例。
此代码与默认授权服务器不兼容。您必须使用自定义授权服务器。在使用此代码之前,请检查是否如此。
发布状态
此库使用语义版本控制,并遵循Okta的库版本策略。
最新版本始终可在发布页面找到。
安装
可以通过composer安装Okta JWT Verifier。
composer require okta/jwt-verifier
此库需要一个JWT库。我们目前支持firebase/php-jwt版本5.2。您必须安装此库或创建自己的适配器。
composer require firebase/php-jwt ^5.2
要创建自己的适配器,只需在您的类中实现Okta/JwtVerifier/Adaptors/Adaptor
即可。
您还需要安装一个PSR-7兼容的库。我们建议在您的项目中使用guzzlehttp/psr7
。
composer require guzzlehttp/psr7
设置库
要验证JWT,您需要以下几项
- 您的发行者URL
- 您想要验证的JWT字符串
- 在您的脚本中对供应商自动加载文件的访问。
require_once("/vendor/autoload.php"); // This should be replaced with your path to your vendor/autoload.php file $jwtVerifier = (new \Okta\JwtVerifier\JwtVerifierBuilder()) ->setDiscovery(new \Okta\JwtVerifier\Discovery\Oauth) // This is not needed if using oauth. The other option is `new \Okta\JwtVerifier\Discovery\OIDC` ->setAdaptor(new \Okta\JwtVerifier\Adaptors\FirebasePhpJwt) ->setAudience('api://default') ->setClientId('{clientId}') ->setIssuer('https://{yourOktaDomain}.com/oauth2/default') ->build();
缓存
强烈建议缓存密钥以提高性能。您可以将\Psr\SimpleCache\CacheInterface
的实现传递给适配器构造函数。
例如,在laravel中
// note: named parameters are only valid for php >= 8.0 ->setAdaptor(new \Okta\JwtVerifier\Adaptors\FirebasePhpJwt(request: null, leeway: 120, cache: app('cache')->store()))
如果您使用symphony,您可能需要使用适配器:[https://symfony.com.cn/doc/current/components/cache/psr6_psr16_adapters.html](https://symfony.com.cn/doc/current/components/cache/psr6_psr16_adapters.html)
验证访问令牌
在您获得上一节中的$jwtVerifier
和一个成功的登录或授权头中的Bearer token
中的access_token
之后,您需要确保它仍然有效。您需要做的就是调用verifyAccessToken
方法(其中$jwtString
是您的访问令牌的字符串格式)。
$jwt = $jwtVerifier->verifyAccessToken($jwtString);
这将验证您的JWT以下内容
- 令牌过期时间
- 签发时间
- 确保令牌发行者与上面辅助函数中传入的预期值匹配
- 确保令牌受众与上面辅助函数中传入的预期值匹配
verify方法的返回结果是一个Jwt
对象,其中包含一些辅助方法供您使用
dump($jwt); //Returns instance of \Okta\JwtVerifier\JWT dump($jwt->toJson()); // Returns Claims as JSON Object dump($jwt->getClaims()); // Returns Claims as they come from the JWT Package used dump($jwt->getIssuedAt()); // returns Carbon instance of issued at time dump($jwt->getIssuedAt(false)); // returns timestamp of issued at time dump($jwt->getExpirationTime()); //returns Carbon instance of Expiration Time dump($jwt->getExpirationTime(false)); //returns timestamp of Expiration Time
验证Id令牌
$jwt = $jwtVerifier->verifyIdToken($jwtString);
这将验证您的JWT以下内容
- 令牌过期时间
- 签发时间
- 确保令牌发行者与上面辅助函数中传入的预期值匹配
- 确保令牌受众与上面辅助函数中传入的预期值匹配
verify方法的返回结果是一个Jwt
对象,其中包含一些辅助方法供您使用
dump($jwt); //Returns instance of \Okta\JwtVerifier\JWT dump($jwt->toJson()); // Returns Claims as JSON Object dump($jwt->getClaims()); // Returns Claims as they come from the JWT Package used dump($jwt->getIssuedAt()); // returns Carbon instance of issued at time dump($jwt->getIssuedAt(false)); // returns timestamp of issued at time dump($jwt->getExpirationTime()); //returns Carbon instance of Expiration Time dump($jwt->getExpirationTime(false)); //returns timestamp of Expiration Time
需要帮助吗?
如果在使用SDK时遇到问题,您可以
- 在Okta开发者论坛上提问
- 在此GitHub上发布问题
- 使用OAuth 2.0令牌
结论
以上是在本地验证访问令牌的基本步骤。这些步骤并没有直接绑定到框架上,因此您可以将okta/okta-jwt
插入您选择的框架中。