uwebpro/okta-jwt-verifier

Okta JWT 的验证库

1.4.0 2022-03-03 15:48 UTC

This package is auto-updated.

Last update: 2024-09-08 14:03:03 UTC


README

Packagist License Support

通知:我们对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,您需要以下几项

  1. 您的发行者URL
  2. 您想要验证的JWT字符串
  3. 在您的脚本中对供应商自动加载文件的访问。
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/okta-jwt插入您选择的框架中。