Express Session属性区分浏览器和邮递员

时间:2017-10-15 08:54:48

标签: javascript node.js angular express-session

更新

我认为值得一提的是我正在运行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是未定义的,总是

3 个答案:

答案 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)

您使用的是CORS吗?

我有同样的问题,我通过在每个请求中将{ withCredentials: true }作为可选参数来解决它。 我的意思是每当你在你的服务中发送一个http / https请求时,把它作为最后一个参数,你就可以了。

您可以阅读thisthis Stackoverflow问题,了解有关该主题的更多信息。