Hướng dẫn nodejs login api - api đăng nhập nodejs

Hôm nay mình sẽ hướng dẫn các bạn xây dựng API để đăng ký đăng nhập với nodejs, express, mongodb và jwt.

2021-07-24 2351 lượt xem 2351 lượt xem

  1. Trang Chủ
  2. [NODEJS CƠ BẢN] platform nodejs - V8 JavaScript Runtime
  3. Xây dựng api login register với nodejs xác thực Với JWT 2021

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

tôi thích vậy đó

hùng đẹp trai

hùng ebudezain

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

tôi thích vậy đó

tôi thích vậy đó

hùng đẹp trai

hùng ebudezain

hùng ebudezain

hùng ebudezain

hùng ebudezain

hùng ebudezain

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

tôi thích vậy đó

tôi thích vậy đó

tôi thích vậy đó

hùng đẹp trai

hùng đẹp trai

tôi thích vậy đó

tôi thích vậy đó

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng ebudezain

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

hùng đẹp trai

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

hùng đẹp trai

tôi thích vậy đó

tôi thích vậy đó

npm i node-input-validator

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng ebudezain

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

tôi thích vậy đó

hùng đẹp trai

tôi thích vậy đó

tôi thích vậy đó

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

hùng đẹp trai

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

tôi thích vậy đó

hùng đẹp trai

hùng ebudezain

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng đẹp trai

tôi thích vậy đó

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

|- PROJECT/
|     |- controller/
|     |-    |- Api/
|     |-    |-    |- user.controller.js
|     |- middleware/
|     |-    |- general.middleware.js
|     |-    |- jwt.middleware.js
|     |-    |- user.middleware.js
|     |- helper/
|     |-    |- auth.helper.js 
|     |-    |- error.helper.js
|     |- models/
|     |-    |- user.model.js
|     |- routes/
|     |-    |- api.js
|     |- .env
|     |- app.js
|     |- package.json

hùng đẹp trai

hùng đẹp trai

tôi thích vậy đó

hùng đẹp trai

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng ebudezain

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng đẹp trai

hùng ebudezain

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

require('dotenv').config()
const jwt    = require('jsonwebtoken')
const secret = process.env.JWT_SECRET || 'jsonwebtoken-secret' // mình có dùng dotenv 
// vào file .env tạo 1 chuỗi JWT_SECRET bất kỳ
let hashTokenAccess = async user => {

    return jwt.sign(user, secret, { expiresIn: '1800s' })
}
module.exports = {
    hashTokenAccess
}

hùng đẹp trai

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

tôi thích vậy đó

|- PROJECT/
|     |- controller/
|     |-    |- Api/
|     |-    |-    |- user.controller.js
|     |- middleware/
|     |-    |- general.middleware.js
|     |-    |- jwt.middleware.js
|     |-    |- user.middleware.js
|     |- helper/
|     |-    |- auth.helper.js 
|     |-    |- error.helper.js
|     |- models/
|     |-    |- user.model.js
|     |- routes/
|     |-    |- api.js
|     |- .env
|     |- app.js
|     |- package.json
2

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

tôi thích vậy đó

module.exports.apiResponseErrorResource = function( req, res ){
    let response = {}
    if(req.errors){
        let errors = Object.keys(req.errors).map( objKey => {
            let error = req.errors[objKey];
            return { error: objKey, ...error }
        })
        response.code             = 422,
        response.message          = "đã có lỗi xảy ra"
        response.internal_message = "đã có lỗi xảy ra"
        response.errors           = errors
        return res.status(response.code).json(response)
    }
}

hùng đẹp trai

user.model.js: 

tôi thích vậy đó

hùng đẹp trai

tôi thích vậy đó

'use strict'

const bcrypt           = require('bcrypt'),
      SALT_WORK_FACTOR = 12,
      mongoose         = require('mongoose'),
      Schema           = mongoose.Schema
      
const UserSchema = new Schema(
    {
        username: {
            type: String,
            required: true,
            minlength: 1,
            maxlength: 3000
        },
        email: {
            type: String,
            required: true,
            unique: true,
            lowercase: true,
            trim: true,
            minlength: 1,
            maxlength: 500
        },
        password: {
            type: String,
            required: true,
            maxlength: 100000,
        }
    }, {
        timestamps: true
    }
)

/**
 * Là function để so sánh chuỗi hash password đã gửi vào có đúng với trên hệ thống không? 
 * @param { String } _password là password đang được hash 
 * @version 0.0.1
 */
UserSchema.methods.comparePassword = function(_password) {
    return bcrypt.compareSync(_password, this.password);
}

/**
 * Là function để trước khi lưu mới hoặc update mới password thì sẽ modify nó trước khi lưu
 * @async
 * @version 0.0.1
 */
UserSchema.pre('save', async function(next) {
    if (!this.isModified('password')) return next()
    /// nếu là thêm mới hoặc update password thì băm trước
    try {
        const salt    = await bcrypt.genSalt(SALT_WORK_FACTOR)
        this.password = await bcrypt.hash(this.password, salt)
        return next()
    } catch (err) {
        return next(err)
    }
})
UserSchema.methods.toResources = function() {   
    return {
        _id      : this._id,
        username : this.username,
        email    : this.email,
        createdAt: this.createdAt,
        updatedAt: this.updatedAt,
    }
}
module.exports = mongoose.model("users", UserSchema)
 

hùng đẹp trai

hùng đẹp trai

tôi thích vậy đó

hùng đẹp trai

tôi thích vậy đó

hùng ebudezain

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng ebudezain

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

tôi thích vậy đó

hùng đẹp trai

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng ebudezain

hùng đẹp trai

general.middleware.js

hùng đẹp trai

hùng đẹp trai

let setAllowOrigin = (req, res, next) => {
    res.header("Access-Control-Allow-Origin", "*")
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
    console.log("================================================")
    console.log( Date.now() + 'Request URL:', req.originalUrl)
    console.log("================================================")
    next()
}
let formatJsonApi = ( req, res, next ) => {
    res.setHeader('Content-Type', 'application/json')
    next()
}
module.exports = {
    formatJsonApi,
    setAllowOrigin,
}

hùng đẹp trai

hùng ebudezain

tôi thích vậy đó

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng đẹp trai

hùng đẹp trai

hùng đẹp trai

hùng ebudezain

jwt.middleware.js

hùng ebudezain

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

require('dotenv').config()
const jwt    = require('jsonwebtoken')
const secret = process.env.JWT_SECRET || 'jsonwebtoken-secret' // mình có dùng dotenv 

let isAuth = async (req, res, next) => {

    let code     = 401,
        response = {}
    // Lấy token được gửi lên từ phía client, thông thường tốt nhất là các bạn nên truyền token vào header
    const access =  req.headers["x-access-token"] || req.headers["authorization"] || req.query.token || req.body.token
    try {

        if (!access) {
            code = 403
            /// không tồn tại access token
            throw new Error('Unauthorized!!!')
        }
        // Thực hiện giải mã token xem có hợp lệ hay không?
        // let user = await jwt.decode( access, secret ) => hàm này chỉ decode thôi nghen không phải xác thực
        const user = await jwt.verify( access, secret ) // hàm này để xác thực

        // Nếu token hợp lệ, lưu thông tin giải mã được vào đối tượng req, dùng cho các xử lý ở phía sau.
        req.user = user
        
        // Cho phép req đi tiếp sang controller.
        next();
    } catch (error) {
        
        // Nếu giải mã gặp lỗi: Không đúng, hết hạn...etc:
        response.code             = code || 401
        response.message          = error.message || 'Unauthorized.'
        response.internal_message = error.message || 'Unauthorized!'

        return res.status(response.code).json(response)
    }
}

let isAuthSocket = async token => {

    try {

        return await jwt.verify( token, secret )
    } catch (error) {
        return false
    }
}

module.exports = {
    isAuth,
    isAuthSocket,
}

hùng đẹp trai

hùng ebudezain

hùng đẹp trai

hùng thông minh lắm

|- PROJECT/
|     |- controller/
|     |-    |- Api/
|     |-    |-    |- user.controller.js
|     |- middleware/
|     |-    |- general.middleware.js
|     |-    |- jwt.middleware.js
|     |-    |- user.middleware.js
|     |- helper/
|     |-    |- auth.helper.js 
|     |-    |- error.helper.js
|     |- models/
|     |-    |- user.model.js
|     |- routes/
|     |-    |- api.js
|     |- .env
|     |- app.js
|     |- package.json
3.middleware.js

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng đẹp trai

const node_validator = require('node-input-validator'),
      errorHelper    = require('../helpers/error.helper'),
      { Validator }  = node_validator

let REGISTER = async function( req, res, next ){

    let validate = new Validator(req.body, {
        username: "required|string|minLength:1|maxLength:10000",
        email   : "required|email|minLength:3|maxLength:500",
        password: "required|string|minLength:1|maxLength:1000",
    },{
        'title.required'     : ":attribute is required"
    });
     
    let matched = await validate.check()
    if (!matched) {
        req.errors = validate.errors
        return errorHelper.apiResponseErrorResource( req, res )
    }
    next()
}

let LOGIN = async function( req, res, next ){

    let validate = new Validator(req.body, {
        email   : "required|email|minLength:3|maxLength:500",
        password: "required|string|minLength:1|maxLength:1000",
    },{
        'title.required'     : ":attribute is required"
    });
     
    let matched = await validate.check()
    if (!matched) {
        req.errors = validate.errors
        return errorHelper.apiResponseErrorResource( req, res )
    }
    next()
}

module.exports = {
    REGISTER,
    LOGIN,
}

hùng ebudezain

hùng đẹp trai

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

đọc dữ liệu hộ bố

ahihi đồ ngốc trương thanh hùng nè

hùng ebudezain

Cuối cùng file routers/api.js sẽ như sau : 

hùng ebudezain

hùng thông minh lắm

hùng đẹp trai

/**
 * author hungtt
*/
const express = require("express")
const router  = express.Router()

const userApiController = require("../controller/Api/user.controller")
const generalMiddleware = require('../middlewares/general.middleware'),
      authMiddleware    = require('../middlewares/jwt.middleware'),
      userMiddleware    = require('../middlewares/user.middleware')
/**
 * Init all APIs on your application
 * @param {*} app from express
 */
let initAPIs = app => {
    ////////////////////////////////////////////////////////////////////////////
    router.use([ generalMiddleware.formatJsonApi, generalMiddleware.setAllowOrigin ])
    ////////////////////////////////////////////////////////////////////////////
    /////////////////// Route không cần login ////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
    router.post('/register', [ userMiddleware.REGISTER ], userApiController.register)
    router.post('/login', [ userMiddleware.LOGIN ], userApiController.login)
    ////////////////////////////////////////////////////////////////////////////
    router.use([ authMiddleware.isAuth])
    ////////////////////////////////////////////////////////////////////////////
    /////////// route cần verify thành công jwt ////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
    router.get('/users', userApiController.getUser )
    
    return app.use( "/api", router )
}
module.exports = initAPIs

đọc dữ liệu hộ bố

hùng đẹp trai

hùng thông minh lắm

hùng đẹp trai

đọc dữ liệu hộ bố

đọc dữ liệu hộ bố

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng ebudezain

đọc dữ liệu hộ bố

hùng thông minh lắm

ahihi đồ ngốc trương thanh hùng nè

const initAPIs = require("./routes/api")
/// set root api
initAPIs(app)

hùng đẹp trai

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

ahihi đồ ngốc trương thanh hùng nè

Cuối cùng file routers/api.js sẽ như sau : 

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng ebudezain

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

Hướng dẫn nodejs login api - api đăng nhập nodejs

hùng thông minh lắm

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

hùng thông minh lắm

hùng đẹp trai

Hướng dẫn nodejs login api - api đăng nhập nodejs

đọc dữ liệu hộ bố

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

đọc dữ liệu hộ bố

bài viết được viết bởi trương thanh hùng https://ebudezain.com/

ahihi đồ ngốc trương thanh hùng nè

đọc dữ liệu hộ bố

hùng đẹp trai

Hướng dẫn nodejs login api - api đăng nhập nodejs

bài viết được viết bởi trương thanh hùng https://ebudezain.com/