登录后无法获取jwt令牌

时间:2019-12-10 14:08:39

标签: node.js express jwt jwt-auth

背景

我正在尝试使用jwt和mysql + sequelize在这里做一个简单的身份验证系统

到目前为止我能做的

此后,我可以登录并生成令牌。

问题

登录后,当我尝试使用特定路由上的中间件检查jwt令牌时,它只是说未找到该令牌。

我尝试做的事情

因为令牌应该在req.headers ['x-access-control']或['authorization']处找到,所以我在调用中间件时尝试console.log(req.headers),但没有任何意义这两个标题...然后我认为问题可能在那里,但是我不知道如何解决这个问题:(

代码段

这是我用来登录(登录)和验证令牌(verifyToken)的中间件(userController.js)

var bcrypt = require("bcryptjs");
var jwt = require("jsonwebtoken");
const config = require("../config/config");
const User = require("../models").User;

module.exports = {
  signIn(req, res) {
    console.log("Sign-In");
    User.findOne({
      where: {
        email: req.body.email
      }
    })
      .then(user => {
        if (!user) {
          return res.status(404).send("User not found");
        }
        var passwordIsValid = bcrypt.compareSync(
          req.body.password,
          user.password
        );
        if (!passwordIsValid) {
          return res
            .status(401)
            .send({
              auth: false,
              accessToken: null,
              reason: "Invalid Password"
            });
        }
        var token = jwt.sign({ id: user.id }, config.secret, {
          expiresIn: 86400 // expires in 24 hours
        });
        res.status(200).send({ auth: true, accessToken: token });
      })
      .catch(err => {
        res.status(500).send("Error =>" + err);
      });
  },
  verifyToken(req, res) {
    console.log(req.headers);
    let token =
      req.body.token ||
      req.query.token ||
      req.headers["x-access-token"] ||
      req.headers["authorization"];
    if (!token) {
      return res.status(403).send({
        auth: false,
        message: "No token provided"
      });
    }
    jwt.verify(token, config.secret, (err, decoded) => {
      if (err) {
        return res.status(500).send({
          auth: false,
          message: "Fail to Authentication. Error -> " + err
        });
      }
      req.userId = decoded.id;
      next();
    });
  }
};

这是带有路由的app.js文件

const express = require("express");
const app = express();
const port = 3000;

const Sequelize = require("sequelize");
const sequelize = new Sequelize("mydb", "root", "Metin.234", {
  host: "localhost",
  dialect: "mysql"
});
sequelize
  .authenticate()
  .then(() => {
    console.log("Connection with sequelize has been established successfully");
  })
  .catch(err => {
    console.error("Unable to connect", err);
  });

const userController = require("./controllers").user;

var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.set("view engine", "ejs");
app.use(express.static(__dirname + "/public"));

app.get("/", (req, res) => {
  res.render("home");
});

app.get("/register", (req, res) => {
  res.render("register");
});

app.get("/login", (req, res) => {
  res.render("login");
});

app.post("/login", userController.signIn);

app.get("/showAll", userController.verifyToken);

app.listen(port, () => {
  console.log("server started!");
});

在此先感谢您的帮助! = D

编辑 我将令牌保存在一个名为globalToken的变量上,因此可以将其用于验证令牌功能( EDIT 2 ,它可以很好地满足我的需求),但是我想知道如何获取登录过程之后,我正在发送的响应对象内部的accesstoken的值。

0 个答案:

没有答案
相关问题