基于身份验证在 Node JS redisio 存储中设置唯一的用户 ID

问题描述 投票:0回答:1

我正在测试一个简单的登录功能,用户可以登录到前端反应表单,如果他们的凭据与数据库记录匹配,他们就会通过身份验证并收到用户 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)
})
node.js express redis express-session
1个回答
0
投票

您代码的问题主要是因为所有用户都使用相同的密钥存储在 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);
© www.soinside.com 2019 - 2024. All rights reserved.