https://api.amazon.com/auth/o2/tokeninfo上来自AWS Cognito的invalid_token的可能原因

时间:2018-02-23 02:11:52

标签: oauth-2.0 amazon-cognito

我相信我错过了隐式授权流程并在aws cognito中访问令牌。

到目前为止:

  1. 拥有一个用户池,其客户端应用程序已配置为隐式流和范围openid,profile,aws.cognito.signin.user.admin

  2. 使用stack overviewofficial documentation以及older white papers来实现:

  3. 登录过程,重定向到aws cognito UI,并返回到我的应用程序,其中包含URL的片段部分中的标记和其他信息。

  4. access_token值在jwt.io处解析,签名使用aws jwt tool

  5. 签出

    问题:

    recommended step是通过tokeninfo api调用“验证访问令牌属于我们”。 当我尝试通过javascript代码调用tokeninfo并通过postman进行测试时(使用:https://api.amazon.com/auth/o2/tokeninfo?access_token=eyJraWQiOiJoVFBa ...)

    我得到了结果:

    {
    "error_description": "The request has an invalid parameter : access_token",
    "error": "invalid_token"
    }
    

    和http标头:

    x-amzn-errortype: InvalidTokenException:http://internal.amazon.com/coral/com.amazon.panda/
    

    我试过的变种:

    • 我已经尝试过直接调用用户配置文件(使用Authorization标头,查询字符串和x-amz-access-token标头)。

    • 我尝试过调整参数名称(错误变成“access_token required”或类似的东西

    • 我已尝试调整用户池中的范围

    • 我尝试过添加资源服务器(虽然我还没有...)

    登录后的重定向如下所示:

      https://staging.example.com/loginresult.html#id_token=eyJraWQiO<tokenremoved>&access_token=eyJraWQiOiJoVFBa<tokenremoved>&expires_in=3600&token_type=Bearer&state=whateverdevwants
    

    令牌的解析值(通过jwt.io)是:

    {
    "sub": "5510a27d-ebcb-4883-8680-a66fd0462279",
    "token_use": "access",
    "scope": "aws.cognito.signin.user.admin openid profile",
    "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_OF5OOfdx0",
    "exp": 1519352461,
    "iat": 1519348861,
    "version": 2,
    "jti": "31950a91-e2a5-4060-8c31-977f49802d35",
    "client_id": "3iuhnprmod0josge24ogarecfp",
    "username": "5510a27d-ebcb-4883-8680-a66fd0462279"
    }
    

    更新:如下所述:只是不要这样做,它将来自cognito的jwt令牌与“使用亚马逊登录”正在使用的内容混淆。

1 个答案:

答案 0 :(得分:0)

在您从Amazon引用的示例中,他们使用urllib.quote_plus对访问令牌进行编码,例如在他们的PHP示例中。

确保您使用encodeURI在您的javascript代码中对访问令牌进行URL编码。

如果令牌已过期,也可能会返回错误,因此请确保验证新建的令牌。到期时间为3600秒 - 因此请确保令牌不到一小时。

修改

看起来Cognito的文档与LWA(使用amazon登录)auth flow非常不同。您链接到的示例中的令牌甚至不是JWT令牌!

Cognito documentation here解释了如何验证JWT令牌。 查看Using ID Tokens and Access Tokens in your Web APIs段落。