【问题标题】:Passport Google Strategy Redirect 500 status codePassport Google 策略重定向 500 状态码
【发布时间】:2021-06-21 12:39:49
【问题描述】:

我一直在使用护照和 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)
        })
    },
}

【问题讨论】:

  • 我设法得到错误“选择错误 2”。我试试看怎么解决

标签: node.js postgresql express passport.js


【解决方案1】:

问题是您将新构造的错误传递给验证回调中的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

【讨论】:

  • 我构造了这些错误来检查破坏序列化的错误发生在哪里。它在 else 范围内抛出“选择错误 2”(我们检查用户数据是否保存在数据库中)。在此之前,我使用了文档方法,done(null, data)
  • 是的,它抛出select error 2,因为它正在构造并传递给done。因为results.rows.length > 0,它进入了else块。所以你是说即使你没有将任何错误传递给done,你也会得到一个 500 错误?
  • 是的。我进入同意页面,然后重定向中断并抛出 500 状态代码
  • 使用这样的东西来序列化用户的对象是什么? passport.serializeUser((user, done) => { console.log('User::', user); done(null, user.id); });
  • "User:: user_id" ,然后是 "Failed to serialize user into session",然后是 "GET /auth/google/redirect?"
猜你喜欢
  • 2017-07-13
  • 2018-02-05
  • 2015-09-03
  • 2018-07-31
  • 1970-01-01
  • 2018-03-05
  • 2012-04-10
  • 2015-01-03
  • 2021-05-31
相关资源
最近更新 更多