【问题标题】:How to set headers in post request? - Angular如何在发布请求中设置标头? - 角
【发布时间】:2020-03-01 23:06:55
【问题描述】:

我目前正在实现 JWT 身份验证 - 我根据本教程实现了它:https://medium.com/dev-bits/a-guide-for-adding-jwt-token-based-authentication-to-your-single-page-nodejs-applications-c403f7cf04f4。虽然我的代码有效,但我不知道如何使用密码和用户名从我的角度前端发送发布请求。本教程使用此命令在终端运行登录:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"password":"password", "username":"admin"}' \
  http://localhost:8000/login

如何将此命令转换为表单的发布请求:

http.post('URL', <data>)

以便我可以从前端发出请求?

当后端处理一个登录请求时,它会调用 HandlerGenerator 类的 login 方法,您可以在这里找到:

const express = require('express');
const bodyParser = require('body-parser');
let jwt = require('jsonwebtoken');
let config = require('./config');
let middleware = require('./middleware');

class HandlerGenerator {


  login (req, res) {
    let username = req.body.username;
    let password = req.body.password;

    // For the given username fetch user from DB
    let mockedUsername = 'admin';
    let mockedPassword = 'password';

    if (username && password) {
      if (username === mockedUsername && password === mockedPassword) {
        let token = jwt.sign({username: username},
          config.secret,
          { expiresIn: '24h' // expires in 24 hours
          }
        );
        // return the JWT token for the future API calls
        res.json({
          success: true,
          message: 'Authentication successful!',
          token: token
        });
      } else {
        res.send(403).json({
          success: false,
          message: 'Incorrect username or password'
        });
      }
    } else {
      res.send(400).json({
        success: false,
        message: 'Authentication failed! Please check the request'
      });
    }
  }

  index (req, res) {
    res.json({
      success: true,
      message: 'Index page'
    });
  }


}

// Starting point of the server
function main () {
  let app = express(); // Export app for other routes to use
  let handlers = new HandlerGenerator();
  const port = process.env.PORT || 3000;

  ////////////////////////////////////////////////////////////////////////////////////
  app.use(bodyParser.urlencoded({ // Middleware
    extended: true
  }));

  app.use(bodyParser.json());

  // catch 404 and forward to error handler
  app.use(function(req, res, next) {
    let err = new Error('Not Found');
    err.status = 404;
    next(err);
  });

  ////////////////////////////////////////////////////////////////////////////////////
  // Routes & Handlers
  app.get('/', middleware.checkToken, handlers.index);

  ////////////////////////////////////////////////////////////////////////////////////
  app.post('/login', handlers.login);

  ////////////////////////////////////////////////////////////////////////////////////
  app.listen(port, () => console.log(`Server is listening on port: ${port}`));

  module.exports = app;
}

main();

如果发出带有令牌而不是登录信息的请求,则使用中间件来验证令牌:

let jwt = require('jsonwebtoken');
const config = require('./config.js');

let checkToken = (req, res, next) => {
  let token = req.headers['x-access-token'] || req.headers['authorization']; // Express headers are auto converted to lowercase

  if (token) {
    if (token.startsWith('Bearer ')) {
      // Remove Bearer from string
      token = token.slice(7, token.length);
    }

    jwt.verify(token, config.secret, (err, decoded) => {
      if (err) {
        return res.json({
          success: false,
          message: 'Token is not valid'
        });
      } else {
        req.decoded = decoded;
        next();
      }
    });
  } else {
    return res.json({
      success: false,
      message: 'Auth token is not supplied'
    });
  }
};

module.exports = {
  checkToken: checkToken
};

如果您能告诉我如何将用于通过终端登录的命令转换为正确的发布请求,可以在我的前面使用,那将非常有帮助...非常感谢您的帮助!

最好的问候,山姆

【问题讨论】:

  • 你应该看看这个:angular.io/guide/http
  • @Tunmee 我查看了您的链接并用谷歌搜索了一堆,这导致我将正文设置为:body = { password: 'password', username: 'username' }; 并提出这样的请求:this.http.post('/login', this.body);- 但是,这不起作用。我也尝试设置 httpOptions,但这对我也不起作用。你能帮我理解为什么以及如何解决这个问题吗?提前谢谢!

标签: node.js angular express


【解决方案1】:

应该是这样的

http.post(
  'http://localhost:8000/login', 
  { password: 'password', username: 'admin' },
  { headers:  new HttpHeaders({ 'Content-Type':  'application/json' }) }
);

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 2015-04-02
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2021-03-03
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多