2017-04-24 3 views
1

Ich schreibe eine AWS Lambda-Funktion hinter API Gateway, die Tokens mit Facebook und unsere App-ID validiert, so dass wir die Identität des Benutzers bestätigen können, damit er seine Ressourcen löschen kann. Der Benutzer sendet seine Benutzer-ID und seinen Token vom Facebook-Login, ich überprüfe, ob das Token gültig ist und ob es für den gleichen Benutzer ist. In der Implementierung verwende ich Versprechungen, aber das Problem ist, dass die erste dann überhaupt nicht ausgeführt wird. Ich rufe zuerst getFacebookAccessToken auf, damit ich die API aufrufen kann und in der Antwort auflöse oder ablehne, aber der Code erreicht diesen Punkt nicht. Hier ist die Funktion:Versprechen löst nicht in https Anruf

'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 }); 
 
};

Antwort

1

Es war ein JavaScript-Fehler in der Verheißung. Die event.stage.fb_app_id und secret wo nicht im Umfang der Funktion, was ziemlich offensichtlich ist, aber wegen des Catch war der Fehler still und ich bekam ein leeres Objekt.

Verwandte Themen