cakephp 如何从Microsoft OAuth2解码访问令牌

f87krz0w  于 2022-11-24  发布在  PHP
关注(0)|答案(1)|浏览(203)

我正在使用CakePHP 4.1构建Web应用程序。
并且它具有来自Microsoft活动目录(OAuth2)的授权。
我要做的是解码访问令牌,并在它过期时重定向到Microsoft登录页面。
这样我就可以从授权中得到令牌了。
https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/authorize?client_id=CLIENT_ID&response_type=token&redirect_uri=LOGIN_REDIRECT_URI&response_mode=form_post&scope=offline_access https://graph.microsoft.com/.default'
我尝试使用firebase/jwt解码,但我不确定什么应该是$key

JWT::decode($accessToken, $key, array('RS256'))

如果在jwt.ms中输入标记,则可以获得解码结果
我没有任何特殊的claims,所以$key应该是plain
而且我想知道有没有另一种解码jwt的方法。

yxyvkwin

yxyvkwin1#

Firebase JWT仅支持使用签名验证进行解码,因此始终需要密钥。
您可以手动解码令牌,它只是base64的JSON,但是如果没有验证,就无法知道信息是否是伪造的,所以我不会相信通过这种方式获得的任何信息,甚至包括过期时间。
通常,OAuth API会在访问令牌请求的响应中返回过期时间(Microsoft Identity Platform API也是如此),您的应用可以将其与令牌一起存储,并用于检查可能的令牌过期。
在收到来自API的无效令牌错误时进行刷新通常也是一种选择,这样您就完全不需要关心过期时间。
我当然会建议任何这些选择信任任意的客户端数据。
话虽如此,如果您仍然希望令牌提供未经验证的过期时间,只需执行Firebase JWT内部执行的操作:

$tks = \explode('.', $accessToken);
if (\count($tks) != 3) {
    throw new \UnexpectedValueException('Wrong number of segments');
}
list($headb64, $bodyb64, $cryptob64) = $tks;
if (null === ($header = JWT::jsonDecode(JWT::urlsafeB64Decode($headb64)))) {
    throw new \UnexpectedValueException('Invalid header encoding');
}
if (null === $payload = JWT::jsonDecode(JWT::urlsafeB64Decode($bodyb64))) {
    throw new \UnexpectedValueException('Invalid claims encoding');
}
if (false === ($sig = JWT::urlsafeB64Decode($cryptob64))) {
    throw new \UnexpectedValueException('Invalid signature encoding');
}

http://github.com/firebase/php-jwt/blob/v5.2.0/src/JWT.php#L81-L94

相关问题