如何从 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]]
所以它工作。但如果我再次尝试登录,它就无法正常工作。
按键选择有问题吗?我不知道如何选择它。我尝试了很多搜索,但没有找到任何合适的解决方案,所以我希望从这里获得帮助。
提前谢谢你
【问题讨论】:
密钥由密钥 IDkid
标识。您可以在令牌的标题和 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 密钥集中选择有效密钥进行苹果登录令牌验证?的主要内容,如果未能解决你的问题,请参考以下文章