在lambda函数中接收的令牌在APIG中返回Unauthorized

时间:2016-11-07 15:02:39

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

这些是我在AWS中的第一步,特别是Cognito。所以请耐心等待我,因为我对所有概念感到困惑,文档不容易理解。

所以我设置了3个lambda函数,一个用于创建用户,一个用于确认用户,另一个用于验证用户。

前2个工作正常,我的用户创建了一个确认。现在我坚持第三个应该返回一个在APIG中使用的令牌,我用我的认知授权器设置了一个简单的端点。

在APIG /授权人/ Cognito Pool Authorizers部分进行测试后,我收到的每个令牌都会返回Unauthorized。

我的“登录”代码如下:

const AWS = require('aws-sdk');

exports.handler = (event, context, callback) => {
  AWS.config.apiVersions = {
    cognitoidentityserviceprovider: '2016-04-18'
  };
  AWS.config.region = 'us-east-1'; // Region
  /*AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'MY_IDENTITY_POOL_ID',
  });*/

  var identityId = null;
  var params = {
    IdentityPoolId: 'MY_IDENTITY_POOL_ID',
    IdentityId: identityId,
    Logins: {
        'login.auth.MYPROJECT': 'MY_USERNAME'
    },
    TokenDuration: 86400
  };

  var cognito = new AWS.CognitoIdentity({
    region: AWS.config.region
  });

  cognito.getOpenIdTokenForDeveloperIdentity(params, function(err, data) {
    if (err) {
        return callback(err);
    }
    else {
        /*AWS.config.credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: params.IdentityPoolId
        });*/

        AWS.config.credentials.get(function(){
            // Credentials will be available when this function is called.
            var accessKeyId = AWS.config.credentials.accessKeyId;
            var secretAccessKey = AWS.config.credentials.secretAccessKey;
            var sessionToken = AWS.config.credentials.sessionToken;

            callback(null, {
                identityId: data.IdentityId, 
                token: data.Token,
                accessKeyId: accessKeyId,
                secretAccessKey: secretAccessKey,
                sessionToken: sessionToken
            });
        });
      }
  });
}

token和sessionToken都返回Unauthorized。有人能告诉我这里缺少什么吗?

非常感谢。

编辑2016-11-15

'register'lambda代码:

const AWS = require('aws-sdk');

exports.handler = (event, context, callback) => {
    AWS.config.region = 'us-east-1'; // Region
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'MY_IDENTITY_POOL_ID',    
    });

    var poolData = { 
        UserPoolId : 'MY_USER_POOL_ID',
        ClientId : 'MY_CLIENT_ID'
    };

    var userPool = new AWS.CognitoIdentityServiceProvider(poolData);
    var email = "myemail+" + Math.floor(Math.random() * (100 - 1) + 1) + "@example.com";
    var params = {
      ClientId: 'MY_CLIENT_ID', 
      Password: '1234567890', 
      Username: 'testaccount' + Math.floor(Math.random() * (100 - 1) + 1), 
      UserAttributes: [
        {
          Name: 'email', 
          Value: email
        }
      ]
    };

    userPool.signUp(params, function(err, result){
        if (err) {
            console.log(err)
            return;
        }

        callback(null, {
            "message": "Hello from Lambda",
            "data": result
        });
    });
};

我的'激活'lambda代码如下:

const AWS = require('aws-sdk');

exports.handler = (event, context, callback) => {
    AWS.config.region = 'us-east-1'; // Region
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'MY_IDENTITY_POOL_ID',
    });

    var poolData = { 
      UserPoolId : 'MY_USER_POOL_ID',
      ClientId : 'MY_CLIENT_ID'
    };

    var userPool = new AWS.CognitoIdentityServiceProvider(poolData);
    var email = "email_address@example.com";
    var params = {
      ClientId: 'MY_CLIENT_ID', 
      Username: 'test_username', 
      ForceAliasCreation: false,
      ConfirmationCode: '927000'
    };


    userPool.confirmSignUp(params, function(err, result){
        if (err) {
            console.log(err)
            return;
        }

        callback(null, {
            "message": "Hello from Lambda",
            "data": result
        });
    });
};

在APIG中,我创建了一个 Cognito用户池授权程序,选择了我的用户池,为其命名,并将身份令牌源设置为'method.request.header.Authorization'

方法请求下的我的APIG资源中,我已将授权设置为我的Cognito用户池授权程序。此外,必需的API密钥设置为 true ,我测试了几个密钥并且没有引起任何问题。

我希望这涵盖了一切。

0 个答案:

没有答案