为什么AWS CognitoSync ListDatasets需要IdentityId?

时间:2016-04-18 04:57:33

标签: amazon-web-services amazon-cognito

如果用户只能访问他或她的数据集,为什么IdentityId必须在此API调用(ref)上设置一个字段。无法从AWS凭证中推断出IdentityId吗?或者,如果他们不必匹配,那么技术上不会意味着任何恶意用户可以访问该数据集,如果他或她拥有原始用户的Cognito ID?或者对ListDatasets的调用是否会根据身份提供者的令牌重新验证Cognito ID?在这种情况下,我应该将我的网站缓存为cookie,以便用户不必每次都登录?

现在我正在缓存CognitoId,但我担心如果暴露出数据会受到攻击(或暴力攻击),并且如果它不是安全漏洞,那么我是否必须让用户重新使用 - 每次想要同步数据时,都要对其提供商进行身份验证?这里有什么解决方案?

任何帮助都将不胜感激。

编辑1
我认为我发现的是在Web浏览器中使用CognitoSync的缓存问题,而this question可能指向同一问题。以下是我期待的身份验证流程:

      
  • 登录Web Federated Auth Provider(OIDC,例如Google)=>返回临时令牌。
  •   
  • 使用令牌从Cognito获取临时凭证和IdentityId。
  •   
  • 缓存 Something
  •   
  • 激活CognitoSync管理器以进行同步。

一段时间后:

      
  • 使用缓存的某物,重新运行同步。

问题:

      
  • 如果我缓存OIDC提供程序令牌,我可以重新生成AWS凭据,但它会在1小时后过期。
  •   
  • 如果我缓存AWS凭据,我可以重新发出同步,但凭据已过期。
  •   
  • 如果我缓存IdentityId,我无法同步,那么我该缓存什么?

结论:

      
  • 如果需要AWS Credentials来发出同步调用,为什么listDatasets在API调用中再次需要IdentityId,AWS CognitoSync是否可以反向查找凭据以确定为这些凭据分配的IdendityId是什么?
  •   
  • [cognito sdk](https://github.com/aws/amazon-cognito-js)实际上有效吗?
  •   
  • 如果我想在每次用户想要同步时避免使用Auth流,我是否被迫直接使用DynamoDB进行同步?
  •   
  • Android SDK有一个[缓存提供商](http://docs.aws.amazon.com/AWSAndroidSDK/latest/javadoc/com/amazonaws/auth/CognitoCachingCredentialsProvider.html),这样的事情不存在浏览器? (这甚至有用吗?)
  •   
  • [开发者文档](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html)引用刷新令牌,这只能在当前令牌仍处于活动状态时完成:(。

2 个答案:

答案 0 :(得分:0)

它也不是。 Cognito将根据为其创建AWS凭据的身份ID验证给定的身份ID。因此,对于您对欺骗的关注,仅仅通过了解其身份ID就不允许用户A获取用户B的同步数据。

答案 1 :(得分:0)

似乎有两个问题:

  • 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}`;