Сгенерируйте ключ / токен Paseto V2 Publi c в PHP, подтвердите в Node.js - PullRequest
5 голосов
/ 28 января 2020

Предисловие:

Что такое Paseto ?: https://developer.okta.com/blog/2019/10/17/a-thorough-introduction-to-paseto

  • Я использую библиотеку PHP для Paseto с здесь
  • Я использую Node.js Paseto lib с здесь

Мне удалось успешно создать создание токен Paseto V1 и соответствующий ключ publi c с использованием библиотеки PHP (с секретным ключом RSA на стороне сервера для пары ключей), а затем с помощью ключа publi c проверьте указанный токен на Node.js сторона:

PHP Paseto Publi c V1:

    $privateKeyV1 = new AsymmetricSecretKey($rsaPrivate, new Version1());
    $publicKeyV1  = $privateKeyV1->getPublicKey();

    $token = (string) (new Builder())
        ->setKey($privateKeyV1)
        ->setVersion(new Version1())
        ->setPurpose(Purpose::public())
        // Set it to expire in one day
        ->setExpiration(
            (new DateTime())->add(new DateInterval('P01D'))
        )
        ->setAudience('Foo')
        ->setIssuedAt(new DateTime())
        ->setIssuer('Bar')
        ->setNotBefore()
        ->setSubject('IDP Paseto')
        ->setClaims([
            'claim' => json_decode($this->claimJSON(), true),
        ])->toString();

    return $response->withJson([
       'public_key_v1' => $publicKeyV1->raw(), 
       'token' => $token
    ]);

NodeJS Paseto Publi c V1:

const token    = "v1.public.sdsw5vsdf4554...............exampletoken:"; // Example paseto V1 token
const pubKey   = await createPublicKey("-----BEGIN PUBLIC KEY-----\r\npubKeyFromAbovePHP\r\n-----END PUBLIC KEY-----"); // Example public key
const response = await verify(token, pubKey);

Это прекрасно работает, я могу проверить свою заявку в Node.js и обработать то, что мне нужно, используя введенные данные.

Сейчас если я попробую следующее w / V2, вызвав bin2hex() на ключе publi c, чтобы сохранить его и использовать на стороне Node.js, я не смогу правильно проверить в Node.js. Я считаю, что это как-то связано с генерацией натриевого крипто-двоичного ключа и с тем, как $publicKey->encode() использует Base64UrlSafe::encodeUnpadded($this->key);, но я не уверен .. Я никогда не получаю BEGIN PUBLIC KEY из publicKey, созданного с использованием V2, так как я считаете, что он просто хранится в двоичном виде?

PHP Paseto Publi c V2:

$privateKeyV2 = AsymmetricSecretKey::generate(new Version2()); 
$publicKeyV2  = $privateKeyV2->getPublicKey();

$token = (string) (new Builder())
        ->setKey($privateKeyV2)
        ->setVersion(new Version2())
        ->setPurpose(Purpose::public())
        ->setExpiration((new DateTime())->add(new DateInterval('P01D')))       
        ->setClaims([
            'claim' => json_decode($this->claimJSON(), true),
        ])->toString();

       return $response->withJson([
        'public_key_v2' => bin2hex($publicKeyV2->raw()),
        'token' => $token
       ]);

NodeJS Paseto Publi c V2:

const pubKey = await createPublicKey(Buffer.from('public_key_from_php_response_above', 'hex'));
const token = 'token_output_from_php_response_above';
const response = await verify(token, pubKey);
console.log(response);

Я ценю любые отзывы, которые вы можете предоставить. Пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы. Я пометил это с помощью slim для PHP framework, так как я использую PHP paseto lib в рамках тонкого проекта для хранения открытых / закрытых ключей на моем тонком контейнере и т. Д. c. и NodeJS в контексте лямбды.

...