Node.js 无法使用passport nodejs在docker google vm Instance中验证facebook应用程序
配置facebook应用程序以在没有域的google vm实例中进行身份验证 这是一个新的Linux服务器,运行mongodb、nodejs。我已经在localhost上尝试并成功地进行了身份验证,但在GoogleVM实例中,它不起作用。我已经将我的google vm instabce的外部ip添加到FaceBook应用程序的白名单服务器ip中,但它仍然不起作用 在my passport.js中实现passport节点。它位于配置文件夹中: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
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应用程序作为身份验证服务运行。非常感谢你!很抱歉,我没有足够的声誉,无法在我的问题中添加图像以使其更易于理解