我已经在我的后端 Cognito 中实现了注册和登录、MFA 激活和停用,但现在我想实现内存设备,以减少 SMS 确认。
为此,我将 InitiateAuth 函数调整为以下代码:
$client->initiateAuth([
'AuthFlow' => 'USER_SRP_AUTH', // REQUIRED
'AuthParameters' => [
"USERNAME" => $email,
"PASSWORD" => $password,
"SRP_A" => $bigA,
],
'ClientId' => $this->getClientId(), // REQUIRED
]);
该函数运行正常,返回如下图代码:
https://i.gyazo.com/a439e48e2de85a094f56ed4cfee10f83.png
然后,我继续生成 SRP 值,并使用以下代码调用函数 respondToAuthChallenge:
$client->respondToAuthChallenge([
'ChallengeName' => 'DEVICE_SRP_AUTH',
'ChallengeResponses' => [
'USERNAME' => $username,
'SRP_A' => $bigA,
],
'ClientId' => $this->getClientId(),
]);
然而,它返回一条错误消息:“缺少必需的参数 DEVICE_KEY”。
如果我将 DEVICE_KEY key 放入 ChallengeResponses 中,它会开始返回错误“设备不存在”。
我搜索了很多,但找不到生成 DEVICE_KEY 的方法。我已尝试使用唯一 ID 并在 initiateAuth 和 respondToAuthChallenge 中发送它,但错误是相同的。
知道我该怎么做吗?我相信 SRP 代码还不是 100%,因为仍然理解这个概念,但无法理解 DEVICE_KEY 部分。
谢谢
最佳答案
看起来你必须使用 Server Side Authentication Flow
对于服务器端应用程序,用户池身份验证类似于客户端应用程序,除了:
服务器端应用调用
AdminInitiateAuth
API(而不是InitiateAuth
)。此方法需要 AWS 管理员凭据。此方法返回身份验证参数。获得身份验证参数后,应用会调用
AdminRespondToAuthChallenge
API(而不是RespondToAuthChallenge
),这也需要 AWS 管理员凭据。
AdminInitiateAuth
返回设备 key 等内容。
关于php - 处理 SRP 身份验证和生成设备 key (PHP - 服务器端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50913452/