Authentication use Passport and Jwt in Nodejs ( Phần 1 )

 


Chào mọi người, lâu lắm rồi mình mới lên đây chém gió cùng ae. Sau một thời gian thi cử dồn dập của năm cuối, thì mình cũng đã chiến đấu xong, haha...Lặn lâu, lặn sâu rồi, giờ ngoi lên làm một bài chứ nhỉ.

Khi xưa mình code đăng kí, đăng nhập thì mình chưa dùng thằng passport, sau đó mình thấy Leader dùng thằng này, mình thấy khá hay nên viết một bài về nó luôn.

Passportjs được thiết kế là một middleware hết sức linh hoạt có khả năng tùy biến cao với rất nhiều các kịch bản authentication: đăng nhập với Github, Facebook, Google, và cả username, password trong db. Nghe thôi đã hấp dẫn đúng không anh em.

À, các bạn tạo model, tạo db trước khi vào bài này nhá. Nếu bạn chưa biết thì có thể tham khảo bài viết này của mình.


Bắt đầu code thôi ae!


Sơ lược cấu trúc project của mình.
- config: mình sẽ config các thông tin về database, cổng server chạy,....
- migrations: chứa các file migration. 
- models: chứa các models. 
- seeds: chứa các file seeds.
- common: chứa các file về utils, hash, những hàm nào hay dùng thì ném vào đây, ....
- controllers: chứa các file xử lý logic.
- routes: chứa các route ( các api ). 
- service: chứa các file xử lý với database (query)

Hi, mình chia ra những folder như này tuy nó sẽ làm khó các bạn mới tiếp cận với nodejs, cơ mà các bạn nên tập dần với cấu trúc một project thật. Thật sự nó sẽ giúp ích cho các bạn rất nhiều, base này mình dùng cũng khá lâu rồi, khi nào gặp một base ở một công ty khác xịn xò hơn, chắc chắn mình sẽ update với anh em. 

common
    - Mình viết 2 file là hash và utils.
    
 hash.js

const bcrypt = require('bcryptjs');
const saltRound = 10;

let hash = (plainText=> {
    return bcrypt.hash(plainText || ''saltRound);
};

let compare = (plainTexthashText=> {
    return bcrypt.compare(plainText || ''hashText || '');
}

module.exports = {
    hash,
    compare
};

Mình dùng bcryptjs để mã hóa mật khẩu nhé.
utils.js

const errorCodes = {
    INTERNAL_SERVER_ERROR: 'INTERNAL_SERVER_ERROR',
    UNAUTHORIZED: 'UNAUTHORIZED'
}

function sendError(codeerrorStrerr){
    return {
        code: code || 500,
        data: error(errorStrerr)
    }
}

function sendSuccess(response){
    const responseData = Object.assign({
        success: true
    }, response);
    return {
        code: 200,
        data: responseData
    }
}

function error(errorStrerr){
    return {
        success: false,
        error: errorStr || errorCodes.INTERNAL_SERVER_ERROR,
        message: err ? err.toString() : undefined
    }
}

module.exports = {
    error,
    sendSuccess,
    sendError,
    errorCodes
}

 - File này mình viết các hàm để cho success, error cho server trả về.

Ok. Giờ mình sẽ viết api đăng ký tài khoản nhé.

Mình sẽ viết file user ở Service
- Hàm kiểm tra user, hàm kiểm tra email đã tồn tại chưa và hàm thêm user


Không khó khăn đúng không anh em.
Ở controller mình code logic


Ở router sẽ như thế này.


Mình sẽ đẩy code lên github nên các bạn tập trung hiểu ý tưởng thôi nhé, rồi clone github về chạy là hiểu ngay ý mà, không có gì khó khăn đâu. Mà nếu khó quá, bình luận phía dưới mình sẽ support nhé.

Ở routes mình dùng thằng celebrate để validate, thằng  celebrate bao gồm cả thằng joi, mình hay dùng để validate data.

Dùng postman test thử luôn cho nóng.

Vậy là mình đã có thể register rồi!

Ở phần sau mình sẽ mô tả kịch bản dùng passport để xác thực đăng nhập. Cảm ơn mọi người đã quan tâm bài viết của mình. Mọi người có thể góp ý, bình luận để cùng học hỏi giao lưu nhé.Thanks.

Previous Post
Next Post

post written by:

0 Comment: