Cognito php 密码 SRP 验证程序质询 returns 不正确的用户名和密码
Cognito php password SRP verifier challenge returns incorrect username and password
我有一个 PHP 网页,我在其中配置了 aws sdk 并实例化了 cognito 客户端
客户端也配置了客户端密码,并且启用了身份验证流程 USER_PASSWORD_AUTH、USER_SRP_AUTH。
具有基本身份验证流程类型 USER_PASSWORD_AUTH 的 initiateAuth 对我来说工作正常。
以下是我尝试过的示例用法 -
$result = $cognito->initiateAuth([
'AuthFlow' => 'USER_PASSWORD_AUTH',
'ClientId' => '<client_id>',
'UserPoolId' => '<pool_id>',
'AuthParameters' => [
'USERNAME' => '<username>',
'PASSWORD' => "<password>",
'SECRET_HASH' => base64_encode(hash_hmac('sha256', '<username>' . '<client_id>', '<client_secret>', true))
]
]);
有了这个,我们得到了一个成功的访问和 ID 令牌响应,
但是当我们尝试使用与 USER_SRP_AUTH 方法相同的参数时 -
$srp = new srp();
$a = $srp->getRandomSeed();
$A = $srp->generateA($a);
$result = $cognito->initiateAuth([
'AuthFlow' => 'USER_SRP_AUTH',
'ClientId' => '<client_id>',
'UserPoolId' => '<pool_id>',
'AuthParameters' => [
'USERNAME' => '<username>',
'SRP_A' => $A,
'SECRET_HASH' => base64_encode(hash_hmac('sha256', '<username>' . '<client_id>', '<client_secret>', true))
]
]);
$date = date('D M d H:i:s')." UTC 2021";
$challengeParameters = $result->get("ChallengeParameters");
$s = $srp->getRandomSeed();
$x = $srp->generateX($s, $challengeParameters['USER_ID_FOR_SRP'], '<password>');
$S = $srp->generateS_Client($A, $challengeParameters['SRP_B'], $a, $x);
$K = $srp->generateK($S);
$response = $cognito->respondToAuthChallenge([
"ChallengeName" => "PASSWORD_VERIFIER",
"ClientId" => '<client_id>',
"ChallengeResponses" => [
"TIMESTAMP" => $date,
"USERNAME" => $challengeParameters['USER_ID_FOR_SRP'],
"PASSWORD_CLAIM_SECRET_BLOCK" => $challengeParameters['SECRET_BLOCK'],
"PASSWORD_CLAIM_SIGNATURE" => hash_hmac('sha256', $K, $challengeParameters['SALT']),
'SECRET_HASH' => base64_encode(hash_hmac('sha256', $challengeParameters['USER_ID_FOR_SRP'] . '<client_id>', '<client_secret>', true))
]
]);
但是用这种方法我总是得到这个错误 -
NotAuthorizedException Error executing "RespondToAuthChallenge" on "https://cognito-idp.us-east-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://cognito-idp.us-east-1.amazonaws.com` resulted in a `400 Bad Request` response: {"__type":"NotAuthorizedException","message":"Incorrect username or password."} NotAuthorizedException (client): Incorrect username or password. - {"__type":"NotAuthorizedException","message":"Incorrect username or password."}
现在我也尝试用 <username>
替换 challengeParams['USER_ID_FOR_SRP']
但我仍然得到同样的错误。
所以,这里有谁能帮我弄清楚问题出在哪里,并可能也尝试帮助解决它吗?
Cognito 中 SRP 的问题在于它不是根据 RFC5054 的 SRP。
如果您使用任何标准库来处理用于 Cognito 目的的 SRP,它是行不通的。此外,PHP 的 SDK 不支持 SRP。
以下是根据 RFC5054 的 SRP 的工作原理(非常简单):
客户:
- 计算 SRP A
- 发送用户名和SRP_A到服务器
服务器:
- 计算SRP_B
- 向客户端发送SRP_B和salt
客户:
- 计算会话密钥
- 向服务器发送会话密钥证明
服务器:
- 计算会话密钥
- 将服务器会话密钥的证明与客户端会话密钥进行比较
- 将服务器的会话密钥证明发送给客户端
客户:
- 验证服务器的会话密钥证明
当双方都能够确认他们拥有的会话密钥有效时,则认为用户已通过身份验证。
这是它在 Cognito 中的样子:
客户:
- 计算SRP_A
- 发送用户名和SRP_A到服务器
服务器:
- 计算SRP_B
- 发送 SRP_B、salt 和 SECRET_BLOCK 给客户端
此时我们已经可以看出这与 RFC 不同。这个秘密块是 Cognito 特有的,而不是 RFC 特有的。因此,接下来的任何计算都需要以不同的方式进行。
实施过程相当冗长,因此我将 link 粘贴到 Gist。这是 Lynh from Python which in turn is based on AWS SDK sample for Java:
的端口
https://gist.github.com/jenky/a4465f73adf90206b3e98c3d36a3be4f
我有一个 PHP 网页,我在其中配置了 aws sdk 并实例化了 cognito 客户端 客户端也配置了客户端密码,并且启用了身份验证流程 USER_PASSWORD_AUTH、USER_SRP_AUTH。 具有基本身份验证流程类型 USER_PASSWORD_AUTH 的 initiateAuth 对我来说工作正常。 以下是我尝试过的示例用法 -
$result = $cognito->initiateAuth([
'AuthFlow' => 'USER_PASSWORD_AUTH',
'ClientId' => '<client_id>',
'UserPoolId' => '<pool_id>',
'AuthParameters' => [
'USERNAME' => '<username>',
'PASSWORD' => "<password>",
'SECRET_HASH' => base64_encode(hash_hmac('sha256', '<username>' . '<client_id>', '<client_secret>', true))
]
]);
有了这个,我们得到了一个成功的访问和 ID 令牌响应, 但是当我们尝试使用与 USER_SRP_AUTH 方法相同的参数时 -
$srp = new srp();
$a = $srp->getRandomSeed();
$A = $srp->generateA($a);
$result = $cognito->initiateAuth([
'AuthFlow' => 'USER_SRP_AUTH',
'ClientId' => '<client_id>',
'UserPoolId' => '<pool_id>',
'AuthParameters' => [
'USERNAME' => '<username>',
'SRP_A' => $A,
'SECRET_HASH' => base64_encode(hash_hmac('sha256', '<username>' . '<client_id>', '<client_secret>', true))
]
]);
$date = date('D M d H:i:s')." UTC 2021";
$challengeParameters = $result->get("ChallengeParameters");
$s = $srp->getRandomSeed();
$x = $srp->generateX($s, $challengeParameters['USER_ID_FOR_SRP'], '<password>');
$S = $srp->generateS_Client($A, $challengeParameters['SRP_B'], $a, $x);
$K = $srp->generateK($S);
$response = $cognito->respondToAuthChallenge([
"ChallengeName" => "PASSWORD_VERIFIER",
"ClientId" => '<client_id>',
"ChallengeResponses" => [
"TIMESTAMP" => $date,
"USERNAME" => $challengeParameters['USER_ID_FOR_SRP'],
"PASSWORD_CLAIM_SECRET_BLOCK" => $challengeParameters['SECRET_BLOCK'],
"PASSWORD_CLAIM_SIGNATURE" => hash_hmac('sha256', $K, $challengeParameters['SALT']),
'SECRET_HASH' => base64_encode(hash_hmac('sha256', $challengeParameters['USER_ID_FOR_SRP'] . '<client_id>', '<client_secret>', true))
]
]);
但是用这种方法我总是得到这个错误 -
NotAuthorizedException Error executing "RespondToAuthChallenge" on "https://cognito-idp.us-east-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://cognito-idp.us-east-1.amazonaws.com` resulted in a `400 Bad Request` response: {"__type":"NotAuthorizedException","message":"Incorrect username or password."} NotAuthorizedException (client): Incorrect username or password. - {"__type":"NotAuthorizedException","message":"Incorrect username or password."}
现在我也尝试用 <username>
替换 challengeParams['USER_ID_FOR_SRP']
但我仍然得到同样的错误。
所以,这里有谁能帮我弄清楚问题出在哪里,并可能也尝试帮助解决它吗?
Cognito 中 SRP 的问题在于它不是根据 RFC5054 的 SRP。
如果您使用任何标准库来处理用于 Cognito 目的的 SRP,它是行不通的。此外,PHP 的 SDK 不支持 SRP。
以下是根据 RFC5054 的 SRP 的工作原理(非常简单):
客户:
- 计算 SRP A
- 发送用户名和SRP_A到服务器
服务器:
- 计算SRP_B
- 向客户端发送SRP_B和salt
客户:
- 计算会话密钥
- 向服务器发送会话密钥证明
服务器:
- 计算会话密钥
- 将服务器会话密钥的证明与客户端会话密钥进行比较
- 将服务器的会话密钥证明发送给客户端
客户:
- 验证服务器的会话密钥证明
当双方都能够确认他们拥有的会话密钥有效时,则认为用户已通过身份验证。
这是它在 Cognito 中的样子:
客户:
- 计算SRP_A
- 发送用户名和SRP_A到服务器
服务器:
- 计算SRP_B
- 发送 SRP_B、salt 和 SECRET_BLOCK 给客户端
此时我们已经可以看出这与 RFC 不同。这个秘密块是 Cognito 特有的,而不是 RFC 特有的。因此,接下来的任何计算都需要以不同的方式进行。
实施过程相当冗长,因此我将 link 粘贴到 Gist。这是 Lynh from Python which in turn is based on AWS SDK sample for Java:
的端口https://gist.github.com/jenky/a4465f73adf90206b3e98c3d36a3be4f