Почему мой параметр аутентификации koa-passport user всегда неопределен?

Я пытаюсь использовать коа-паспорт для коа2, и следовал примеру автора, но я всегда получаю "Несанкционированный". Я использовал console.log и обнаружил, что он даже не попал в serializeUser.

var UserLogin = async (ctx, next) =>{
    return passport.authenticate('local', function(err, user, info, status) {
        if (user === false) {
            ctx.body = { success: false }
        } else {
            ctx.body = { success: true }
            return ctx.login(user)
        }
    })(ctx, next);
};

А потом я поискал в Интернете и нашел еще одну запись роутера, она идет к serializeUser, но ошибка done (null, user.id) вызвала "невозможно получить идентификатор из неопределенного".

let middleware = passport.authenticate('local', async(user, info) => {
        if (user === false) {
            ctx.status = 401;
        } else {
          await ctx.login(ctx.user, function(err){
              console.log("Error:\n- " + err);
          })
          ctx.body = { user: user }
        }
      });
    await middleware.call(this, ctx, next)

Auth.js показан ниже. Также я последовал примеру koa-passport от автора и попытался использовать сессию, но каждый отправленный мной запрос получит ошибку TypeError, сообщающую "Не удается прочитать свойство 'message' undefined". Но я думаю, что это не основная проблема аутентификации, но для справки, если это действительно так.

const passport = require('koa-passport')
const fetchUser = (() => {
  const user = { id: 1, username: 'name', password: 'pass', isAdmin: 'false' };
  return async function() {
    return user
  }
})()

const LocalStrategy = require('passport-local').Strategy
passport.use(new LocalStrategy(function(username, password, done) {
  fetchUser()
    .then(user => {
      if (username === user.username && password === user.password) {
          done(null, user)
      } else {
        done(null, false)
      }
    })
    .catch(err => done(err))
}))

passport.serializeUser(function(user, done) {
  done(null, user.id)
})

passport.deserializeUser(async function(id, done) {
  try {
    const user = await fetchUser();
    done(null, user)
  } catch(err) {
    done(err)
  }
})

module.exports = passport;

Кстати, когда я использую простой по умолчанию, он просто выдаст мне "Не найдено". Но через console.log я вижу, что он действительно попал в loginPass.

var loginPass = async (ctx, next) =>{
    passport.authenticate('local', {
        successRedirect: '/myApp',
        failureRedirect: '/'
    });
};

В server.js:

// Sessions
const convert = require('koa-convert'); 
const session = require('koa-generic-session');
app.keys = ['mySecret'];
app.use(convert(session()));

// authentication
passport = require('./auth');
app.use(passport.initialize());
app.use(passport.session());

Большое спасибо за любую помощь!!!:D

0 ответов

Другие вопросы по тегам