DEVICE_PASSWORD_VERIFIER - AWS Cognito - PHP SDK

Я уже некоторое время пытаюсь заставить это работать. Есть некоторый код, который я смог использовать в качестве справки, но, к сожалению, я все еще сталкиваюсь с некоторыми проблемами, и теперь неясно, почему это происходит.

Прежде чем приступить к рассмотрению проблемы, я хочу указать на ссылки, о которых я упоминал ранее. Вот ключевые ссылки, которые мне помогли:

  1. https://gist.github.com/jenky/a4465f73adf90206b3e98c3d36a3be4f (отличная отправная точка)
  2. https://github.com/alexrudd/cognito-srp/blob/master/cognitosrp.go
  3. com / aws / aws-sdk-net-extensions -ognito / tree / ab97c0cb0b8fc3c87573d31b2dc9fb9f7c2e5573 / src / Amazon.Extensions.CognitoAuthentication
  4. Ответ на запрос DEVICE_PASSWORD_VERIFIER в Amazon Cognito с использованием boto3 и ордер

Вот сообщение в блоге, которое я также использовал для помощи и соединил меня со ссылками, приведенными выше: https://aws.amazon.com/premiumsupport/knowledge-center/cognito-user-pool-remembered-устройства/

Позвольте мне сослаться на эту статью, чтобы я мог лучше объяснить свою проблему.

Итак, я смог пройти все шаги, кроме последнего, который постоянно терпит неудачу. Предположим, некоторые основные переменные:

$device_group_key = "-hdk698";
$device_key = "us-east-1-dsdsdsds-sdsds-sdsd";
$username = $poolId.$userId;

Сначала мне нужно получить device["PasswordVerifier"]. Для этого я вызову эту функцию:

$device = $this->getDeviceSecretVerifierConfig($device_group_key, $username);

// reference to the function
public function getDeviceSecretVerifierConfig(string $deviceGroupKey, string $username): array
{
  $salt = $this->bytes(16);
  $randomPassword = $this->bytes(40);
  $fullPassword = $this->hash(sprintf('%s%s:%s', $deviceGroupKey, $username, $randomPassword));

  $passwordVerifier = $this->g->modPow(
    new BigInteger($this->hexHash($salt->toHex() . $fullPassword), 16),
    $this->N
  );

  return [
    'Salt' => base64_encode($salt->toString()),
    'PasswordVerifier' => base64_encode($passwordVerifier->toString())
  ];
}

Теперь мне нужно получить Device Password Authentication Key.

$hkdf = $this->getDevicePasswordAuthenticationKey(
  $username, 
  $device["PasswordVerifier"], 
  $device_group_key, 
  $challengeParameters['SRP_B'],
  $challengeParameters['SALT']
);

$msg = $device_group_key.$device_key.$secretBlock.$time;
$signature = hash_hmac('sha256', $msg, $hkdf, true);

// reference to the function
protected function getDevicePasswordAuthenticationKey(string $username, string $devicePassword, string $deviceGroup, string $server, string $salt): string
{
  $u = $this->calculateU($this->largeA(), $serverB = new BigInteger($server, 16));

  if ($u->equals(new BigInteger(0))) {
    throw new \RuntimeException('U cannot be zero.');
  }

  $fullPassword = $this->hash(sprintf('%s%s:%s', $deviceGroupKey, $username, $devicePassword));

  $x = new BigInteger($this->hexHash($this->padHex($salt).$fullPassword), 16);
  $gModPowXN = $this->g->modPow($x, $this->N);
  $intValue2 = $serverB->subtract($this->k->multiply($gModPowXN));
  $s = $intValue2->modPow($this->smallA()->add($u->multiply($x)), $this->N);

  return $this->computeHkdf(
    hex2bin($this->padHex($s)),
    hex2bin($this->padHex($u))
  );
}

Обладая всей этой информацией, я наконец могу вернуть то, что нужно, чтобы пройти этот последний вызов.

return [
  "TIMESTAMP" => $time,
  "USERNAME" => $userId,
  "PASSWORD_CLAIM_SECRET_BLOCK" => $secret_block,
  "PASSWORD_CLAIM_SIGNATURE" => base64_encode($signature),
  "DEVICE_KEY" => $device_key
];

Обратите внимание, что это не весь код, я просто пытаюсь показать основные части, но могу ошибаться, поэтому дайте мне знать.

По какой-то причине он работает не так, как ожидалось, и я безуспешно пробовал бесчисленное количество вариантов. Если кто может помочь, было бы здорово!

Большое спасибо! отметка


person Mark    schedule 07.04.2021    source источник