Я уже некоторое время пытаюсь заставить это работать. Есть некоторый код, который я смог использовать в качестве справки, но, к сожалению, я все еще сталкиваюсь с некоторыми проблемами, и теперь неясно, почему это происходит.
Прежде чем приступить к рассмотрению проблемы, я хочу указать на ссылки, о которых я упоминал ранее. Вот ключевые ссылки, которые мне помогли:
- https://gist.github.com/jenky/a4465f73adf90206b3e98c3d36a3be4f (отличная отправная точка)
- https://github.com/alexrudd/cognito-srp/blob/master/cognitosrp.go
- com / aws / aws-sdk-net-extensions -ognito / tree / ab97c0cb0b8fc3c87573d31b2dc9fb9f7c2e5573 / src / Amazon.Extensions.CognitoAuthentication
- Ответ на запрос 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
];
Обратите внимание, что это не весь код, я просто пытаюсь показать основные части, но могу ошибаться, поэтому дайте мне знать.
По какой-то причине он работает не так, как ожидалось, и я безуспешно пробовал бесчисленное количество вариантов. Если кто может помочь, было бы здорово!
Большое спасибо! отметка