我一直在使用passport和postgres进行google身份验证,重定向URI返回一个错误(状态代码500)。我认为所做的功能就是问题所在,但我不知道到底是哪里出了问题。我试着放置原木。serializeUser函数没有触发,我尝试记录日志。
这是我的护照设置
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20');
const GithubStrategy = require('passport-github2');
const localStrategy = require('passport-local');
//const bcrypt = require('bcrypt');
const db = require('./db/db');
passport.serializeUser((user, done) => {
console.log('here?);
done(new Error('Serialize problem'), user.id); //first arg is the error
})
passport.deserializeUser((id, done) => {
db.query(
'SELECT id FROM "Users" WHERE id=$1', [id],
(error, results) => {
if (error) {
throw new Error('Problemo numero 1')
}
console.log(results.rows[0])
done(new Error('Problemo'), results.rows[0]); //first arg is the error
})
});
passport.use(new GoogleStrategy({
//options for the strategy
callbackURL: 'http://localhost:9000/auth/google/redirect',
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET
}, (accesToken, refreshToken, profile, done) => {
//passport callback function
console.log('passport callback function fired')
console.log(profile)
db.query(
`SELECT * FROM "Users" WHERE id=${profile.id}`,
(error, results) => {
if (results.rows.length === 0) {
const date = new Date();
const password = Math.floor(Math.random() * 100000);
db.query(
'INSERT INTO "Users" (id, username, password, creation_date) VALUES ($1, $2, $3, $4)', [profile.id, profile.displayName, 0, date],
(error, results) => {
if (error) {
throw new Error('Insert error')
}
}
)
done(new Error('select error'), profile.id)
} else {
console.log(`Current user is id=${profile.id}`)
done(new Error('select error 2'), profile.id)
console.log('works?')
}
}
)
}));和快速设置
var createError = require('http-errors');
var express = require('express');
const passport = require('passport');
var path = require('path');
var cookieParser = require('cookie-parser');
var cookieSession = require('cookie-session');
var logger = require('morgan');
var cors = require('cors');
let mailRouter = require('./mail');
let bcrypt = require('bcrypt');
const db = require('./config/db/db');
const bodyParser = require('body-parser');
require('dotenv').config();
const passportSetup = require('./config/passport');
const authRouter = require('./routes/auth-routes');
var app = express();
let users = [];
app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
// support parsing of application/json type post data
app.use(bodyParser.json());
//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));
//create cookie and encrypt it
app.use(cookieSession({
maxAge: 24 * 60 * 60 * 1000,
keys: [process.env.COOKIE_KEY]
}))
//initialize passport
app.use(passport.initialize());
app.use(passport.session())
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.send('error');
});
var port = process.env.PORT || '9000';
app.listen(port);这是我的db.js文件
const { Pool } = require('pg')
const { Client } = require('pg')
const pool = new Pool({
user,
host,
database,
password,
port
})
/*
const client = new Client()
client.connect()
*/
module.exports = {
query: (text, params, callback) => {
const start = Date.now()
return pool.query(text, params, (err, res) => {
const duration = Date.now() - start
console.log('executed query', { text, duration, /*rows: res.rowCount*/ })
callback(err, res)
})
},
}发布于 2021-03-25 05:04:19
问题是您正在将一个新构造的错误传递给验证回调中的done函数。如果出现错误,您只需要在第一个参数中传递一个错误。否则,应该传递null。
下面是如何使用done的一个简短示例:
db.query(
'INSERT INTO "Users" (id, username, password, creation_date) VALUES ($1, $2, $3, $4)', [profile.id, profile.displayName, 0, date],
(error, results) => {
if (error) {
// pass error through done function
done(error)
}
// Pass profile object to be serialized
done(null, profile)
}
)done函数的引用:http://www.passportjs.org/docs/configure/#verify-callback
https://stackoverflow.com/questions/66787212
复制相似问题