如何在PHP中实现iOS DeviceCheck-使用现有私钥对JWT令牌签名时出现问题

时间:2019-03-11 17:14:21

标签: php ios laravel symfony jwt

一直在尝试为iOS实现Devicecheck。这应该很简单,因为我要遵循以下指南:

https://fluffy.es/devicecheck-tutorial/#jwt

我只需要将给定的Ruby代码转换为PHP。

尝试使用openssl,但似乎不支持EC密钥。我收到错误消息“此PHP版本不支持密钥类型!”。

所以我转向了JWT框架。

我可以按照以下方式创建EC密钥:

https://web-token.spomky-labs.com/components/key-jwk-and-key-set-jwkset/key-management#elliptic-curve-key-pair

但是我不知道如何将预先存在的(来自Apple的)私钥值传递给它,如Ruby示例一样。

到目前为止,这是我的代码:

public function jwtToken()
{
    $private_key = env('DEVICE_CHECK_KEY_STRING');
    $key_id = env('DEVICE_CHECK_KEY_ID');
    $team_id = env('DEVICE_CHECK_TEAM_ID');

    $algorithmManager = AlgorithmManager::create([
        new ES256()
    ]);

    $jwk = JWKFactory::createECKey('P-256');

    $jsonConverter = new StandardConverter();

    $jwsBuilder = new JWSBuilder(
        $jsonConverter,
        $algorithmManager
    );

    $payload = $jsonConverter->encode([
        'iss' => $team_id,
        'iat' => time()
    ]);

    $jws = $jwsBuilder
            ->create()
            ->withPayload($payload)
            ->addSignature($jwk, ['alg' => 'ES256', 'kid' => $key_id])
            ->build();

    $serializer = new CompactSerializer($jsonConverter);

    $token = $serializer->serialize($jws, 0);

    return $token;
}

这将生成一个JWT令牌,但我不知道如何考虑现有的私钥。

0 个答案:

没有答案