为什么 AWS CognitoSync ListDatasets 需要 IdentityId?
Why does AWS CognitoSync ListDatasets require IdentityId?
如果用户只能访问他或她的数据集,为什么 IdentityId 是一个必须在此 API 调用 (ref) 上设置的字段。无法从 AWS 凭证中推断出 IdentityId?或者,如果他们不必匹配,那么从技术上讲,这是否意味着任何恶意用户都可以访问该数据集,前提是他或她拥有原始用户的 Cognito ID?或者调用 ListDatasets 是否根据身份提供者的令牌重新验证 Cognito ID?在这种情况下,我应该在我的网站中缓存什么作为 cookie,这样用户就不必每次都登录?
现在我正在缓存 CognitoId,但我担心如果暴露该数据将被泄露(或暴力攻击),如果它不是安全漏洞,那么我是否必须让用户每次他们想要同步他们的数据时重新验证他们的供应商?这里的解决方案是什么?
如有任何帮助,我们将不胜感激。
编辑 1:
我认为我发现的是在 Web 浏览器中使用 CognitoSync 的缓存问题,this question 可能指向相同的问题。这是我期待的身份验证流程:
- 登录 Web Federated Auth Provider(OIDC,例如 Google)=> returns 临时令牌。
- 使用令牌从 Cognito 获取临时凭证和 IdentityId。
- 缓存东西.
- 激活 CognitoSync 管理器进行同步。
一段时间后:
- 使用缓存的 something,重新运行同步。
问题:
- 如果我缓存 OIDC 提供商令牌,我可以重新生成 AWS 凭证,但它会在 1 小时后过期。
- 如果我缓存 AWS 凭据,我可以重新发出 Sync,但凭据也会过期。
- 如果我缓存了IdentityId我就无法同步,那我缓存什么呢?
结论:
- 如果需要 AWS 凭据来发出同步调用,为什么 listDatasets 在 API 调用中再次需要 IdentityId,AWS CognitoSync 无法反向查找凭据以确定分配给这些凭据的 IdendityId 是什么?
- [cognito sdk](https://github.com/aws/amazon-cognito-js) 真的有效吗?
- 如果每次用户想要同步时我都想避免 Auth 流程,我是否被迫直接使用 DynamoDB 进行同步?
- Android SDK 有一个 [Caching Provider](http://docs.aws.amazon.com/AWSAndroidSDK/latest/javadoc/com/amazonaws/auth/CognitoCachingCredentialsProvider.html),做这样的事情不存在浏览器? (这真的有用吗?)
- [Developer docs](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html) 参考刷新令牌,这只能在当前令牌仍处于活动状态时完成: (.
也不尽然。 Cognito 将根据为其创建 AWS 凭证的身份 ID 验证给定的身份 ID。因此,出于您对欺骗的担忧,它不会允许用户 A 仅通过知道他们的身份 ID 来获取用户 B 的同步数据。
似乎有两个问题:
- Cognito 根据 IdentityId 验证 AWS 凭证,因此没有安全漏洞。然而,API 将其作为参数包含在内仍然没有意义,亚马逊可能需要更新 API。
- 您 运行 遇到的问题是身份提供者应该提供一种方法来为每个请求授权获取必要的访问令牌,而不需要用户每次都授予权限。向提供商授权,然后获取访问令牌(或 id_token),并在您每次要同步时将其作为该提供商的登录令牌发送给 Cognito。你实际上不需要缓存任何东西。
- 对于 Google,请求如下所示:
var nonce = createNonce();
setCookie('GoogleAuthNonce', nonce, 1);
var paramString = $.param({
response_type:'id_token',
scope: 'openid', //email, profile',
client_id: GOOGLE_CLIENT_ID,
nonce: nonce,
login_hint: 'service_email_address',
prompt: 'none',
redirect_uri: 'http://service.com'
});
window.location.href = `https://accounts.google.com/o/oauth2/v2/auth?${paramString}`;
如果用户只能访问他或她的数据集,为什么 IdentityId 是一个必须在此 API 调用 (ref) 上设置的字段。无法从 AWS 凭证中推断出 IdentityId?或者,如果他们不必匹配,那么从技术上讲,这是否意味着任何恶意用户都可以访问该数据集,前提是他或她拥有原始用户的 Cognito ID?或者调用 ListDatasets 是否根据身份提供者的令牌重新验证 Cognito ID?在这种情况下,我应该在我的网站中缓存什么作为 cookie,这样用户就不必每次都登录?
现在我正在缓存 CognitoId,但我担心如果暴露该数据将被泄露(或暴力攻击),如果它不是安全漏洞,那么我是否必须让用户每次他们想要同步他们的数据时重新验证他们的供应商?这里的解决方案是什么?
如有任何帮助,我们将不胜感激。
编辑 1:
我认为我发现的是在 Web 浏览器中使用 CognitoSync 的缓存问题,this question 可能指向相同的问题。这是我期待的身份验证流程:
- 登录 Web Federated Auth Provider(OIDC,例如 Google)=> returns 临时令牌。
- 使用令牌从 Cognito 获取临时凭证和 IdentityId。
- 缓存东西.
- 激活 CognitoSync 管理器进行同步。
一段时间后:
- 使用缓存的 something,重新运行同步。
问题:
- 如果我缓存 OIDC 提供商令牌,我可以重新生成 AWS 凭证,但它会在 1 小时后过期。
- 如果我缓存 AWS 凭据,我可以重新发出 Sync,但凭据也会过期。
- 如果我缓存了IdentityId我就无法同步,那我缓存什么呢?
结论:
- 如果需要 AWS 凭据来发出同步调用,为什么 listDatasets 在 API 调用中再次需要 IdentityId,AWS CognitoSync 无法反向查找凭据以确定分配给这些凭据的 IdendityId 是什么?
- [cognito sdk](https://github.com/aws/amazon-cognito-js) 真的有效吗?
- 如果每次用户想要同步时我都想避免 Auth 流程,我是否被迫直接使用 DynamoDB 进行同步?
- Android SDK 有一个 [Caching Provider](http://docs.aws.amazon.com/AWSAndroidSDK/latest/javadoc/com/amazonaws/auth/CognitoCachingCredentialsProvider.html),做这样的事情不存在浏览器? (这真的有用吗?)
- [Developer docs](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html) 参考刷新令牌,这只能在当前令牌仍处于活动状态时完成: (.
也不尽然。 Cognito 将根据为其创建 AWS 凭证的身份 ID 验证给定的身份 ID。因此,出于您对欺骗的担忧,它不会允许用户 A 仅通过知道他们的身份 ID 来获取用户 B 的同步数据。
似乎有两个问题:
- Cognito 根据 IdentityId 验证 AWS 凭证,因此没有安全漏洞。然而,API 将其作为参数包含在内仍然没有意义,亚马逊可能需要更新 API。
- 您 运行 遇到的问题是身份提供者应该提供一种方法来为每个请求授权获取必要的访问令牌,而不需要用户每次都授予权限。向提供商授权,然后获取访问令牌(或 id_token),并在您每次要同步时将其作为该提供商的登录令牌发送给 Cognito。你实际上不需要缓存任何东西。
- 对于 Google,请求如下所示:
var nonce = createNonce();
setCookie('GoogleAuthNonce', nonce, 1);
var paramString = $.param({
response_type:'id_token',
scope: 'openid', //email, profile',
client_id: GOOGLE_CLIENT_ID,
nonce: nonce,
login_hint: 'service_email_address',
prompt: 'none',
redirect_uri: 'http://service.com'
});
window.location.href = `https://accounts.google.com/o/oauth2/v2/auth?${paramString}`;