AWS 知道返回 - 'Invalid Login Token. Not a Cognito Token'

AWS cognito returning - 'Invalid Login Token. Not a Cognito Token'

我能够为我的自定义身份验证提供程序(开发人员身份验证)成功检索身份令牌。这是使用 Cognito devauth 演示 servlet 实现的。

此令牌返回给浏览器运行AWS JS SDK。当我调用 getCredentialsForIdentiy 时,我收到 'Invalid Login Token' 错误。

POST https://cognito-identity.us-west-2.amazonaws.com/ 400 (Bad Request)
app.js:150 Error: Invalid login token. Not a Cognito token.
    at constructor.a (aws-sdk-2.58.0.min.js:41)
    at constructor.callListeners (aws-sdk-2.58.0.min.js:41)
    at constructor.emit (aws-sdk-2.58.0.min.js:41)
    at constructor.emitEvent (aws-sdk-2.58.0.min.js:41)
    at constructor.e (aws-sdk-2.58.0.min.js:41)
    at i.runTo (aws-sdk-2.58.0.min.js:43)
    at aws-sdk-2.58.0.min.js:43
    at constructor.<anonymous> (aws-sdk-2.58.0.min.js:41)
    at constructor.<anonymous> (aws-sdk-2.58.0.min.js:41)
    at constructor.callListeners (aws-sdk-2.58.0.min.js:41) "NotAuthorizedException: Invalid login token. Not a Cognito token.
    at constructor.a (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:615)
    at constructor.callListeners (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:30513)
    at constructor.emit (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:30224)
    at constructor.emitEvent (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:16590)
    at constructor.e (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:12285)
    at i.runTo (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:43:7277)
    at https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:43:7482
    at constructor.<anonymous> (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:12495)
    at constructor.<anonymous> (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:16645)
    at constructor.callListeners (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:30619)"

我将以下参数传递给 getCredentialsForIdentity。

identityId: <returned from servlet in region:guid format>
customRoleArn: <that maps to authenticated role>
Logins: <cognito-identity.amazonaws.com = token returned by congito>

我注意到新的 congnito 身份是使用 id 浏览器创建的。因此,令牌与 servlet 的交互似乎是正确的。但是令牌被拒绝了。

我在这里错过了什么?我该如何进一步排除故障?

编辑: 浏览器客户端:javascript sdk,版本 2.58。 本质上是将 JS 客户端写入 this demo 。修改只是为了获取令牌作为登录调用本身的一部分。生成的令牌对应一个只有 IOT 客户端访问权限的角色。 (我想知道该政策是否需要扩大)。最终,用户将根据内部 ID 存储而不是此演示进行验证。

编辑 2: 我没有针对 Cognito 服务调用 getCredentialsForIdentiy,而是针对 STS 调用了 assumeRoleWithWebIdentity 并且成功了。使用基本流程而不是增强流程 here. 。真的不确定为什么增强流不起作用,但现在将采用基本流方法。

因此,AWS 文档 here 要么不准确,要么记录了一个低效的场景。

使用 JavaScript Cognito API,我的开发人员提供商返回的令牌无法与 GetCredentialsForIdentity 一起用于 Cognito API。 (这就是促使我问这个问题的原因)。

但是,我可以对 STS API 使用相同的令牌并调用 AssumeRoleWithWebIdentity,这基本上 returns 与上面的 GetCredentialsForIdentity 相同的响应参数。这是我采取的方法。

第一个 link 中的基本身份验证流程文档似乎不准确。因为它列出了 'get credentials' 和 'assume role' 作为必需的步骤,但实际上只需要一个。此外,从浏览器中,这是对亚马逊服务的 API 调用。因此,如果有效,使用 Enhanced Flow 而不是 Basic 似乎并不是一个优势。