小编mar*_*ars的帖子

使用Java SDK进行桌面应用程序的AWS Cognito登录

我搜索了很多,但似乎无法从头到尾找到解决方案.作为前提,我已经在iOS和Android的两个原生应用程序中实现了Cognito注册,登录和刷新凭证,因此我已经开发了(至少)对身份验证流程的基本了解.

这些移动应用程序使用最简单的Cognito设置:用户池,具有IAM角色的身份池,用于经过身份验证的用户,并且不会使用任何未经身份验证的使用.我没有使用(至少现在)Facebook,谷歌或亚马逊登录,也没有其他身份验证方法.

现在我需要用Java制作这些应用程序的桌面版本,在我看来它是一个完全不同的野兽.我想做的是:

  1. 在我的Java桌面应用程序中打开登录窗口;
  2. 在其字段中插入用户名和密码,然后按登录按钮;
  3. 获取一些凭据并开始使用连接到其他AWS服务的应用程序,特别是我需要使用S3,Lambda和DynamoDB.

实现这一目标的方法在纸面上相当简单:

  1. 从Cognito用户池中获取令牌;
  2. 将此令牌提供给Cognito身份池以换取一些凭据;
  3. 使用此凭据访问其他AWS服务.

在阅读了大量文档,下载了许多不同的项目示例和大量的绝望之后,我终于找到了在移动应用程序中实现这一点的方法.例如,在Android中,身份验证流程的工作方式如下:

  1. 使用UserPoolID,AppClientID,PoolRegion和(可选)ClientSecret实例化CognitoUserPool;
  2. 使用IdentityPoolID和PoolRegion实例化凭据提供程序;
  3. 在应用程序UI中,插入用户名和密码,然后按"登录"按钮;
  4. 使用之前实例化的UserPool中的用户名检索CognitoUser;
  5. 为CognitoUser获取CognitoUserSession,使用带有各种回调的AuthenticationHandler在需要时传递密码;
  6. 将CognitoUserSession添加到先前实例化的凭证提供程序,以TokenKey +从会话中提取的JWT令牌的形式.
  7. 此时,每当我需要访问S3,Lambda或DynamoDB时,我只需将此凭据提供程序作为其客户端构造函数的参数传递.

与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)

java authentication amazon-web-services aws-java-sdk

8
推荐指数
1
解决办法
1177
查看次数