Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何从Json Web令牌中获取当前用户的名称?_Node.js_Reactjs_Jwt - Fatal编程技术网

Node.js 如何从Json Web令牌中获取当前用户的名称?

Node.js 如何从Json Web令牌中获取当前用户的名称?,node.js,reactjs,jwt,Node.js,Reactjs,Jwt,我正在尝试从jwt获取名称和其他信息,到目前为止,我只能获取用户的Id 这是用于身份验证的routes文件夹 const config = require("config"); const jwt = require("jsonwebtoken"); const { User } = require("../models/user"); const mongoose = require("mongoose"); const express = require("express"); const

我正在尝试从jwt获取名称和其他信息,到目前为止,我只能获取用户的Id

这是用于身份验证的routes文件夹

const config = require("config");
const jwt = require("jsonwebtoken");
const { User } = require("../models/user");
const mongoose = require("mongoose");
const express = require("express");
const Joi = require("joi");
const _ = require("lodash");
const bcrypt = require("bcrypt");
const router = express.Router();

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({ email: req.body.email });
  if (!user) return res.status(400).send("Invalide email or password.");

  //compare the passowrd in the body and the password entered when registeration
  const validePassword = await bcrypt.compare(req.body.password, user.password);
  if (!validePassword)
    return res.status(400).send("Invalide email or password.");

  const token = user.generateAuthToken();

  res.send(token);
});

function validate(req) {
  const schema = {
    email: Joi.string()
      .required()
      .min(5)
      .max(250)
      .email(),
    password: Joi.string()
      .required()
      .min(7)
      .max(1024)
  };

  return Joi.validate(req, schema);
}

module.exports = router;
这是中间件文件夹

const jwt = require("jsonwebtoken");
const config = require("config");

module.exports = function(req, res, next) {
  const token = req.header("x-auth-token");
  if (!token) return res.status(401).send("Access denied. No token provided.");

  try {
    const decoded = jwt.verify(token, config.get("jwtPrivateKey"));
    req.user = decoded;
    next();
  } catch (ex) {
    res.status(400).send("Invalid token.");
  }
};
这是在当前用户登录时获取其信息的功能…

export function getCurrentUser() {
  try {
    const jwt = localStorage.getItem(tokenKey);
    return jwtDecode(jwt);
  } catch (ex) {
    return null;
  }
}
import React, { Component } from "react";
import { Link } from "react-router-dom";
import NavBar from "./navBar";
import "../profile.css";
import { getCurrentUser } from "../services/authService";

class Profile extends Component {
  state = {};

   async componentDidMount() {
    const currentUser = await getCurrentUser();
    console.log(currentUser)
  }
{_id: "5d96a81f9a2f1a8bd485f76c", iat: 1570751361}
iat: 1570751361
_id: "5d96a81f9a2f1a8bd485f76c"
这是我的配置文件组件文件中所有的组件,组件didmount位于其中…

export function getCurrentUser() {
  try {
    const jwt = localStorage.getItem(tokenKey);
    return jwtDecode(jwt);
  } catch (ex) {
    return null;
  }
}
import React, { Component } from "react";
import { Link } from "react-router-dom";
import NavBar from "./navBar";
import "../profile.css";
import { getCurrentUser } from "../services/authService";

class Profile extends Component {
  state = {};

   async componentDidMount() {
    const currentUser = await getCurrentUser();
    console.log(currentUser)
  }
{_id: "5d96a81f9a2f1a8bd485f76c", iat: 1570751361}
iat: 1570751361
_id: "5d96a81f9a2f1a8bd485f76c"
当我记录当前用户的日志时,这就是我得到的…

export function getCurrentUser() {
  try {
    const jwt = localStorage.getItem(tokenKey);
    return jwtDecode(jwt);
  } catch (ex) {
    return null;
  }
}
import React, { Component } from "react";
import { Link } from "react-router-dom";
import NavBar from "./navBar";
import "../profile.css";
import { getCurrentUser } from "../services/authService";

class Profile extends Component {
  state = {};

   async componentDidMount() {
    const currentUser = await getCurrentUser();
    console.log(currentUser)
  }
{_id: "5d96a81f9a2f1a8bd485f76c", iat: 1570751361}
iat: 1570751361
_id: "5d96a81f9a2f1a8bd485f76c"

请帮助

如果您在有效负载中需要用户名,则需要在签署令牌时添加用户名。如果由于某种原因无法使用用户名签名,请编写另一个服务以从userId或jwt中存在的任何字段返回用户名

userSchema.methods.generateAuthToken = function() { 
const token = jwt.sign( { _id: this._id,
                          isAdmin: this.isAdmin,
                          _username:this.username }, 
 config.get("jwtPrivateKey") ); 
 return token; 
};

我在jwt.sign函数中添加了新的
\u username:this.username
键值对,
\u用户名
是关键,这是关键。用户名应该是数据库中您的实际用户名

如何做我对编码不太熟悉请找到代码部分,在那里您可以从服务器端创建jwt令牌。在那里,您可以将用户名作为输入数据传递给jwt签名。您的服务器是什么side框架和语言?我正在使用node,我将添加代码,在我的内部顶部创建JTW令牌post@Sami请发布
user.generateAuthToken()
函数,这是生成tokenuserSchema.methods.generateAuthToken=function(){const token=jwt.sign({u id:this.\u id,isAdmin:this.isAdmin},config.get(“jwtPrivateKey”);返回标记;};