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