Node.js 无法使用passport nodejs在docker google vm Instance中验证facebook应用程序

Node.js 无法使用passport nodejs在docker google vm Instance中验证facebook应用程序,node.js,google-cloud-platform,passport.js,docker-swarm,passport-facebook,Node.js,Google Cloud Platform,Passport.js,Docker Swarm,Passport Facebook,配置facebook应用程序以在没有域的google vm实例中进行身份验证 这是一个新的Linux服务器,运行mongodb、nodejs。我已经在localhost上尝试并成功地进行了身份验证,但在GoogleVM实例中,它不起作用。我已经将我的google vm instabce的外部ip添加到FaceBook应用程序的白名单服务器ip中,但它仍然不起作用 在my passport.js中实现passport节点。它位于配置文件夹中: const FacebookTokenStrategy

配置facebook应用程序以在没有域的google vm实例中进行身份验证

这是一个新的Linux服务器,运行mongodb、nodejs。我已经在localhost上尝试并成功地进行了身份验证,但在GoogleVM实例中,它不起作用。我已经将我的google vm instabce的外部ip添加到FaceBook应用程序的白名单服务器ip中,但它仍然不起作用

在my passport.js中实现passport节点。它位于配置文件夹中:

const FacebookTokenStrategy = require('passport-facebook-token');
const passportConfig = (passportSettings, passport) => {
    passport.use('facebookToken', new FacebookTokenStrategy({
    clientID: passportSettings.oauth.facebook.clientID,
    clientSecret: passportSettings.oauth.facebook.clientSecret,
    passReqToCallback: true,
    enableProof: true
    }, function (req, accessToken, refreshToken, profile, done) {}
}
module.exports = passportConfig;
下面是运行节点服务的index.js。我在这里创建了一个passport实例并需要它。您可以忽略另一个对象,如存储库、userController、di等。。。要生成测试代码,请执行以下操作:

'use strict'
const {EventEmitter} = require('events')
const server = require('./server/server')
const repository = require('./repository/repository')
const userControler = require('./api/users')
const di = require('./config')
const mediator = new EventEmitter()
const passport = require('passport')
const { createContainer, asValue } = require('awilix')

process.on('uncaughtException', (err) => {
  console.error('Unhandled Exception', err)
})

process.on('uncaughtRejection', (err, promise) => {
  console.error('Unhandled Rejection', err)
})

const container = createContainer()
require('./config/utils/passport')( container.resolve('passportSettings'), passport)
const passportSettings = {
  JWT_SECRET : 'codeworkrauthentication',
  oauth: {
     google: {
       clientID: 'number',
       clientSecret: 'string'
     },
     facebook: {
       clientID: 'number',
       clientSecret: 'string'
    }
  }
}
const serverSettings = {
  port: process.env.PORT || 3000,
  ssl: require('./ssl')
}

container.register({
    passportSettings : asValue(passportSettings),
    serverSettings : asValue(serverSettings)
})

server.start(container)
.then(app => {
  console.log(`Server started succesfully, running on port: ${container.cradle.serverSettings.port}.`)
})
这是我在index.js文件中调用的server.js。在其中,我绑定到身份验证api:

const express = require('express')
const morgan = require('morgan')
const helmet = require('helmet')
const bodyparser = require('body-parser')
const cors = require('cors')
const _api = require('../api/authentication')

const start = (container) => {
  return new Promise((resolve, reject) => {
    const {port, ssl} = container.resolve('serverSettings')
    const repo = container.resolve('repo')
    const userControler = container.resolve('userControler')
    if (!repo) {
      reject(new Error('The server must be started with a connected repository'))
    }
    if (!port) {
      reject(new Error('The server must be started with an available port'))
    }

    const app = express()
    app.use(morgan('dev'))
    app.use(bodyparser.json())
    app.use(cors())
    app.use(helmet())
    app.use((err, req, res, next) => {
      eject(new Error('Something went wrong!, err:' + err))
      res.status(500).send('Something went wrong!')
      next()
    })
    app.use((req, res, next) => {
      req.container = container.createScope()
      next()
    })

    const api = _api.bind(null, {repo}, {userControler})
    api(app)

    const server = app.listen(port, () => resolve(server))

  })
}
这是我的authentication.js,包含在api文件夹中,在server.js中调用。我在其中调用passport实例:

const passport = require('passport')
const status = require('http-status')

module.exports = ({repo}, {userControler}, app) => {
    app.post('/authentication-service/signup-with-facebook',passport.authenticate('facebookToken', {session:false}), userControler.facebookOAuth);
}
因此,您可以删除配置设置并直接设置到passportSetting和serverSettings中。以下是我的护照设置结构:

const passportSettings = {
  JWT_SECRET : 'codeworkrauthentication',
  oauth: {
     google: {
       clientID: 'number',
       clientSecret: 'string'
     },
     facebook: {
       clientID: 'number',
       clientSecret: 'string'
     }
  }
}
关于我在server.js中调用的服务器设置:

const serverSettings = {
  port: process.env.PORT || 3000,
  ssl: require('./ssl')
} 
当我在google vm实例中作为节点应用程序运行时,它会出错:

can not fetch user profile
作为我的调试。它在/config/passport.js上死机:

passport.use('facebookToken', new FacebookTokenStrategy({
    clientID: passportSettings.oauth.facebook.clientID,
    clientSecret: passportSettings.oauth.facebook.clientSecret,
    passReqToCallback: true,
    enableProof: true
}, function (req, accessToken, refreshToken, profile, done) {}
错误代码:

Error at passport-facebook-token/lib/index.js:155:32

在谷歌云中。我有一个GoogleVM实例,它是反向的静态ip,并且已经被一个域指向了。但它仍然不起作用。不知道为什么?

嘿,有人帮帮我!!我不知道发生了什么事。我无法将域添加到我的云,因为它处于开发模式。那么,为什么会发生这种情况,为什么facebook应用程序会在google cloud中阻止身份验证?您可以指定您正在使用的google cloud产品吗?此外,如果可能的话,您是否有此代码可供下载,以便我尝试复制它@杰克莱恩。我已经编辑了我的问题。其中,我总结了服务器代码。您可以修改它,并使用您的谷歌云将其作为节点服务运行,并将您的facebook应用程序作为身份验证服务运行。非常感谢你!很抱歉,我没有足够的声誉,无法在我的问题中添加图像以使其更易于理解