如何从 Amplify 获取与 API 网关和 cognito 一起使用的访问令牌?
Posted
技术标签:
【中文标题】如何从 Amplify 获取与 API 网关和 cognito 一起使用的访问令牌?【英文标题】:How to get the access token from Amplify which works with API gateway and cognito? 【发布时间】:2022-01-11 02:41:30 【问题描述】:我正在尝试从 Amplify(使用 Vue)获取正确的令牌以使用 Cognito 登录 API 网关。
到目前为止,我尝试了这些:
Auth.currentSession().then(data =>
console.log('idToken: %s',data.idToken.jwtToken)
).catch(err => console.log(err));
Auth.currentSession().then(data =>
console.log('accessToken: ',data.accessToken)
).catch(err => console.log(err));
Auth.currentSession().then(data =>
console.log('jwtToken: ',data.accessToken.jwtToken)
).catch(err => console.log(err));
但如果我将它们复制给邮递员,它们都不起作用。
唯一有效的方法是,如果我从测试登录 UI 中获取 access_token。
--编辑--
看起来 Amplify 提供的令牌的范围有误:
"scope": "aws.cognito.signin.user.admin"
hostet UI 的令牌是这样的:
"scope": "phone openid profile email",
提示:可以在https://jwt.io/上解码
关于 Amplify 的讨论:
https://github.com/aws-amplify/aws-sdk-android/issues/684
但我目前还没有解决办法
【问题讨论】:
您需要链接方法而不访问方法上的属性。 【参考方案1】:经过一番调查,似乎没有解决方案可以在 Amplify 中设置不同的范围。
现在我做了以下事情:
在 API Gateway 中设置此范围:
aws.cognito.signin.user.admin
(不确定这是否是安全问题!?)
现在我可以访问 lambda。由于我需要用户的电子邮件地址,因此我在 Python 中使用用户名(由访问令牌传递)请求 cognito。
client = boto3.client('cognito-idp')
user_details = client.admin_get_user(
Username=user_name,
UserPoolId=user_pool_id
)
logger.warning("user_details: ".format(user_details))
id_token 不能使用,因为它不包含通过 API 网关所需的范围信息。
【讨论】:
以上是关于如何从 Amplify 获取与 API 网关和 cognito 一起使用的访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章
AWS-amplify 在请求中包含 cognito Authorization 标头
如何获取和更新用户属性 AWS amplify angular 6
将现有 AppSync API 与/ Amplify 一起使用
放大:即使在 API 网关和 Lambda 标头中启用了 CORS,但 CORS 标头“Access-Control-Allow-Origin”缺失错误