从服务器头获取头令牌

时间:2019-02-28 16:05:30

标签: node.js angular typescript

如何更改代码以获取令牌,因为令牌始终为空?控制台不返回任何错误,并且在邮递员(应用程序)中,服务器端可以正常工作。

我在服务器端有以下代码:

 router.post('/', async (req, res) => {
  const { error } = validate(req.body); 
  if (error) return res.status(400).send(error.details[0].message); 
  let user = await User.findOne({ username: req.body.username });     
  if (!user) return res.status(400).send('Invalid username or password.');  

  const validPassword = await bcrypt.compare(req.body.password, 
  user.password); //to bcrypt pairnei to req.body.pass kai to kanei encrypt 
  me to hash kai to sygkrinei me to user.password pou brisletai sth bash
  if (!validPassword) return res.status(400).send('Invalid username or password.');

  const token = user.generateAuthToken();
  res.header('X-OBSERVATORY-AUTH', token).header('Access-Control-Expose-Headers', 'X-OBSERVATORY-AUTH').send(_.pick(user, ['_id', 'email', 'username','isAdmin']));
  });
 }

以及客户端的angular代码:

login( username: string,  password: string) {
var user: User = {  username: username, password: password };
this.http
  .post<any>("http://localhost:3000/api/auth",user, {observe:'response'})
  .subscribe((res) => {
    const token = res.headers.get('X-OBSERVATORY-AUTH');
    console.log(token);
    this.token = token;
    if (token!==null) {
      this.isAuthenticated = true;
      this.userId = res.body._id;
      this.isAdmin=res.body.isAdmin;
      this.authStatusListener.next(true);
      this.saveAuthData(token, this.userId, this.isAdmin); 
    }
  });
}

1 个答案:

答案 0 :(得分:3)

这似乎是HTTP响应的问题,而不是Angular的问题。

后端未将标头X-OBSERVATORY-AUTH添加到Access-Control-Expose-Headers

浏览器不允许应用程序访问所有http响应标头。如果要允许某些标头可访问,则必须将其添加到Access-Control-Expose-Headers

您可以在这里https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers

中找到更多信息

编辑: 我对node.js不太了解,但似乎您唯一要做的就是:

...
res.header('X-OBSERVATORY-AUTH', token).header('Access-Control-Expose-Headers', 'X-OBSERVATORY-AUTH')
...