Javascript AWS Cognito-AdminInitiateAuth vs InitiateAuth

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进行身份验证,其体系结构如下:
客户端(浏览器)->我们的服务器->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