2017-04-24 62 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不在函數的作用域內,這很明顯,但是由於捕獲錯誤而保持沉默,我得到一個空對象。