我正在测试一个简单的登录功能,用户可以登录到前端反应表单,如果他们的凭据与数据库记录匹配,他们就会通过身份验证并收到用户 ID。
我正在使用 Node JS、Express、Express-session 和 RedisIo - 来存储用户 ID。
问题是,虽然用户可以登录,但我的代码中redis的实现意味着,后续每个用户登录时,都会将最新的用户ID分配给所有登录的用户,因为redis值是静态的。
因此我们需要允许用户存储自己唯一的用户ID,而不会将数据泄露给其他用户。根据文档,我不清楚执行此操作的最佳方法,任何帮助将不胜感激。
const express = require('express')
const session = require('express-session')
const cors = require('cors')
const axios = require('axios')
//...
const Redis = require('ioredis')
const RedisStore = require('connect-redis').default
const redis = new Redis()
app.use(cookieParser())
app.use(bodyParser.urlencoded({ extended: true }))
//Session/cookie middleware
app.use(cors({
origin: ['http://localhost:3000'],
methods:['GET', 'POST'],
credentials: true
}))
//Init session/create cookie
app.use(
session({
key: "userId",
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
store: new RedisStore({client: redis}),
cookie: {
expires: 1000 * 60 * 60 * 24, //one day
}
})
)
app.post('/login', async (req, res) => {
const username = req.body.username
const password = req.body.password
const loginObj = {
username: username,
password: password
}
try {
const loginRequest = await axios.post('https://login-ep.com', loginObj)
const loginResponse = loginRequest.data
if (loginResponse.authenticated) {
req.session.user = loginResponse
let idString = JSON.stringify(loginResponse.simpleID)
redis.set('redisUserID', idString)
// Create object to send to front end
const authMessage = {
//...
}
//auth frontend
res.status(200).json(authMessage)
} else {
res.status(401).json({ message: 'Authentication failed' });
}
} catch (error) {
res.status(500).json({ message: 'Login failed' });
}
});
app.get('/home', async (req,res) => {
const redisID = await redis.get('redisUserID')
console.log(redisID)
})
您代码的问题主要是因为所有用户都使用相同的密钥存储在 Redis 中,
redisUserID
。
所以,我们需要为每个用户使用不同的密钥:
// /login
const userIdKey = `user:${loginResponse.simpleID}`;
redis.set(userIdKey, JSON.stringify(loginResponse));
// /home
const userIdKey = `user:${req.session.user.simpleID}`;
const redisID = await redis.get(userIdKey);