exports.lambdaHandler = function()

in lambda-authorizer/app.js [29:99]


exports.lambdaHandler =  function(event, context, callback) {
    //console.log(event);
    //console.log(context);
    var token = event.authorizationToken;
    //console.log(token);
    
    try {
        //Authing id token验证机制详见如下链接:
        //https://docs.authing.cn/authing/authentication/oidc/oidc-authorization#05-yan-zheng-accesstoken-he-idtoken-de-he-fa-xing

        //签名算法的选择:
        //如果需要与Cognito Identity Pool集成,则需要使用RS256算法,否则可以使用HS356算法,较为简化

        //针对使用HS256做为签名算法的 id token 验证: 
        //从Authing.cn控制台获取OIDC应用的App Secret并存入在Lambda环境变量中
        //const app_secret = process.env.Authing_App_Secret;
        //const decoded = jwt.verify(token, app_secret); 

        //针对使用RS256做为签名算法的 id token 验证: 

        //如果使用Authing的默认密钥进行签名,则需要用Authing对应的公钥进行签名验证
        //具体可查阅:https://docs.authing.cn/authing/authentication/oidc/oidc-authorization
        //pubkey = fs.readFileSync('authing_pubkey.pem')

        //如果使用自定的签名密钥,则在下方填入密钥(如下是示例应用的自定义签名密钥)
        let key =  jose.JWK.asKey({
          "n": "yycWRajkICDa2gJwXkeTug7MKhsP1CC-GQxljSw2ACE3MefE0Bsusoesik9DJP2yve8TmC1vo2Jqu02vTUhy2RWZOCLDInLbt2kHVW_LC-BmoktoMIkPkaBZIsRLPakqMp3CroR_thQ7hKTTle8S9i5PI49CEeUx4ANsfuawp7gW_sKCdR0VVCXwcGZvN7CDcYfHPse_7tn_PfoGSqzUHnglhnbIEHxd6ZgPdUW3KNshFzM78j7iCy0bGi-WGUM30CG0CBWXMNX2ZAC4q_LfVSpdnAHAzCS6AcAnzqtoKi7xdNuKtLCNfCB_0uE-TUGx0nPrlQ3g3HPgfPRP8C9NQw",
          "e": "AQAB",
          "use": "sig",
          "alg": "RS256",
          "kid": "xUhDE3A3FiCOtsxuS5K7WOBhiJKabB3ut-rWDu_l15E",
          "kty": "RSA"
        });
        pubkey = key.toPEM();

        console.log('RSA Pubkey: ' + pubkey);
        const decoded = jwt.verify(token, pubkey, { algorithms: ['RS256'] });

        console.log('expired: ' + decoded.exp)
        console.log('current: ' + Date.parse(new Date()) / 1000)
        //比较token expired时间
        const expired = (Date.parse(new Date()) / 1000) > decoded.exp        
        
        //针对原来使用Cognito User Pool的方案,需要迁移至Authing的时候:
        //可以通过自定义回复来模拟RequestContext中与Cognito相关的值,从而减少代码修改量:
        //一般来说使用Cognito的代码中会通过claims来获取Cognito用户名或id等
        //请参考: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html
        // const claims = {
        //         "cognito:username": decoded.username
        // }

        
      if (expired) {
        //Token过期
        callback("Error: Token Expired");
      }else {
        // 合法也没过期,正常放行
        console.log("Valid token.");

        //如果使用自定义回复:
        //callback(null, generatePolicy('user', 'Allow', event.methodArn, claims));

        //如果不使用自定义回复
        callback(null, generatePolicy('user', 'Allow', event.methodArn));
      }
    } catch (error) {
        //其他异常
        console.log(error);
        callback("Error: Invalid token"); // Return a 500 Invalid token response
    }
};