更新
我认为值得一提的是我正在运行Angular CLI,它在端口4200上运行,而我的服务器在端口8080上运行。这可能是个问题吗?这是我现在唯一能想到的事情
当我调用我的路由'/ auth / login'时,我在会话对象上设置了loggedIn属性。要检查用户是否已通过身份验证,请求“/ auth / checktoken”。在这里,我检查req.session对象上是否存在loggedIn属性。当我在Postman中做这些请求时,一切都运行得很好,但是当使用浏览器时,我的session.loggedIn属性是未定义的。我将粘贴下面的相关代码。在此先感谢您的任何帮助
服务器端
router.get('/checktoken', (req, res) => {
if(!req.session.loggedIn) {
return res.status(401).send({
userTitle: 'Not authorised',
userMessage: 'You are not authorised to view this'
})
}
return res.status(200).send()
})
客户端
@Injectable()
export class CheckAuthenticationService implements CanActivate {
constructor(
private router: Router,
private http: HttpClient) { }
canActivate() {
this.http.get('http://localhost:8080/auth/checktoken', { responseType: 'text' })
.toPromise()
.then(() => {
this.router.navigate(['admin']);
})
.catch( () => {
this.router.navigate(['login']);
});
return true;
}
}
设置loggedIn属性的登录代码片段
if (user) {
user.comparePassword(password, (err, isMatch) => {
if (isMatch && isMatch) {
req.session.loggedIn = user;
res.status(200).send()
} else {
res.status(404).send({
userTitle: 'Wrong password',
userMessage: 'Please make sure your password is correct'
});
}
});
}
会话商店设置
app.use(session({
name: 'jack-thomson',
secret: SECRET_KEY,
saveUninitialized: false,
resave: true,
store: new MongoStore({
mongooseConnection: mongoose.connection
})
}))
这一切都适用于Postman,但是当在客户端上点击这些端点时,.loggedIn是未定义的,总是
答案 0 :(得分:2)
我以前有同样的问题。我认为这与cors凭证有关。我在React上使用Axios将数据登录到我的Express后端应用程序中。我需要添加以下行:
import axios from 'axios';
axios.defaults.withCredentials = true;
然后在我的Express项目中,添加cors:
var cors = require('cors');
app.use(cors({
credentials: true,
origin: 'http://localhost:3000' // it's my React host
})
);
最后,我可以像往常一样调用登录函数,例如:
signup(){
var url = 'http://localhost:3210/'
axios.post(url, {
email: this.refs.email.value,
username: this.refs.username.value,
password: this.refs.password.value,
passwordConf: this.refs.passwordConf.value
})
.then((x)=>{
console.log(x);
if(x.data.username){
this.setState({statusSignup: `Welcome ${x.data.username}`});
} else {
this.setState({statusSignup: x.data});
}
})
.catch((error)=>{console.log(error)})
}
login(){
var url = 'http://localhost:3210/';
var data = {
logemail: this.refs.logemail.value,
logpassword: this.refs.logpassword.value,
};
axios.post(url, data)
.then((x)=>{
console.log(x);
if(x.data.username){
this.setState({statusLogin: `Welcome ${x.data.username}`});
} else {
this.setState({statusLogin: x.data});
}
})
.catch((error)=>{console.log(error)})
}
它有效!希望这能解决您的问题。
答案 1 :(得分:1)
我终于弄明白了发生了什么。我的Angular CLI在4200上运行,我的服务器在一个单独的端口上运行。我已经解决了使用快递服务我的应用程序的问题所以这是一条路线。这解决了我的问题。如果有人来这里,我希望这些信息对您有用!
答案 2 :(得分:0)