私はkoa2にkoa-passportを使用しようとしており、著者の例に従いましたが、常に「Unauthorized」になります。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)は「未定義から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 の例に従い、 sessionを使用しようとしましたが、送信したすべてのリクエストで「未定義のプロパティ 'メッセージ' を読み取れません」という TypeError が返されます。しかし、これは認証の中心的な問題ではないと思いますが、それが本当にそうであるかどうかを参考にしてください。
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