【问题标题】:Cognito authorizing a user through AWS lambda functionCognito 通过 AWS lambda 函数授权用户
【发布时间】:2020-12-12 23:33:21
【问题描述】:

我使用 AWS Cognito,需要通过 lambda 函数授权用户。我在网上看到了一些例子,当我尝试应用它们时,Cognito 身份验证没有运行并且以某种方式被跳过:

const AWS = require('aws-sdk');
const AmazonCognitoIdentity = require('amazon-cognito-identity-js');
global.fetch = require("node-fetch");
const CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;
var AuthenticationDetails = AmazonCognitoIdentity.AuthenticationDetails;
var CognitoUser = AmazonCognitoIdentity.CognitoUser;

var USER_POOL_ID = 'my_pool_id';
var CLIENT_ID = 'my_client_id';

var idToken = '';


exports.handler = async (event, callback) => {
    var email = event['username'];
    var password = event['password'];
    var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails({
        Username: email,
        Password: password
    });
    
    const poolData = {
        UserPoolId: USER_POOL_ID,
        ClientId: CLIENT_ID
    };
    const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    var userData = {
        Username: email,
        Pool: userPool
    }
    var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: (result) => {
              var accessToken = result.getAccessToken().getJwtToken();
              console.log(result);
              console.log(accessToken);
              idToken = result.idToken.jwtToken;
              console.log(idToken);
              callback(null, accessToken);
            },  
        onFailure: (err) => {
            console.log(err);
            idToken = err;
            callback(err);
        },
    });

    console.log("cognitoUser after: ", cognitoUser);
};

我可以看到日志中打印了最后一个 console.log,但 lambda 似乎没有等待cognitoUser.authenticateUser 的请求解析,因为 onSuccess 或 onFailure 中的 console.log 都没有打印。

【问题讨论】:

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


    【解决方案1】:

    这里有几个选项

    1. exports.handler = async (event, callback) 中删除async

    2. 保持异步并将authenticateUser 包装为Promise 并使用await

      const res = await new Promise((resolve, reject) => {
           cognitoUser.authenticateUser(authenticationDetails, {
               onSuccess: (result) => {
                   var accessToken = result.getAccessToken().getJwtToken();
                   console.log(result);
                   console.log(accessToken);
                   idToken = result.idToken.jwtToken;
                   console.log(idToken);
                   resolve(accessToken);
                   },  
               onFailure: (err) => {
                   console.log(err);
                   idToken = err;
                   reject(err);
               },
           });
       }
      

    注意:代码未经测试。

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2020-01-10
      • 1970-01-01
      • 2017-04-13
      • 2022-11-10
      • 2019-12-12
      • 1970-01-01
      • 2021-10-22
      • 2019-07-24
      相关资源
      最近更新 更多