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
- Trang Chủ
- [NODEJS CƠ BẢN] platform nodejs - V8 JavaScript Runtime
- 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 //ebudezain.com/
bài viết được viết bởi trương thanh hùng //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 //ebudezain.com/
bài viết được viết bởi trương thanh hùng //ebudezain.com/
tôi thích vậy đó
bài viết được viết bởi trương thanh hùng //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 //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 //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 //ebudezain.com/
hùng ebudezain
bài viết được viết bởi trương thanh hùng //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 //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 //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 //ebudezain.com/
hùng ebudezain
bài viết được viết bởi trương thanh hùng //ebudezain.com/
hùng đẹp trai
hùng ebudezain
bài viết được viết bởi trương thanh hùng //ebudezain.com/
hùng đẹp trai
bài viết được viết bởi trương thanh hùng //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 đó
2|- 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
bài viết được viết bởi trương thanh hùng //ebudezain.com/
bài viết được viết bởi trương thanh hùng //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 //ebudezain.com/
hùng đẹp trai
bài viết được viết bởi trương thanh hùng //ebudezain.com/
hùng ebudezain
bài viết được viết bởi trương thanh hùng //ebudezain.com/
bài viết được viết bởi trương thanh hùng //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 //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 //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 //ebudezain.com/
bài viết được viết bởi trương thanh hùng //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
3.middleware.js|- 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
bài viết được viết bởi trương thanh hùng //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 //ebudezain.com/
bài viết được viết bởi trương thanh hùng //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 //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 //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 //ebudezain.com/
hùng ebudezain
bài viết được viết bởi trương thanh hùng //ebudezain.com/
hùng thông minh lắm
bài viết được viết bởi trương thanh hùng //ebudezain.com/
hùng thông minh lắm
hùng đẹp trai
đọc dữ liệu hộ bố
bài viết được viết bởi trương thanh hùng //ebudezain.com/
đọc dữ liệu hộ bố
bài viết được viết bởi trương thanh hùng //ebudezain.com/
ahihi đồ ngốc trương thanh hùng nè
đọc dữ liệu hộ bố
hùng đẹp trai
bài viết được viết bởi trương thanh hùng //ebudezain.com/