Не удается восстановить пользователя Facebook при удалении - PullRequest
0 голосов
/ 06 марта 2019
  1. Я создал пользователя, используя passport-facebook

    api.get('/facebook', passport.authenticate('facebook', {
        scope: 'email'
    }))
    
  2. Удален пользователь

    УДАЛИТЬ ИЗ ПОЛЬЗОВАТЕЛЕЙ ГДЕ электронная почта =?

  3. Перейти # 1 для воссоздания пользователя

Но при попытке №3 возникает ошибка

Failed to deserialize user out of session

Поэтому я попытался удалить сеанс на БД

delete from sessions where session_id = 'p8TaEeb-GH87lbi-a5hpmY6YX6me6yHf'

И я попробовал # 3, это работает.

Я поставил несколько логов, чтобы проверить работоспособность passport-facebook.

passport.use(new FacebookStrategy({
  clientID: config.FACEBOOK_CLIENT_ID,
  clientSecret: config.FACEBOOK_CLIENT_SECRET,
  callbackURL: '/api/auth/facebook/callback',
  profileFields: ['id', 'name', 'email', 'displayName', 'photos']
}, async (accessToken, refreshToken, profile, done) => {

  //log for checking passport-facebook works
  console.log('Is it works??')

  const type = 'facebook'
  const nickname = profile.displayName
  const email = profile.emails[0].value
  const thumbnail = profile.photos[0].value
  try {
    let [existsUser] = await conn.query(`SELECT * FROM users WHERE email = ?`, [email])
    existsUser = existsUser[0]
    // is user already exists
    if (existsUser) return done(null, existsUser)

    const fields = { nickname, email, thumbnail, type }
    await conn.query(`INSERT INTO users SET ?`, fields)
    let [createdUser] = await conn.query(`SELECT * FROM users WHERE email = ?`, [email])
    createdUser = createdUser[0]

    return done(null, createdUser)
  } catch (err) {
    return done(err)
  }
 }))
})

Но журнал не появился, поэтому, кажется, FacebookStrategy не работает, когда я # 3

Вот мой passport.deserializeUser

passport.deserializeUser(async (id, done) => {
  const sql = 'SELECT * FROM users WHERE id = ?'
  const fields = [id]
  try {
    const [user] = await conn.query(sql, fields)
    return done(null, user[0])
  } catch (err) {
    return done(err)
  }
})

Вот мой вариант сеанса

  const sessionOpt = {
    name: config.SESSION_COOKIE_KEY,
    secret: config.SESSION_SECRET_KEY,
    resave: false,
    saveUninitialized: true,
    store: new MySQLStore(mysqlOpt),
    cookie: {
      maxAge: expiry,
      httpOnly: true
    },
    unset: 'destroy'
  }

Вот мой полный код

https://github.com/qkreltms/relay-novel-server/blob/develop/src/config/passport.js

Есть идеи?

1 Ответ

0 голосов
/ 06 марта 2019

https://github.com/jaredhanson/passport/issues/6#issuecomment-4857287

Я добавил оператор if, когда пользователь не существует и return done(null, false)

passport.deserializeUser(async (id, done) => {
  const sql = 'SELECT * FROM users WHERE id = ?'
  const fields = [id]
  try {
    const [user] = await conn.query(sql, fields)
    if (user.length === 0) return done(null, false)

    return done(null, user[0])
  } catch (err) {
    return done(err)
  }
})
...