node.js - 为什么我收到的 jwt 格式错误?

标签 node.js reactjs jwt express-jwt

我正在尝试在我的个人资料组件中登录后检索我的 jwt token 并将 token 存储在本地存储中。我知道本地存储不是最好的选择,但这将是一个 native 移动应用程序,因此据我所知,本地存储是我的最佳选择。但是,当我登录时,我收到一个 token ,这是我最近收到的 token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjaGVjayI6dHJ1ZSwiaWF0IjoxNTYzMDUzMzk4LCJleHAiOjE1NjMwNTQ4Mzh9.tw8ks-jFZID5rmwhoNTkWV8598niE3zMFIDk4Gz-sVg

当我的配置文件组件尝试检索/current 时,它使用格式错误的 jwt

服务器.js

var express = require('express');
var cors = require('cors');
var bodyParser = require('body-parser');
var app = express();
var port = process.env.PORT || 5000;
var morgan = require('morgan');
const auth = require('./middleware/auth');
const User = require('./models/User');

app.use(cors());
app.use(
  bodyParser.urlencoded({
    extended: false
  })
);

app.use(bodyParser.json());

/*========= Here we want to let the server know that we should expect and allow a header with the content-type of 'Authorization' ============*/
app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Headers', 'Content-type,Authorization');
  next();
});

// use morgan to log requests to the console
app.use(morgan('dev'));

var Users = require('./routes/Users');

app.use('/users', Users);

// Create a Server
const PORT = process.env.PORT || 5000; // Environment variable or port 5000

app.listen(PORT, () => console.log(`Server started on port ${PORT}`));

module.exports = app;

用户.js

const express = require('express');
const users = express.Router();
const cors = require('cors');
const jwt = require('jsonwebtoken');
var exjwt = require('express-jwt');

var jwtauth = require('../middleware/authjwt.js');
const bcrypt = require('bcrypt');
const bodyParser = require('body-parser');
const User = require('../models/User');
const config = require('config');
const auth = require('../middleware/auth');
const secret = 'dasdsad';

users.use(
  bodyParser.urlencoded({
    extended: true
  })
);

users.use(bodyParser.json());

users.use(cors());

users.post('/register', (req, res) => {
  const today = new Date();
  const userData = {
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    email: req.body.email,
    password: req.body.password,
    created: today
  };

  User.findOne({
    where: {
      email: req.body.email
    }
  })
    //TODO bcrypt
    //Need validation to appear on console and in view
    .then(user => {
      if (!user) {
        bcrypt.hash(req.body.password, 10, (err, hash) => {
          userData.password = hash;
          User.create(userData)
            .then(user => {
              res.json({ status: user.email + 'Registered!' });
            })
            .catch(err => {
              res.send('error: ' + err);
            });
        });
      } else {
        res.json({ error: 'User already exists' });
      }
    })
    .catch(err => {
      res.send('error: ' + err);
    });
});

users.post('/authenticate', (req, res) => {
  User.findOne({
    where: {
      email: req.body.email
    }
  }).then(user => {
    if (user) {
      if (bcrypt.compareSync(req.body.password, user.password)) {
        const payload = {
          check: true
        };

        const token = jwt.sign(payload, config.get('myprivatekey'), {
          expiresIn: 1440 // expires in 24 hours
        });

        res.json({
          message: 'authentication done ',
          token: token
        });
        console.log('Successful Login');
        console.log(user.first_name);
      } else {
        res.json({ message: 'please check your password !' });
        console.log('incorrect password');
      }
    } else {
      res.json({ message: 'user not found !' });
      console.log('user cannot be found');
    }
  });
});

//users.get('/something', [express.bodyParser(), jwtauth], function(req, res) {
// do something
//});

// app.all('/api/*', [express.bodyParser(), jwtauth]);

users.get(
  '/current',
  exjwt({ secret: config.get('myprivatekey') }),
  async (req, res) => {
    const user = await User.findById(req.user._id).select('-password');
    console.log(user);
    res.send(user);
  }
);

登录

import React, { Component } from 'react';

class Login extends Component {
  constructor() {
    super();
    this.state = {
      email: '',
      password: '',
      errors: {}
    };

    this.onChange = this.onChange.bind(this);
    this.onSubmit = this.onSubmit.bind(this);
  }

  onChange(e) {
    this.setState({ [e.target.name]: e.target.value });
  }
  onSubmit(e) {
    e.preventDefault();

    const user = {
      email: this.state.email,
      password: this.state.password
    };

    var token = window.localStorage.getItem('token');

    fetch('http://localhost:5000/users/authenticate', {
      method: 'POST', // or 'PUT'
      body: JSON.stringify(user), // data can be `string` or {object}!
      headers: {
        'Content-Type': 'application/json'
      }
    });
  }

  render() {
    return (
      <div className='container'>
        <div className='row'>
          <div className='col-md-6 mt-5 mx-auto'>
            <form noValidate onSubmit={this.onSubmit}>
              <h1 className='h3 mb-3 font-weight-normal'>Please sign in</h1>
              <div className='form-group'>
                <label htmlFor='email'>Email address</label>
                <input
                  type='email'
                  className='form-control'
                  name='email'
                  placeholder='Enter email'
                  value={this.state.email}
                  onChange={this.onChange}
                />
              </div>
              <div className='form-group'>
                <label htmlFor='password'>Password</label>
                <input
                  type='password'
                  className='form-control'
                  name='password'
                  placeholder='Password'
                  value={this.state.password}
                  onChange={this.onChange}
                />
              </div>
              <button
                type='submit'
                className='btn btn-lg btn-primary btn-block'
              >
                Sign in
              </button>
            </form>
          </div>
        </div>
      </div>
    );
  }
}

export default Login;

这就是我当前在“我的个人资料”组件中获取 token 的方式

 componentDidMount() {
    var token = localStorage.getItem('token');
    fetch('http://localhost:5000/users/current', {
      //cahng taht
      method: 'GET',
      mode: 'cors',
      headers: { Authorization: 'Bearer ' + token }
    });
  }

最佳答案

我猜问题出在expiresIn上。 'expiresIn' 以秒表示或描述时间跨度的字符串。您设置了 1440,这意味着 1440/60 = 24 分钟 => 24 分钟后到期,而不是 24 小时后...您可以尝试如下设置:

const token = jwt.sign(payload, config.get('myprivatekey'), {
          expiresIn: '24h' // expires in 24 hours
        });

关于node.js - 为什么我收到的 jwt 格式错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57022987/

相关文章:

node.js - 当 Mongoose 模型是新的时,有没有办法自动生成 ObjectId?

javascript - 如何将字符串转换为jsx?

java - 在 JAVA 中使用 JWT 创建 token

node.js - 服务器发送事件未使用 React 和 NodeJs 从流中接收消息

javascript - 如何将类方法导入 React 类

c# - dnx451 RC1 InMemorySymmetricSecurityKey 发生了什么?

asp.net-core - IdentityServer4: [Authorize(Roles = "Admin")] 即使 JWT token 具有 {"role": "Admin"} 声明,也不授予管理员用户访问权限

javascript - Express js - 如何访问不在同一文件中的函数

javascript - 如何使用 Promise 和 forEach 循环遍历 mongoDB?我想填充一个数组

javascript - 在另一个函数中使用异步