如何从 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”缺失错误

我应该如何配置 Apollo Nuxt 模块以向我的查询提供 AWS Amplify api 密钥?

如何使用 Amplify 为 GraphQL API (AWS AppSync) 生成类