0

我能够成功检索我的自定义身份验证提供程序(开发人员身份验证)的身份标记。这是使用Cognito devauth演示servlet实现的。AWS认证返回 - '登录令牌无效。不是Cognito令牌'

此令牌返回给运行AWS JS SDK的浏览器。当我打电话给getCredentialsForIdentiy时,我收到'无效的登录令牌'错误。

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 Service调用getCredentialsForIdentiy,而是针对STS调用了assumeRoleWithWebIdentity并且工作正常。使用基本流程而不是增强流程here.。真的不知道为什么增强流量不起作用,但现在将采取基本的流量方法。

+1

您正在使用哪个SDK?你能否详细说明你如何管理这个流程?你描述的内容听起来很对,所以它应该是一些小事。 –

+0

谢谢!增加了更多细节。 – user1452132

回答

0

因此,AWS文档here要么不准确,要么记录效率低下的情况。

使用JavaScript Cognito API,我的Developer Provider返回的令牌无法与针对Cognito API的GetCredentialsForIdentity一起使用。 (这是促使我问这个问题的原因)。

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

第一个链接中的基本身份验证流文档看起来不准确。因为它按要求的步骤列出了“取得凭证”和“承担角色”,但实际只需要一个。另外,从浏览器,这是一个API调用到亚马逊服务。因此,如果使用Enhanced Flow而不是Basic,那么它看起来没有什么优势。