为什么 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 可能指向相同的问题。这是我期待的身份验证流程:

一段时间后:

问题:

结论:

也不尽然。 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}`;