我有一个 CRM 应用程序,但在身份验证方面存在问题。我的应用程序在 localhost:3000 上运行,在 localhost:5000 上运行服务端。我有一个功能,当我的用户注册时,他会重定向到登录页面,并且在客户端有一个路径“/control”,如果您未经授权,您将无法访问该路径。那么,如何检查当前用户是否被授权并有会话呢?
这是我在 app.js 中的“/checkAuth”
app.get('/checkAuth', (req, res) => {
if (req.isAuthenticated()) {
res.json({ authenticated: true, user: req.user });
} else {
res.json({ authenticated: false });
}
})
这是来自 authService.ts 的请求:
import axios from "axios";
import { User } from "./authTypes";
async function checkAuth(credentials: User) {
const response = await axios.get<User>('http://localhost:5000/checkAuth', {params: credentials});
return response.data;
}
export {checkAuth}
以及来自 Auth.tsx 的请求调用:
const user = useSelector((state: RootState) => state.auth.user);
useEffect(() => {
async function fetchData() {
console.log(user);
if(user){
const data = await checkAuth(user);
console.log(data);
}
}
fetchData();
}, [])
所以第一个问题为什么“req.user”总是“未定义”,第二个问题是有某种方法可以检查会话令牌而不是特定用户的身份验证,因为当我转到路径“/control”时我想检查会话是否已授权,如果是,则授予访问权限,如果没有则重定向以进行授权。以下是代码沙箱的链接:https://codesandbox.io/p/github/Dreyclin/CRM_STO/master
要解决
req.user
未定义的问题,请确保正确配置 Passport.js 并正确设置会话中间件。以下是一些需要考虑的步骤:
确保 Passport.js 已初始化:确保您已使用
app.use(passport.initialize())
和 app.use(passport.session())
在 Express 应用程序中初始化 Passport.js。
Session Middleware:验证会话中间件是否在 Passport.js 中间件之前就位。使用
express-session
管理会话。
序列化和反序列化:实现
passport.serializeUser()
和 passport.deserializeUser()
函数来处理用户序列化。
检查身份验证流程:确保身份验证流程设置正确,并且用户在访问之前经过身份验证。
:如果您的客户端和服务器位于不同的源,请确保正确配置 CORS 以允许凭据。
:添加控制台日志或使用调试器来跟踪身份验证过程并确定可能失败的位置。
这是使用 Express 设置 Passport.js 的基本示例:
req.user
确保将用户身份验证逻辑替换为您自己的。此设置应该可以帮助您解决
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const app = express();
app.use(session({ secret: 'secret', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(
function(username, password, done) {
// Replace with your user authentication logic
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
app.get('/checkAuth', (req, res) => {
if (req.isAuthenticated()) {
res.json({ authenticated: true, user: req.user });
} else {
res.json({ authenticated: false });
}
});
app.listen(5000, () => {
console.log('Server running on port 5000');
});
的问题并有效管理会话身份验证。