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