当前位置: 首页 > 知识库问答 >
问题:

Cognito php密码SRP验证器挑战返回不正确的用户名和密码

景同
2023-03-14

我有一个PHP网页,其中我配置了aws sdk并实例化了cognito客户机。客户机也配置了一个客户机密码,并且启用了auth flows USER\u PASSWORD\u auth、USER\u SRP\u auth。具有基本身份验证流类型USER\u PASSWORD\u 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))
]
]);

通过这种方式,我们获得了一个带有access和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."}

现在我也尝试用

那么,这里有人能帮我弄清楚问题是什么,并且可能也试着帮助解决它吗?


共有1个答案

和柏
2023-03-14

Cognito中SRP的问题在于,根据RFC5054,它不是SRP。

如果您使用任何标准库来处理用于Cognito目的的SRP,那么它将不起作用。此外,PHP的SDK不支持SRP。

以下是SRP根据RFC5054的工作原理(非常简化):

客户:

  • 计算SRP A

服务器:

  • 计算SRP_B
  • 送SRP_B和盐给客户

客户:

  • 计算会话密钥
  • 将会话密钥的证明发送到服务器

服务器:

  • 计算会话密钥

客户:

  • 验证服务器的会话密钥证明

当双方都能够确认他们拥有的会话密钥是有效的时,假定用户已通过身份验证。

下面是它在Cognito中的样子:

客户:

  • 计算SRP_A
  • 发送用户名和SRP_A到服务器

服务器:

  • 计算SRP_B
  • 向客户发送SRP_B、salt和SECRET_块

在这一点上,我们已经可以看到这与RFC不同。这个秘密块是Cognito特有的,而不是RFC特有的。因此,接下来的任何计算都需要以不同的方式进行。

实现相当长,所以我将粘贴一个指向Gist的链接。这是Lynh从Python开发的一个端口,它基于AWS SDK Java示例:

https://gist.github.com/jenky/a4465f73adf90206b3e98c3d36a3be4f

 类似资料:
  • 在cognito用户池中,我有两个不同的组:Admin 现在我想授权userpool中的用户。我正在关注这个链接-https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html -客户端身份验证流。但是“RespondToAuthChalleng

  • 问题内容: 正在尝试在提示(URL给定)中输入数据,以下代码给我一个错误。请帮我这些吗? 我尝试过: 这也是行不通的。 问题答案: 当你一起工作通过 3.6.1可以绕过通过嵌入的弹出和在自身如下。 此解决方案将打开URL http://the-internet.herokuapp.com/basic_auth并使用有效的username和password凭据进行身份验证。

  • 我想知道我是否以正确的方式编写了泽西客户端代码。 登录页面应该在输入正确的用户名和密码后重定向到主页,服务器端返回一个空字符串()。如果其中一个不正确,服务器端代码返回。 页面功能运行良好,但当我使用正确的用户名和密码对使用客户端代码进行测试时,它返回,响应返回200OK。下面是我的客户端代码。 我怀疑用户名和密码没有按HTML文件要求的正确输入位置提交。下面是我的HTML文件块。

  • 我对仅使用bcrypt的用户名和密码的用户注册验证有特定要求(没有设计!) 我目前正在工作: 我需要: 用户名: 只能包含字母、数字、短划线和下划线 必须至少包含一个大写字母、一个特殊字符、一个数字和一个小写字母

  • 问题内容: 我有一个看起来像这样: 到目前为止,我所有的验证都在模式中进行,我想知道如何通过密码验证来实现这一点。用户在两个字段中输入密码,并且模型应检查它们彼此是否相同。 这种验证是否属于架构?我是这种验证的新手。 我应该如何验证密码? 问题答案: 我最终发现,您可以结合使用 虚拟路径 和 函数来实现此目的(如本要点所示),以达到与密码匹配相同的目的: https //gist.github.c

  • 我有一个登录表格。如下: 我在提交表单时通过Ajax验证用户名和密码 在函数中,可以正确地对空字符或无效字符进行验证,但我想向用户返回密码错误或用户名错误的错误。 Ajax调用如下: 具有PHP数据库连接和代码 这样,返回的唯一错误是“无效凭据”。请让我知道如何分别验证用户名和密码。