Tìm hiểu về Passport.js: Các bước để xác thực tài khoản
passportjs
1
nodejs
73
White

Quốc Cường viết ngày 05/11/2015

Passport.js một trong những module phổ biến nhất của Nodejs hỗ trợ bạn
authentication . Nó được thiết kế là một middlware hết sức linh hoạt cho bạn khả năng tùy biến cao với rất nhiều các kịch bản authentication: bạn có thể sử dụng Twitter, Facebook, Google thậm chí là qua username-password trong database. Bạn cũng có thể tùy biến chính xác các route nào cần phải authentication .
Trong bài viết chúng ta sẽ đi tìm hiểu sâu về cơ chế hoạt động của thằng Passport nhé, bài này giúp bạn tự tin trong việc custom lại nó :D

Thiết lập Passport cho ứng dụng

Trước khi đâu sâu vào bên trong, ta hãy ngõ qua cách đề cài đặt passport cho ứng dụng đã. Để sử dụng được passport bạn có tối thiểu 3 bước :

  • Require thằng passport và chèn 2 thằng middile của nó vào express là passport.initialize() và passport.session(). Chú ý là ứng dụng express của bạn cần sử dụng đến express-session.
var app = require('express')();
var passport = require('passport');

app.use(passport.initialize());
app.use(passport.session());

app.listen(3333);
  • Cấu hình 1 kịch bản cho thằng Passport và thiết lập 2 hàm serializeUser , deserializeUser
  • Thiết lập 1 route có dùng middleware passport.authenticate.

Các bước xác thực tài khoản qua request của người dùng.

Ví dụ bạn đặt route xác thực tài khoản là /login. Khi người dùng đăng nhập vào vệ thống passport sẽ xử lý như sau:

  1. Khi người dùng submit form đăng nhập, một request POST được tạo ra tới route /login , nó sẽ chạy cái middleware passport.authenticate cho bạn.
  2. Như trên ta thiết lập kịch bản Local cho thằng passport.authenticate nên nó sẽ gọi đến cái kịch bản ta đã cài đặt.
  3. Nó lấy dữ liệu req.body.username và req.body.passport rồi gán cho hàm verify local.
  4. Ở đây như cấu hình ở trên ta thấy chúng ta sẽ query database rồi kiểm tra xem passport của người dùng đưa lên có đúng không.
  5. Trong trường hợp Error từ db ta gọi đến callback là done với param là err( done(err)) Khi mà nó không tìm thấy được người dùng hợp lý ta gọi đến thằng done(null,false). Còn nếu thông tin đăng nhập đúng ta gọi done(null,user).
  6. Khi callback done được gọi, nó sẽ lấy dữ liệu err, user và dữ liệu bạn custom thêm nếu có trả lại cho thằng passport.authenticate.
  7. Nếu dữ liệu trả về của callback là null, true, xác thực thành công passport tiếp tục gọi hàm req.login( cái này tự gắn vào từng request khi bạn cài đặt passport ở bước 1)
  8. Hàm req.login gọi đến thằng passport.serializeUser mà ta đã định nghĩa trước đó. Hàm này truy cập vào đối tượng user mà ta trả về cho middleware passport.authenticate và xác định xem thành phần nào của đối tượng sẽ lưu vào trong session. Kết quả của hàm này là ta sẽ có đối tượng req.session.passport.user = các thông tin ta truyền vào trong serializeUser.Trong ví dụ bên trên thì nó là user.id
  9. Đồng thời với trên passport cũng có gắn thông tin user vào req.user.
  10. Việc xác thực kết thục, hàm requestHandler sẽ được gọi đưa chúng tra đến trang đã thiết lập

Xác thực các request sau khi đăng nhập.

Tất nhiên chúng ta chỉ đăng nhập 1 lần vào hệ thống, không phải cứ làm bất cữ việc gì ta cũng phải điền username - password. Trong các request tiếp theo đến hệ thống passport hoạt động như sau:

  1. Với mỗi request , express sẽ load các sữ liệu trong session ra và gắn nó và đối tượng request (req.session). Ở trên ta đã sử dụng hàm serializeUser để đưa dữ liệu vào session nên ta có thể tìm thấy dữ liệu đó tạo req.session.passport.user.
  2. Middleware khởi động passport (passport.initialize) sẽ check xem trong request session có passport.user không. Nếu chưa có là chưa xác thực thì thằng req.session.passport.user = {}
  3. Tiếp đó passport.session được gọi. Nếu thấy passport.user trong sesion request đó được tính là đã xác thực.
  4. Khi request được tính là đã xác thực nó sẽ gọi hàm passport.deserializeUser. Hàm này sử dụng thông tin trong session để lấy dữ liệu đầy đủ về thằng user rồi gắn nó vào req.user.

Tổng kết

Ở đây mình tóm tắt lại các hàm các middleware của passport :

  • passport.initialize : middleware được gọi ở từng request, kiểm tra session lấy ra passport.user nếu chưa có thì tạo rỗng.
  • passport.session: middleware sử dụng kịch bản Passport , sử dụng session lấy thông tin user rồi gắn vào req.user.
  • passport.deserializeUser : hàm được gọi bởi passport.session .Giúp ta lấy dữ liệu user dựa vào thông tin lưu trên session và gắn vào req.user
  • passport.authenticate: middleware giúp ta gắn kịch bản local vào route.
  • passport.serializeUser: hàm được gọi khi xác thực thành công để lưu thông tin user vào session

Các hàm hỗ trợ thêm cho từng request

Với từng request passport gắn thêm cho bạn 4 hàm :

  • req.login()
  • req.logout()
  • req.isAuthenticated()
  • req.isUnauthenticated()

Tên chúng nói lên tất cả rồi phải không :D
bài viết lược dịch từ : http://toon.io/understanding-passportjs-authentication-flow/

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Quốc Cường

12 bài viết.
68 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
32 6
Một câu hỏi thường gặp của lập trình viên có kinh nhiệm với SQL mới chuyển sang Mongo là làm thế nào để có thể model được quan hệ 1 : nhiều. Có rất...
Quốc Cường viết 3 năm trước
32 6
White
28 7
Phát triển ứng dụng trên local tương đối đơn giản. Bạn chỉ việc cd vào thư mục , gõ câu lệnh node app.js , ứng dụng đã hoạt động. Mọi thứ sẽ trở n...
Quốc Cường viết 3 năm trước
28 7
White
25 4
REST là kiến trúc phần mềm phổ biến nhất hiện nay trên internet. Thực tế khi đọc bài viết về REST các bạn sẽ thấy nó hơi bị mơ hồ khó hiểu. REST ...
Quốc Cường viết 3 năm trước
25 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
68 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!