如何从 JWK 密钥集中选择有效密钥进行苹果登录令牌验证?

Posted

技术标签:

【中文标题】如何从 JWK 密钥集中选择有效密钥进行苹果登录令牌验证?【英文标题】:How to select valid keys from JWK key set for apple login token verification? 【发布时间】:2020-07-30 06:23:29 【问题描述】:

我正在尝试使用 API 验证苹果 identityToken。我正在使用firebase/php-jwt 库。

我已经完成了下面的代码。

$access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$auth_keys = file_get_contents('https://appleid.apple.com/auth/keys');

$public_keys = JWK::parseKeySet(json_decode($auth_keys, true));
$keys = array_keys($public_keys);

$decoded = JWT::decode($access_token, $public_keys[$keys[0]], ['RS256']);
$decoded_array = (array) $decoded;

echo '<pre>' . print_r($decoded_array, true) . '</pre>';

当我第一次运行代码时,它成功运行。但第二次返回“签名验证失败”。所以我只是从$public_keys[$keys[0]] 更改为$public_keys[$keys[1]] 所以它工作。但如果我再次尝试登录,它就无法正常工作。

按键选择有问题吗?我不知道如何选择它。我尝试了很多搜索,但没有找到任何合适的解决方案,所以我希望从这里获得帮助。

提前谢谢你

【问题讨论】:

密钥由密钥 ID kid 标识。您可以在令牌的标题和 jwks 中(在给定的 url 下)找到这个 kid。只需为您的令牌选择具有匹配 kid 的 jwk。 谢谢@jps 的帮助,我已经解决了。 【参考方案1】:
$access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
list($headb64, $bodyb64, $cryptob64) = explode('.', $access_token);
$header = JWT::jsonDecode(JWT::urlsafeB64Decode($headb64));

$kid = $header->kid;

【讨论】:

以上是关于如何从 JWK 密钥集中选择有效密钥进行苹果登录令牌验证?的主要内容,如果未能解决你的问题,请参考以下文章

IRS 电子服务帐户的 JSON 网络密钥 (JWK)

从 PEM 导入 JWK 时如何覆盖自动计算的孩子

如何使用XShell登录亚马逊EC2云服务器

SQL - 确保在一组关键密钥对中表示的两个实体都存在于最终数据集中的有效方法

从 json 密钥对中提取加密密钥

AWS EC2如何在没有密钥的情况下连接?