我有一个客户端应用程序(用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)。或者我想错了?
您所指的是OAuth 2.0代码授权流,而Amazon Cognito目前不支持该流。
目前可用的安全方法是将id令牌从客户端传递到服务器,然后验证该令牌并从中提取身份信息。这可以证明调用者的身份,因为您可以验证id令牌的签名。