Javascript AWS Cognito-AdminInitiateAuth vs InitiateAuth
我们希望利用AWS Cognito进行身份验证,其体系结构如下:Javascript AWS Cognito-AdminInitiateAuth vs InitiateAuth,javascript,amazon-web-services,amazon-cognito,Javascript,Amazon Web Services,Amazon Cognito,我们希望利用AWS Cognito进行身份验证,其体系结构如下: 客户端(浏览器)->我们的服务器->AWS Cognito 设置了各种配置后,initialeauth似乎与admininitialeauth没有什么不同,因此我想了解在这些配置下,选择一个是否比另一个重要 当我创建一个带有客户端密码的应用程序并使用initiateAuth时,似乎与使用ADMIN\u NO\u SRP\u AUTHAUTH流的adminInitiateAuth集成体验几乎相同。后者甚至不需要AWS文件中所述的AW
客户端(浏览器)->我们的服务器->AWS Cognito
设置了各种配置后,initialeauth
似乎与admininitialeauth
没有什么不同,因此我想了解在这些配置下,选择一个是否比另一个重要
当我创建一个带有客户端密码的应用程序并使用initiateAuth
时,似乎与使用ADMIN\u NO\u SRP\u AUTH
AUTH流的adminInitiateAuth
集成体验几乎相同。后者甚至不需要AWS文件中所述的AWS证书。我与Cognito的整合如下:
启动时间:
const payload = {
AuthFlow: "USER_PASSWORD_AUTH",
ClientId: cognitoClientId,
AuthParameters: {
USERNAME: username,
PASSWORD: password,
SECRET_HASH: generateSignature(username)
}
}
const response = await cognitoClient.initiateAuth(payload).promise();
const payload = {
UserPoolId: userPoolId,
AuthFlow: "ADMIN_NO_SRP_AUTH",
ClientId: cognitoClientId,
AuthParameters: {
USERNAME: username,
PASSWORD: password,
SECRET_HASH: generateSignature(username)
}
}
const response = await cognitoClient.adminInitiateAuth(payload).promise();
adminInitiateAuth:
const payload = {
AuthFlow: "USER_PASSWORD_AUTH",
ClientId: cognitoClientId,
AuthParameters: {
USERNAME: username,
PASSWORD: password,
SECRET_HASH: generateSignature(username)
}
}
const response = await cognitoClient.initiateAuth(payload).promise();
const payload = {
UserPoolId: userPoolId,
AuthFlow: "ADMIN_NO_SRP_AUTH",
ClientId: cognitoClientId,
AuthParameters: {
USERNAME: username,
PASSWORD: password,
SECRET_HASH: generateSignature(username)
}
}
const response = await cognitoClient.adminInitiateAuth(payload).promise();
您可以看到不同的是AuthFlow
值不同,调用不同的方法和ADMIN\u NO\u SRP\u AUTH
需要UserPoolId
参数,这对我来说似乎很肤浅
我们还将基于客户端机密生成签名,这是我们可以安全处理的。initiateAuth和adminInitiateAuth做了类似的事情,但是它们有不同的用例和流程
当您拥有最终用户客户端应用程序时,将使用initiateAuth。用户输入他们的凭据,并通过安全远程密码协议发送。如果流成功,最终用户将获得一个令牌并被允许访问。Android、IOS和Javascript SDK使用此流,因为它与客户端有关
当您没有客户端用户应用程序,而是使用Java、Python或其他后端语言的安全后端应用程序时,将使用adminInitiateAuth。此方法不接受管理员登录的用户名和密码用户凭据,但需要AWS凭据
在您的情况下,如果您有一个客户端应用程序-->Cognito并直接使用Android SDK或Javascript SDK,那么您应该在SDK中使用initiateAuth传递用户凭据。但是,浏览器-->后端-->Cognito意味着您有一个专用的后端,因此在您的情况下,您应该管理InitiateAuth。更多信息我知道您想知道Amazon Cognito中的InitiateAuth
和AdminInitiateAuth
API调用之间的区别。
要澄清API调用的用法,请执行以下操作:
InitiateAuth
是一个客户端/浏览器端API调用,该API调用不需要任何敏感凭据来提供质询和其他参数李>
AdminInitiateAuth
是一个在服务器端运行的API调用,API调用始终需要开发人员凭据才能成功响应。这是因为API调用是AWS SigV4签名的API调用李>
此外,两个API调用都支持下面指定的不同身份验证流
InitiateAuth
支持以下身份验证流:
- 用户\u SRP\u身份验证
- 刷新\u令牌\u身份验证
- 用户\密码\身份验证
- 自定义认证
请注意,AWS CLI文档[a]当前指出ADMIN_NO_SRP_AUTH是一个可能的值。但是,我已经在我的终端测试了API调用,我可以确认CLI的文档当前不正确
更新(2019年9月12日):看起来在写下这个答案之后,Amazon Web Services已经将其文档更新为正确的可能值。文件现在说明如下:
ADMIN_NO_SRP_AUTH is not a valid value.
AdminInitiateAuth
支持以下身份验证流:
- 用户\u SRP\u身份验证
- 刷新\u令牌\u身份验证
- 自定义认证
- 管理员\u否\u SRP\u认证
- 用户\密码\身份验证
InitiateAuth
的示例用例:如果您希望用户在web应用程序中进行身份验证
AdminInitiateAuth
的示例用例:任何需要基于特定AWS凭据进行服务器端身份验证或访问以筛选只有特定IAM用户才能使用Cognito进行身份验证的用例
如前所述,InitiateAuth
非常适合您的用例,因为您的应用程序是客户端应用程序。
此外,如果您担心安全性,可以将用户\u SRP\u AUTH与InitiateAuth
一起使用。有关在生产代码中使用USER_SRP_AUTH流的更多信息,请参阅以下NPM文档[b]
工具书类
[a]
[b] 我也花了相当长的时间研究有关
何时使用AdminInitiateAuth与InitiateAuth
应该是有帮助的,但我发现它结构不好,而且非常混乱
根据我的理解,您是对的,您可以在服务器上使用两种方法:
InitiateAuth
使用AuthFlow=USER\u PASSWORD\u AUTH
(需要使用客户端密码创建应用客户端)
administrateauth
带有AuthFlow=ADMIN\u USER\u PASSWORD\u AUTH
(替换为旧版ADMIN\u NO\u SRP\u AUTH
)
不过,我相信第二种选择对于服务器使用场景更有意义。通过这种方式,您可以在应用程序客户端设置中禁用ALLOW\u USER\u PASSWORD\u AUTH
AUTH flow。虽然这可能不是一个巨大的风险,但不向公众开放InitiateAuth
API感觉更干净,因为它不是必需的。AdminInitiateAuth的存在只有一个原因:因此,您可以在服务器端代码中避免SRP的麻烦,同时仍然要求客户端代码使用SRP
SRP更安全,但实施起来很烦人/不方便。此外,如果您正在编写在服务器上运行的代码,那么SRP提供的许多好处都是无关紧要的(您的代码运行在一个安全、受保护的环境中)
如果你设置了Cognito应用程序clie