我想用koa和passport登陆来解决问题。
我使用了koa-passport和passport-discord的例子,但不知何故我不能让它工作。似乎它的大部分工作(我得到了accessToken,refreshToken和个人资料信息),但身份验证后的重定向从未发生,页面只显示Not Found。
使用express,一切都能正常工作。
我认为错误在这里的某个地方,但我尝试了所有方法,但都不能让它工作。
router.get('/auth/discord/callback', passport.authenticate('discord', {
scope: scopes,
failureRedirect: '/'
}, (err, profile, info) => {
console.log(err, profile, info);
}), (ctx, next) => {
console.log('test'); // never executed
});在koa中,第二个中间件不被执行,而在express中,它被执行。但是看看koa-router文档,看起来应该是这样的。
这是我的完整代码:
server.js
const Koa = require('koa')
const app = new Koa()
const scopes = ['identify', 'guilds'];
// trust proxy
app.proxy = true
// sessions
const session = require('koa-session')
app.keys = ['your-session-secret']
app.use(session({}, app))
// body parser
const bodyParser = require('koa-bodyparser')
app.use(bodyParser())
// authentication
require('./auth')
const passport = require('koa-passport')
app.use(passport.initialize())
app.use(passport.session())
// routes
const fs = require('fs')
const Router = require('koa-router');
const router = new Router();
app.use((ctx, next) => {
console.log('url', ctx.url);
next();
});
router.get('/', function (ctx) {
ctx.type = 'html'
ctx.body = fs.createReadStream('server/views/login.html')
})
router.get('/logout', function (ctx) {
ctx.logout()
ctx.redirect('/')
})
router.get('/auth/discord', passport.authenticate('discord', {
scope: scopes
}));
router.get('/auth/discord/callback', passport.authenticate('discord', {
scope: scopes,
failureRedirect: '/'
}, (err, profile, info) => {
console.log(err, profile, info);
}), (ctx, next) => {
console.log('test'); // never executed
});
// Require authentication for now
app.use(function (ctx, next) {
if (ctx.isAuthenticated()) {
return next()
} else {
ctx.redirect('/')
}
})
router.get('/app', function (ctx) {
ctx.type = 'html'
ctx.body = fs.createReadStream('server/views/app.html')
})
app.use(router.routes());
// start server
const port = process.env.PORT || 3000
app.listen(port, () => console.log('Server listening on', port))auth.js
const passport = require('koa-passport')
const configWeb = require('../config_web.json');
const scopes = ['identify', 'guilds'];
passport.serializeUser(function (user, done) {
done(null, user.id)
})
passport.deserializeUser(async function (id, done) {
try {
done(null, {
id: 1,
username: 'test'
})
} catch (err) {
done(err)
}
})
var DiscordStrategy = require('passport-discord').Strategy;
passport.use(new DiscordStrategy({
clientID: configWeb.discordClientID,
clientSecret: configWeb.discordClientSecret,
callbackURL: 'http://localhost:3000/auth/discord/callback',
scopes: scopes
},
function (accessToken, refreshToken, profile, done) {
console.log(accessToken, refreshToken, profile);
return done(null, profile);
}));谢谢你的帮忙!
发布于 2019-11-28 10:43:13
我一直在尝试使用与您相同的模块,感谢您分享您的代码,因为它帮助我填补了所有这些模块的文档之间的空白。
在我自己尝试过之后,我认为问题出在这里:
router.get('/auth/discord/callback', passport.authenticate('discord', {
scope: scopes,
failureRedirect: '/'
}, (err, profile, info) => {
console.log(err, profile, info);
}), (ctx, next) => {
console.log('test'); // never executed
});通过遵循this SO answer,我尝试将该路由更改为如下所示:
router.get('/auth/discord/callback', async ctx => {
return passport.authenticate('discord', {scope: scopes, failureRedirect: '/'},
function(err, user, info, status) {
console.log('test'); // This gets executed.
// And now the ctx object is in-scope to be used from the passport callback.
ctx.redirect('/');
})(ctx);
});https://stackoverflow.com/questions/49333358
复制相似问题