amazon-web-services - 经过身份验证登录后,AWS Cognito NotAuthorizedException "Invalid Access Token"错误

标签 amazon-web-services aws-lambda aws-api-gateway amazon-cognito

我设置了一个 AWS Cognito 用户池/身份池来授权 API 网关后面的 Lambda 函数。我的 lambda 使用适用于 Node.js 的 AWS 开发工具包。登录过程工作正常。在我的函数中,我有一个用于调用 getUser 函数的 CognitoIdentityServiceProvider 对象。我为函数提供的访问 key 来自 lambda 变量 event.requestContext.identity.accessKey。但是,函数调用失败,并通过我的 Cloud Watch 日志查看以下错误:

{
  "message": "Invalid Access Token",
  "code": "NotAuthorizedException",
  "time": "2019-08-03T20:34:50.511Z",
  "requestId": ...,
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 36.048605458111794
}

经过身份验证的请求中提供给我的 token 为何无效?我什至不确定如何调试它,或者我应该寻找什么问题。

我如何尝试在 lamdba 处理程序中进行调用的示例:

var AWS = require('aws-sdk');
AWS.config.region = "us-west-2";
let poolData = {
  UserPoolId: MY_POOL_ID,
  ClientId: MY_CLIENT_ID
};
const cognito = new AWS.CognitoIdentityServiceProvider(poolData);

export async function myHandler(event, context, cb) {
  var params = {
    AccessToken: event.requestContext.identity.accessKey
  };
  cognito.getUser(params, (err, user) => {
    if (err) {
      console.log(JSON.stringify(err));
    }
    let response = {
      statusCode: 200,
      headers: {
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Credentials": true,
      },
      body: { ... }
    };
    return cb(null, response);
  });
}

我可以使用 AWS Amplify 或 CLI 测试从 React UI 测试此 API 调用,两者都会在后端产生相同的结果。所以我认为这不一定是函数的调用方式。这是我用于 CLI 测试的方法,它将让用户登录到用户池并代表他们发出 API 请求:

npx aws-api-gateway-cli-test \
--username='<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1e7367336a7b6d6a336b6d7b6c5e7a71737f7770307d7173" rel="noreferrer noopener nofollow">[email protected]</a>' \
--password='password' \
--user-pool-id='us-west-2_000000000' \
--app-client-id='00000000000000000000000' \
--cognito-region='us-west-2' \
--identity-pool-id='us-west-2:000000000-0000-0000-0000-000000000000' \
--invoke-url='https://00000000000.execute-api.us-west-2.amazonaws.com/dev' \
--api-gateway-region='us-west-2' \
--path-template='/myHandler' \
--method='GET'

从 API 调用传递的访问 token 具有“ASIA”前缀,而不是“AKIA”前缀(如果与此处相关)。我不确定要包含有关我的用户池或其他任何内容的其他信息,因此如果这与解决方案相关,我很乐意提供。

最佳答案

您传递给getUser APIaccessKey不是它期望的 accessTokenevent.requestContext.identity.accessKey 是 IAM 用户访问 key ,而不是用户登录时 AWS Cognito 生成的 accessToken。您需要传递返回的 JWT 访问 token 通过 Cognito initiateAuth API 。发出请求时,请考虑在授权 header 中添加访问 token 。

关于amazon-web-services - 经过身份验证登录后,AWS Cognito NotAuthorizedException "Invalid Access Token"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57342172/

相关文章:

amazon-web-services - 使用 awscli 更新 cloudfront 配置

node.js - 当我保存()一个实体时出错 - 错误 : Cyclic dependency: "e" - AWS serverless with typeORM

aws-lambda - 无服务器 GraphQL 订阅

aws-lambda - 如何创建由另一个账户中的kinesis触发的lambda函数?

amazon-web-services - 如何从控制台获取aws apigateway中api的部署ID?

api - AWS API网关: route error

aws-lambda - 用于 Lambda 代理集成的 Terraform API 网关

amazon-web-services - AWS超低延迟读/写数据存储: EFS vs Dynamodb DAX vs ElastiCache

amazon-web-services - AWS ECS未链接我的容器

amazon-web-services - AWS Lambda 无法连接到 Parameter Store