0

我有一个客户端应用程序(用 Java 开发,而不是 Android),它使用 Amazon Cognito 用户池对用户进行身份验证。为了清楚起见:该应用程序显示一个用户名/密码输入对话框,然后使用 SRP 方法向 Cognito 用户池服务进行身份验证;在该对话框中处理潜在的挑战(设备 ID、必须更改密码、两个因素等)。最后,我有一系列令牌,允许程序使用带有用户凭证的 AWS 服务。

现在,我需要客户端应用程序与自定义服务器端应用程序进行通信。客户端必须向服务器应用程序证明其身份,然后服务器应用程序将与更多 AWS 服务进行通信。在这里,我有两个不同的用例:

1)服务器只需要知道客户端认证的用户是谁(以安全的方式,但不冒充用户)。

2)客户端需要将用户的部分或全部权限委托给服务器;然后,服务器将代表该用户对 AWS 服务执行一些操作。

服务器端应用程序很可能是用 Java 开发的,在 EC2 机器上运行。我只对通过 Cognito 用户池源的用户身份验证感兴趣(也就是说,我对基于 Facebook/Google/OpenID 的身份验证流程不感兴趣)。

以非常不安全的方式实现这两个目标似乎相当容易:只需让客户端应用程序将其已授予的所有令牌发送到服务器即可。但这显然不是要走的路。

然而,我很难从 Cognito 用户池/Cognito 身份池/IAM/STS 文档中弄清楚如何正确实现这一点。例如,我希望客户端应用程序能够生成某种“委托令牌”,可以将其传递给服务器;然后,服务器应该能够验证该令牌并从中提取身份信息(满足 #1),或者模拟与令牌对应的身份以执行对 AWS 服务的调用(满足 #2)。还是我想错了?

4

1 回答 1

3

您所指的是 Amazon Cognito 目前不支持的 OAuth 2.0 代码授权流程。

当前可用的安全方法是将 id 令牌从客户端传递到服务器,然后验证该令牌并从中提取身份信息。这证明了调用者的身份,因为您可以验证 id 令牌的签名。

于 2017-02-13T04:47:56.050 回答