6

我正在使用 koa、koa-passport 和 koa-session 来记录用户,这些用户工作正常,但是当我调用 ctx.logout() 时,用户可以刷新并仍然登录。似乎 ctx.session 和/或 cookie 是没有被正确清除。

使用 Postman 发出请求时仍然失败。

import Koa = require('koa');
import session = require('koa-session');
import passport = require('koa-passport');

....

app.keys = ['******'];
app.use(session({}, app));

....

app.use(passport.initialize());
app.use(passport.session());

....

router.get('/logout', (ctx: Context) => {
    if (ctx.isAuthenticated()) {
			ctx.logout();
			ctx.session = null; // Added this but still nothing
		}

		ctx.response.body = true;
});

我发现了很多关于 Express 的例子,包括以下但对 Koa 没有任何运气:https ://github.com/expressjs/cookie-session/issues/104

4

2 回答 2

0
res.logout()

在会话 cookie 中设置passport为 {},但保留 cookie。例如:

{
  cookie: {
    originalMaxAge: 604800000,
    expires: '2022-01-17T19:14:31.872Z',
    secure: false,
    httpOnly: true,
    path: '/'
  },
  passport: {}
}

这将有助于在 cookie 中存储任何其他内容。

要实际删除 cookie,请res.clearCookie()像这样使用:

function deauthenticateSession(req: Request, res: Response, next: NextFunction) {
  // http://www.passportjs.org/docs/logout/ removes passport from the cookie, not the cookie from the browser
  // https://github.com/expressjs/cookie-session/issues/104#issuecomment-416249687
  res.clearCookie('connect.sid', { path: '/', httpOnly: true })
  res.status(200).json({})
}
于 2022-01-10T20:49:53.960 回答
0

我从https://github.com/expressjs/cookie-session/issues/104得到了这个答案, 所以你可以找到对话的完整历史,但我只是为了节省一些时间并写下下面的答案:

await ctx.logout();
ctx.session = null;

我猜他只是不知道,那个ctx.logout异步函数

于 2019-12-03T01:29:26.173 回答