从数据库中的用户获取信息 [英] GET information from user in database

查看:72
本文介绍了从数据库中的用户获取信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作全栈应用程序并从教程和视频中学习.我在获取有关登录系统的用户的信息的 GET 请求时遇到问题.我使用 Postman 检查请求.当我使用/login 添加用户时,邮递员会查看用户的访问令牌代码.我复制他的代码并将其粘贴到 Postman 标头中的授权密钥中,当我将 localhost 中的 URL 更改为/infor 以获取有关此用户的信息并发送时.但它说我身份验证无效".我找不到错我认为问题出在 getUser 函数中的 controllers/userCtrl.js 中.你能帮我吗?

I am making full stack app and learn from tutorials and videos . I have a problem with GET request to get information about user which is login in the system. I use Postman to check the requests. When I add user with /login , the Postman look user's accesstoken code. I copy his code and paste it in authorization key in headers in Postman and when I change the URL in localhost to /infor to get information about this user and send it. But it say me "Invalid Authentication". I can't find the wrong. I think the problem is in controllers/userCtrl.js in getUser function. Can you help me?

我把代码:

server.js

require('dotenv').config()
const express = require('express')
const mongoose = require('mongoose')
const cors = require('cors')
const fileUpload = require('express-fileupload')
const cookieParser = require('cookie-parser')


const app = express()
app.use(express.json())
app.use(cookieParser())
app.use(cors())

// Use temp files instead of memory for managing the upload process.
app.use(fileUpload({
    useTempFiles: true
}))

// Routes

app.use('/user', require('./routes/userRouter'))

// Connect to Mongodb
const URL = process.env.MONGO_URL
mongoose.connect(URL,{
    useCreateIndex: true,
    useFindAndModify: false,
    useNewUrlParser: true,
    useUnifiedTopology: true
}, err =>{
    if(err) throw err;
    console.log('Connected to MongoDB')
})



const PORT = process.env.PORT || 5000
app.listen(PORT, () => {
    console.log('Server is running on port', PORT)
})

.env

MONGO_URL = ***********
ACCESS_TOKEN_SECRET = ***********
REFRESH_TOKEN_SECRET = *************

routes/userRouter.js

require('dotenv').config()
const express = require('express')
const mongoose = require('mongoose')
const cors = require('cors')
const fileUpload = require('express-fileupload')
const cookieParser = require('cookie-parser')


const app = express()
app.use(express.json())
app.use(cookieParser())
app.use(cors())

// Use temp files instead of memory for managing the upload process.
app.use(fileUpload({
    useTempFiles: true
}))

// Routes

app.use('/user', require('./routes/userRouter'))

// Connect to Mongodb
const URL = process.env.MONGO_URL
mongoose.connect(URL,{
    useCreateIndex: true,
    useFindAndModify: false,
    useNewUrlParser: true,
    useUnifiedTopology: true
}, err =>{
    if(err) throw err;
    console.log('Connected to MongoDB')
})



const PORT = process.env.PORT || 5000
app.listen(PORT, () => {
    console.log('Server is running on port', PORT)
})

models/userModel.js

const mongoose = require('mongoose')

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        trim: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true,
       
    },
    role: {
        type: Number,
       default: 0
    },
    cart: {
        type: Array,
        default: []
    }
}, {
    timestamps: true
})

module.exports = mongoose.model('Users', userSchema)

中间件/auth.js

const jwt = require('jsonwebtoken')

const auth = (req, res, next) => {
    try{
        const token = req.header("Authorization")
        if(!token) return res.status(400).json({ msg: "Invalid Authentication" })

        jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
            if(!err) return res.status(400).json({msg: "Invalid Authentication" })

            req.user = user
            next()
        })
    } catch (err) {
        return res.status(500).json({msg: err.message})
    }
}

module.exports = auth

controllers/userCtrl.js

const Users = require('../models/userModel')
const bcrypt = require('bcrypt')
const jwt = require('jsonwebtoken')

const userCtrl = {
    register: async (req, res) => { // async before a function means one simple thing: a function always returns a promise. 
       try{
           const { name, email, password } = req.body

           const user = await Users.findOne({ email }) // wait until the promise resolves
           if(user) return res.status(400).json({msg: "The email already exists"})

           if(password.length < 6)
           return res.status(400).json({msg: "Password is at least 6 characteres long."})

           //Password encryption
           const passwordHash = await bcrypt.hash(password, 10)
           const newUser = new Users({
               name, email, password: passwordHash
           })

           // save mongodb
           await newUser.save()

           //then create jsonwebtoken to authentication
           const accesstoken = createAccessToken({ id: newUser._id })
           const refreshtoken = createRefreshToken({ id: newUser._id })

           res.cookie('refreshtoken', refreshtoken, {
            httpOnly: true,
            path: '/user/refresh_token'
          });

           res.json({accesstoken})

       } catch(err){
           return res.status(500).json({msg: err.message})
       }
    },
    login: async (req, res) => {
        try{
            const {email, password} = req.body;

            const user = await Users.findOne({email})
            if(!user) return res.status(400).json({msg: "User does not exist."})

            const isMatch = await bcrypt.compare(password, user.password)
            if(!isMatch) return res.status(400).json({msg: "Incorrect password"})
           
            // if login success, create access token and refresh token
            const accesstoken = createAccessToken({ id: user._id })
            const refreshtoken = createRefreshToken({ id: user._id })
 
            res.cookie('refreshtoken', refreshtoken, {
             httpOnly: true,
             path: '/user/refresh_token'
           });

           res.json({accesstoken})

        } catch(err){
            return res.status(500).json({msg: err.message})
        }
    },
    logout: async (req, res)=> {
        try{
            res.clearCookie('refreshtoken', {path: '/user/refresh_token'})
            return res.json({msg: "Logged out"})
        }catch(err){
            return res.status(500).json({msg: err.message})

        }
    },
    refreshToken: (req, res) => {
        try{
            const rftoken = req.cookies.refreshtoken
            if(!rftoken) return res.status(400).json({msg: "Please login or Register"})
           jwt.verify(rftoken, process.env.REFRESH_TOKEN_SECRET, (err, user) => {
               if(err) return res.status(400).json({msg: "Please login or Register"})
               const accesstoken = createAccessToken({id: user.id})
               res.json({ accesstoken })

           })

        }catch (err) {
            return res.status(500).json({msg: err.message})
        }
        
    },
    getUser: async (req, res) => {  // problem
        try{
            const user = await (await Users.findById(req.user.id)).isSelected('-password')
            if(!user) return res.status(400).json({ msg: "Useer does not exist."})

            res.json(req.user)
        }catch (err) {
            return res.status(500).json({msg: err.message})
        }
    }
} 
    const createAccessToken = (user) => {
        return jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, { expiresIn: '1d' })
    }

    const createRefreshToken = (user) => {
        return jwt.sign(user, process.env.REFRESH_TOKEN_SECRET, { expiresIn: '7d' })
    }
 

module.exports = userCtrl

推荐答案

用于获取令牌的中间件(身份验证功能)

For your middle ware for getting the token (auth function)

    const { authorization } = req.headers
    

    if (!authorization) {
        console.log('[No Authorization Code]'); 
        return res.status(401).send({ message: 'Unauthorized' });
    }
        

    if (!authorization.startsWith('Bearer')) {
        console.log('[Authorization need to start with Bearer]')
        return res.status(401).send({ message: 'Unauthorized' });
    }

    const split = authorization.split('Bearer ')
    if (split.length !== 2) {
        console.log('[Invalid Authorization Param')
        return res.status(401).send({ message: 'Unauthorized' });
    }

     const token = split[1]  //this is your token to use with jwt.verify

在邮递员中发送令牌时,选择不记名令牌

When you sending the token in postman, select Bearer Token

当您开始创建前端时,代码应等同于以下获取请求

When you start creating your frontend, the codes should be equivalent to the following fetch request

fetch('/api/path', { method: 'GET', headers: { "Authorization": `Bearer ${token}`}}).(res => res.json())

可以将方法更改为您想要的方法(例如 get 或 post),并且令牌将是 jwt 令牌

May change method to your desire method (e.g get or post), and the token will be the the jwt token

这篇关于从数据库中的用户获取信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆