我搜索了很多,但似乎无法从头到尾找到解决方案.作为前提,我已经在iOS和Android的两个原生应用程序中实现了Cognito注册,登录和刷新凭证,因此我已经开发了(至少)对身份验证流程的基本了解.
这些移动应用程序使用最简单的Cognito设置:用户池,具有IAM角色的身份池,用于经过身份验证的用户,并且不会使用任何未经身份验证的使用.我没有使用(至少现在)Facebook,谷歌或亚马逊登录,也没有其他身份验证方法.
现在我需要用Java制作这些应用程序的桌面版本,在我看来它是一个完全不同的野兽.我想做的是:
实现这一目标的方法在纸面上相当简单:
在阅读了大量文档,下载了许多不同的项目示例和大量的绝望之后,我终于找到了在移动应用程序中实现这一点的方法.例如,在Android中,身份验证流程的工作方式如下:
与Java SDK实现相同的功能在我看来要困难得多.
我设法很容易地实现用户注册.但是,如果用户登录,我根本不知道从哪里开始.
每个例子都以不同的方式做到这一点.最重要的是,每个示例都使用特定用例,例如开发人员验证的Sign-Ins或自定义URL来连接到某个拥有的后端.为什么如此难以找到像我需要的基本用例的例子?我开始认为我的基本用例根本不是基本的,而是非典型的.为什么使用用户名和密码登录AWS的默认用户/凭证服务是非典型的,但是,我真的不知道.
到目前为止,我所做的最好的是从这个示例项目中复制相关的类(我还从中获取了注册部分,它运行良好)并在控制台中打印IdToken,AccessToken和RefreshToken.它们打印正确且不为空.我真正理解的是如何获取凭据并将其添加到凭证提供程序,以便实例化客户端以访问其他AWS服务.我在项目中看到的唯一方法就是调用方法
Credentials getCredentials(String accessCode)
我想它应该接受使用InitAuth方法检索的访问代码(启动OAuth2.0身份验证流程,如果我错了请纠正我).问题是我找不到检索该代码的方法.我找不到访问代码的在线示例来查看它的外观.我试图将其中一个令牌和Web请求做出响应
{"error":"invalid_grant"}
Run Code Online (Sandbox Code Playgroud)
这表明它不是有效的代码,但至少Web请求是有效的.
为了更清楚,我能做的是:
String username; //retrieved from UI
String password; //retrieved from UI
//I copied AuthenticationHelper as is from the project
AuthenticationHelper helper = new AuthenticationHelper(POOL_ID, CLIENT_APP_ID, CLIENT_SECRET);
//I then retrieve the tokens with SRP authentication
AuthenticationResultType result = helper.performSRPAuthentication(username, password);
//Now I can successfully print the tokens, for example: …Run Code Online (Sandbox Code Playgroud)