经过身份验证的登录后,AWS Cognito NotAuthorizedException“无效的访问令牌”错误

时间:2019-08-03 21:19:26

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

我有一个AWS Cognito用户池/身份池,用于授权API网关后面的Lambda函数。我的lambda使用的是适用于节点的AWS开发工具包。登录过程正常。在我的函数中,我有一个CognitoIdentityServiceProvider对象,用于调用getUser函数。我给该函数提供的访问密钥来自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
}

在经过身份验证的请求中给我的令牌如何无效?我什至不知道如何调试它,或者我应该寻找什么问题。

我如何在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='my-test-user@domain.com' \
--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调用传递的访问令牌具有“ ASIA”前缀而不是“ AKIA”前缀(如果在此处与此相关)。我不确定要包含有关我的用户池或其他内容的其他信息,因此,如果这与解决方案有关,我将很乐意提供。

1 个答案:

答案 0 :(得分:1)

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