TL; DR没有分布式私钥,我如何为身份提供者本身为Cognito的Android应用程序执行auth flow,用户只能使用电子邮件/密码注册?
我正在开发一个Android应用程序,我希望用户使用“电子邮件和密码”(不是谷歌,Facebook等)登录,然后能够从S3下载/上传对象。我已经与AWS合作了几个月,但我的应用程序的登录功能始终是基于示例应用程序(其来源显然发生了显着变化),它使用“AWSConfiguration”类来存储:
我需要实现登录和授权以使用AWS模块(如S3)而不嵌入敏感信息。
我似乎很清楚,这将是一个“滚动我自己”的情况所以回到好的'start of the documentation on cognito',我已经很困惑为什么我的“电子邮件和密码”登录模型既不适合"Public Provider"和"Developer Authenticated Identity"的法案:
在Cognito > MyUserPool > App Integration > App client settings
它仍然作为某种形式的身份提供者出现(也没有我必须“启用”它的工作):
最大的问题是:是否可以实现登录流程,用户输入电子邮件和密码,使用Cognito登录,并且应用程序具有必要的信息来实例化S3Object = new S3Client(credentialsProvider).getObject(...)
之类的内容而无需(单独/代理) )服务器处理私钥?
此外,还是应用程序所需的回调/注销URL(如果是,为什么)?
关于SDK中对服务常量进行模糊处理的问题,没有标准方法可以做到这一点 - 这提供了有保证的安全性。有几个基于第三方和服务器的解决方案。但是,Cognito不建议使用任何特定的混淆技术。
要实施登录并获取访问AWS资源的凭据,您可以将Cognito添加为身份池的身份验证提供程序。有了这个,您将能够使用Cognito出售的ID令牌来访问AWS资源。此代码段显示了如何使用Cognito UserPools发布的令牌来访问Android中的AWS资源。
// Get id token from CognitoUserSession.
String idToken = cognitoUserSession.getIdToken().getJWTToken();
// Create a credentials provider, or use the existing provider.
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(context, IDENTITY_POOL_ID, REGION);
// Set up as a credentials provider.
Map<String, String> logins = new HashMap<String, String>();
logins.put("cognito-idp.us-east-1.amazonaws.com/us-east-1_123456789", cognitoUserSession.getIdToken().getJWTToken());
credentialsProvider.setLogins(logins);
有关更多详细信息,请参阅本教程 - http://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-integrating-user-pools-android.html#tutorial-integrating-user-pools-getting-aws-credentials-android。