2017-04-24 61 views
1

我正在API网关后面编写AWS Lambda函数,该函数使用Facebook和我们的应用ID验证令牌,以便我们可以确认用户的身份,以便他可以删除其资源。用户从Facebook登录发送他的用户ID和令牌,我检查该令牌是否有效以及是否适用于同一用户。在实现中,我使用承诺,但问题是第一个完全没有执行。我首先调用getFacebookAccessToken,以便我可以调用API并在响应中解决或拒绝,但代码没有达到那一点。下面是函数:未在https中解析的承诺呼叫

'use strict'; 
 

 
const https = require('https'); 
 
const querystring = require('querystring'); 
 

 
exports.handler = (event, context, callback) => { 
 

 
\t if (typeof event.body.token === 'undefined' || event.body.token === '') { 
 

 
\t \t context.succeed({ 
 
\t \t \t "result":"false", 
 
\t \t \t "message": `InputError: token is not defined or it is empty` 
 
\t \t }); 
 
\t \t return; 
 
\t } 
 
\t if (typeof event.body.userId === 'undefined' || event.body.userId === '') { 
 

 
\t \t context.succeed({ 
 
\t \t \t "result":"false", 
 
\t \t \t "message": `InputError: userId is not defined or it is empty` 
 
\t \t }); 
 
\t \t return; 
 
\t } 
 

 
\t getFacebookAccessToken() 
 
\t \t .then((appAccessToken) => { 
 

 
\t \t \t return checkFacebookId(appAccessToken, event.body.token, event.body.userId); 
 
\t \t }) 
 
\t \t .then((result) => { 
 

 
\t \t \t console.log('Done'); 
 
\t \t \t context.succeed(result); 
 
\t \t }) 
 
\t \t .catch((error) => { 
 

 
\t \t \t context.succeed(error); 
 
\t \t }); 
 
}; 
 

 
let checkFacebookId = (appAccessToken, token, facebookId) => { 
 

 
\t return new Promise((resolve, reject) => { 
 

 
\t \t let params = { 
 
\t \t \t input_token: token, 
 
\t \t \t access_token: appAccessToken 
 
\t \t }; 
 

 
\t \t let requestParams = querystring.stringify(params); 
 

 
\t \t let configOptions = { 
 
\t \t \t method: "get", 
 
\t \t \t hostname: "graph.facebook.com", 
 
\t \t \t path: "/debug_token?" + requestParams 
 
\t \t }; 
 

 
\t \t let request = https.request(configOptions, function (result) { 
 

 
\t \t \t let response = ""; 
 
\t \t \t result.setEncoding('utf8'); 
 
\t \t \t result.on('data', function (chunk) { 
 

 
\t \t \t \t response += chunk; 
 
\t \t \t }); 
 

 
\t \t \t result.on('end', function() { 
 

 
\t \t \t \t const fbResponse = JSON.parse(response); 
 

 
\t \t \t \t if (result.statusCode.toString() === '200') { 
 

 
\t \t \t \t \t console.log(`Validating facebook token: OK`); 
 

 
\t \t \t \t \t if (typeof fbResponse.data === 'undefined') { 
 
\t \t \t \t \t \t reject({ 
 
\t \t \t \t \t \t \t "result": "false", 
 
\t \t \t \t \t \t \t "message": "Token not valid" 
 
\t \t \t \t \t \t }); 
 
\t \t \t \t \t } 
 
\t \t \t \t \t if (fbResponse.data.user_id === facebookId) { 
 
\t \t \t \t \t \t resolve({ 
 
\t \t \t \t \t \t \t "result": "true" 
 
\t \t \t \t \t \t }); 
 
\t \t \t \t \t } else { 
 
\t \t \t \t \t \t reject({ 
 
\t \t \t \t \t \t \t "result": "false", 
 
\t \t \t \t \t \t \t "message": "Token not valid" 
 
\t \t \t \t \t \t }); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t \t else { 
 

 
\t \t \t \t \t reject({ 
 
\t \t \t \t \t \t "result": "false", 
 
\t \t \t \t \t \t "error": { 
 
\t \t \t \t \t \t \t "Message": `Failed validating facebook user access token`, 
 
\t \t \t \t \t \t \t "statusCode": result.statusCode, 
 
\t \t \t \t \t \t \t "token_valid": fbResponse 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t }); 
 
\t \t \t \t } 
 
\t \t \t }); 
 
\t \t }); 
 

 
\t \t request.on('error', function (error) { 
 
\t \t \t reject({ 
 
\t \t \t \t "result": "false", 
 
\t \t \t \t "message": "Error in Facebook", 
 
\t \t \t \t "error": error 
 
\t \t \t }); 
 
\t \t }); 
 

 
\t \t console.log(`Validating facebook token: PENDING`); 
 
\t \t request.end(); 
 
\t }); 
 
}; 
 

 
let getFacebookAccessToken =() => { 
 

 
\t return new Promise((resolve, reject) => { 
 

 
\t \t let params = { 
 
\t \t \t client_id: event.stage.fb_app_id, 
 
\t \t \t client_secret: event.stage.fb_app_secret, 
 
\t \t \t grant_type: "client_credentials" 
 
\t \t }; 
 

 
\t \t let requestParams = querystring.stringify(params); 
 

 
\t \t let configOptions = { 
 
\t \t \t method: "get", 
 
\t \t \t hostname: "graph.facebook.com", 
 
\t \t \t path: "/oauth/access_token?" + requestParams 
 
\t \t }; 
 
\t \t let request = https.request(configOptions, function (result) { 
 

 
\t \t \t let responseData = ""; 
 
\t \t \t result.setEncoding('utf8'); 
 
\t \t \t result.on('data', function (chunk) { 
 

 
\t \t \t \t responseData += chunk; 
 
\t \t \t }); 
 

 
\t \t \t result.on('end', function() { 
 
\t \t \t \t console.log(result); 
 
\t \t \t \t if (result.statusCode.toString() === '200') { 
 

 
\t \t \t \t \t console.log(`Getting Facebook Access Token: OK`); 
 
\t \t \t \t \t resolve(JSON.parse(responseData).access_token); 
 
\t \t \t \t } 
 
\t \t \t \t else { 
 

 
\t \t \t \t \t reject({ 
 
\t \t \t \t \t \t "result": "false", 
 
\t \t \t \t \t \t "error": { 
 
\t \t \t \t \t \t \t "Message": `Failed getting facebook access token`, 
 
\t \t \t \t \t \t \t "statusCode": result.statusCode 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t }); 
 
\t \t \t \t } 
 
\t \t \t }); 
 
\t \t }); 
 

 
\t \t request.on('error', function (error) { 
 
\t \t \t reject({ 
 
\t \t \t \t "result": "false", 
 
\t \t \t \t "message": "Error in Facebook", 
 
\t \t \t \t "error": error 
 
\t \t \t }); 
 
\t \t }); 
 

 
\t \t console.log(`Getting Facebook Access Token: PENDING`); 
 
\t \t request.end(); 
 
\t }); 
 
};

回答

1

有承诺内部JavaScript错误。 event.stage.fb_app_id和secret不在函数的作用域内,这很明显,但是由于捕获错误而保持沉默,我得到一个空对象。