Amazon web services 将未经身份验证的用户切换为经过身份验证的用户
我正在尝试将我的应用程序设置为允许未经验证的用户访问AppSync API,如中所述。理想情况下,他们可以开始使用该应用程序,然后登录并保留所有数据 我有:Amazon web services 将未经身份验证的用户切换为经过身份验证的用户,amazon-web-services,amazon-cognito,amazon-iam,aws-appsync,Amazon Web Services,Amazon Cognito,Amazon Iam,Aws Appsync,我正在尝试将我的应用程序设置为允许未经验证的用户访问AppSync API,如中所述。理想情况下,他们可以开始使用该应用程序,然后登录并保留所有数据 我有: 用户池。这是为googleauth/常规cognito auth设置的 身份证池 它通过Cognito身份提供者链接到用户池。 经过身份验证/未经身份验证的角色附加了一个策略,该策略允许他们访问GraphQL API 使用AWS_IAM auth设置的AppSync API 我创建的应用程序同步客户端如下所示: val credent
val credentialsProvider = CognitoCachingCredentialsProvider(
context,
"us-east-2:abc...etc",
Regions.US_EAST_2)
appSyncClient = AWSAppSyncClient.builder()
.context(applicationContext)
.awsConfiguration(awsConfiguration)
.credentialsProvider(credentialsProvider)
.build()
这很好,标识池为我创建了一个标识,我可以与API交互。嗯,它创建了两个匿名身份ID,但它可以工作。当我登录时,真正的麻烦来了:
val hostedUIOptions: HostedUIOptions = HostedUIOptions.builder()
.scopes("openid", "email", "aws.cognito.signin.user.admin")
.build()
val signInUIOptions: SignInUIOptions = SignInUIOptions.builder()
.hostedUIOptions(hostedUIOptions)
.build()
runOnUiThread {
mobileClient.showSignIn(
mainActivity,
signInUIOptions,
object : Callback<UserStateDetails?> {
override fun onResult(result: UserStateDetails?) {
Log.i("AwsAuthSignIn", "onResult: " + result?.userState)
}
override fun onError(e: Exception?) {
Log.i("AwsAuthSignIn", "onResult: " + result?.userState)
}
}
)
}
“username”是唯一有意义的另一个,但当我调用AWSMobileClient.username时,它会使用另一种格式:“Google\ux”。所以我无法在客户端逻辑中匹配它
这到底是可能的,还是我需要放弃未经验证的使用想法,直接使用用户池?我将尝试回答这个问题,我将坚持使用Cognito如何工作,而不是如何使用特定的SDK 快速回顾一下,在Cognito中,当用户进行身份验证时,他们将获得3个令牌:访问、id和刷新。有了身份池,他们可以交换其中的一个(我忘了是哪一个)来获得短期凭证以担任某个角色。STS是引擎盖下用于此目的的,这是您在
userArn
中看到的。你不想看那个家伙的ID,这是一个STS构造,你的客户需要承担IAM角色
我将回到令牌,让我们看看id\u令牌
,我最喜欢的:
{
"at_hash": "l.......",
"sub": ".....",
"cognito:groups": [
"ap-southeast-......_Google",
"kibana"
],
"email_verified": false,
"cognito:preferred_role": "arn:aws:iam::...:role/...",
"iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-...",
"phone_number_verified": false,
"custom:yourapp:foo": "Bar",
"cognito:username": "Google_......",
"nonce": ".........",
"cognito:roles": [
"arn:aws:iam::.....",
"arn:aws:iam::....."
],
"aud": ".....",
"identities": [
{
"userId": "....",
"providerName": "Google",
"providerType": "Google",
"issuer": null,
"primary": "true",
"dateCreated": "1583907536164"
}
],
"token_use": "id",
"auth_time": 1596366937,
"exp": 1596370537,
"iat": 1596366937,
"email": "test@test.com"
}
我这里也有一个谷歌的,我删除了一些东西来隐藏我的帐户等,但无论如何你想要使用的id是cognito:username
,实际上它的形式是Google\uuuz
。这是内部的,通常不会向用户显示。因此,在Cognito中,您可以使用另一个声明preferred\u username
,该声明也可以用作上述登录的别名,但不能用于外部身份提供者
您可以使用创建自定义声明来帮助显示UI上的信息,该信息将以自定义:
作为前缀,我这里有一个前缀:自定义:yourapp:foo
。但是你可能已经有了一个类似于email
,可以从谷歌获得。当您创建外部身份提供者时,您将配置要从Google映射的声明,电子邮件将在那里,因此在您的应用程序中,您可以阅读电子邮件
声明,但您应该在应用程序的后端使用cognito:username
,但请记住,如果用户删除并重新创建他们的帐户,我不知道您是否会再次获得相同的ID。您可能更希望用户能够在注册时定义一个首选\u用户名
,您可以在UI中显示该用户名,但不要使用该用户名保存数据,请使用cognito:username
声明
现在开始使用应用程序,然后登录并保留他们的所有数据。通常,这可以通过将所有数据保存在设备的本地存储中而不是后端来实现。原因是,如果用户未通过身份验证(不包括在打开应用程序时创建会话),则无法验证foo@gmail.com
实际上是foo@gmail.com
当他们以未经身份验证的角色所看到的方式攻击您的API时。我可以点击你的API说我是foo@gmail
即使我是bar@gmail
最简单的方法是将数据本地存储在设备上,因此用户是否经过身份验证无关紧要。如果出于某种原因,你的应用程序确实需要将这些数据存储在后端才能正常运行,而你无法重构,那么你可以使用自定义的用户池工作流,并创建一个可接受自定义声明的用户池(我不会使用sts userArn,但你也可以使用它),最好是购物车的GUID,例如custom:yourapp:cartGuid
。所以我的意思是:
- 当匿名用户第一次访问应用程序时,他们会 为购物车颁发GUID,并保存该购物车中的所有项目 推车
- 如果他们选择注册,他们可以传入一个自定义声明:
,在Lambda函数中,您将在数据库中创建用户,并将购物车添加到他们的帐户中custom:yourapp:cartGuid
- 猜测另一个用户的GUID几乎是不可能的,但如果这是一个安全问题,那么您可以创建一个签名令牌
- 您可能希望清理用户的购物车,这些购物车在一段时间后不会移动到注册位置
如果您有任何问题或不确定,请给我一个评论。根据记忆,我相信您需要使用pre-signup钩子,因为post-confirm无法访问在注册过程中传递的声明。您可能希望在pre-hook中创建带有未确认标志的用户,然后在post-hook中启用它们,我认为这样更安全,以防在池中发生另一个故障,然后在脏状态下创建用户。祝我好运,我自己也经历过白兰地之战,并活了下来 谢谢。我的数据存储层由AWS AppSync完成,100%本地存储意味着我需要设置和测试一个全新的代码路径来持久化数据。我感兴趣的是使用宣传的功能通过身份池顺利升级unauth->auth。虽然这里有有用的信息,但这并不完全是我想要的。在进行身份验证之前,没有真实的身份,您看到的ID指的是您在身份池中设置的未经身份验证的角色的实例,
{
"at_hash": "l.......",
"sub": ".....",
"cognito:groups": [
"ap-southeast-......_Google",
"kibana"
],
"email_verified": false,
"cognito:preferred_role": "arn:aws:iam::...:role/...",
"iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-...",
"phone_number_verified": false,
"custom:yourapp:foo": "Bar",
"cognito:username": "Google_......",
"nonce": ".........",
"cognito:roles": [
"arn:aws:iam::.....",
"arn:aws:iam::....."
],
"aud": ".....",
"identities": [
{
"userId": "....",
"providerName": "Google",
"providerType": "Google",
"issuer": null,
"primary": "true",
"dateCreated": "1583907536164"
}
],
"token_use": "id",
"auth_time": 1596366937,
"exp": 1596370537,
"iat": 1596366937,
"email": "test@test.com"
}