我相信我错过了隐式授权流程并在aws cognito中访问令牌。
到目前为止:
拥有一个用户池,其客户端应用程序已配置为隐式流和范围openid,profile,aws.cognito.signin.user.admin
使用stack overview和official documentation以及older white papers来实现:
登录过程,重定向到aws cognito UI,并返回到我的应用程序,其中包含URL的片段部分中的标记和其他信息。
access_token值在jwt.io处解析,签名使用aws jwt tool
问题:
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令牌与“使用亚马逊登录”正在使用的内容混淆。
答案 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
段落。