const passport = require("passport")
const session = require("express-session")
let RedisStore = require("connect-redis")(session)
// 下面的legacyMode: true一定不要忘记了,重点
let redisClient = createClient({ url: 'redis://10.86.10.41:6379/0', legacyMode: true })
redisClient.on('error', (err) => console.log('Redis Client Error', err));
main.ts里面加入。legacyMode: true
我是在passport里面做了验证。请按照一下写。
// 使用session
app.use(
session({
secret: 'keyboard cat', name: 'value', cookie: { maxAge: 1000 * 60 }, resave: false, saveUninitialized: false, store: new RedisStore({ client: redisClient, prefix: 'session:' }), genid: function (req) {
// @ts-ignore
return uuid.v4() // use UUIDs for session IDs
},
}),
local.strategy.ts
// 把登录信息传到session里面,这点很重要,没下面的save方法,困扰1周以上。
req.session.userinfo = loginUser;
await new Promise(async (resolve, reject) => {
resolve(req.session.save(() => {
console.log('初始化session设置——————————————————————————————————');
// await new Promise(async (resolve, reject) => {
// resolve(req.session.userinfo = loginUser)
// })
// will have a new session here
}))
})
custom.strategy.ts定义的验证session策略,
import { Injectable, Request, UnauthorizedException } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { Strategy } from "passport-custom";
import { createClient } from "redis";
import { promisify } from "util";
@Injectable()
export class CustomStrategy extends PassportStrategy(Strategy) {
async validate(@Request() req): Promise<any> {
let redisClient = createClient({ url: 'redis://10.86.10.41:6379/0' })
// 注意,passport的session数据结构,使用req.session.passport.user来访问 user session
const sessionId: any = req.sessionID;
console.log(req.session.userinfo)
console.log(sessionId)
let userinfo: any;
// userinfo = req.session.userinfo;
await redisClient.connect();
userinfo = await redisClient.get(`session:${sessionId}`);
console.log('####################');
console.log(userinfo);
if (!userinfo) {
throw new UnauthorizedException();
}
return userinfo;
}
}
全网第一份,欢迎交流