Tìm hiểu về thư viện passport trong nodejs express.

Tìm hiểu về thư viện passport trong nodejs express

Passport là một thư viện hỗ trợ authen trong nodejs. Nó được thiết kế thành một module vì vậy có thể làm cho Passport dễ dàng tích hợp vào trong ứng dụng của bạn.

Trong mô hình web hiện đại, Authen được phát triển thành rát nhiều hình thức khác nhau. Trong thời đại của mạng xã hội đang phát triển như Facebook, Twitter..... đòi hỏi có một cách đăng nhập dựa vào tài khoản của các trang mạng xã hội thay vì bạn cần đăng nhập bằng cách truyền thống là cần user_name và password. Vì vậy module Passport được xây dựng để đáp ứng được nhu cầu này.

Passport cung cấp các cơ chế Authen đến từng nhà phát hành mạng xã hội khác nhau, vì vậy bạn có thể lựa chọn các cách Authen phù hợp đến mỗi mạng xã hội.

Cài đặt

npm install passport --save

Authenticate

Authenticate được gọi qua câu lệnh passport.authenticate(). Trong đó authenticate() là một function để kết nối đến middleware. Nó làm cho đơn giản hóa việc sử dụng đến route trong ExpressJs.

app.post('/login',
  passport.authenticate('local'),
  function(req, res) {
    // If this function gets called, authentication was successful.
    // `req.user` contains the authenticated user.
    res.redirect('/users/' + req.user.username);
  });

Theo mặc định, nếu authen lỗi thì Passport sẽ trả lại một trạng thái 401 Unauthorized và mọi route được gọi đến sẽ không có hiệu lực. Nếu thành công thì Passport sẽ thực hiện xác nhận người dùng và gọi đến các route tiếp theo.

Lưu ý: Để xử dụng route bạn cần cài đặt trước cấu hình.

Chuyển hướng

Chuyển hướng thường được gọi đến khi có yêu cầu sau khi authen.

app.post('/login',
  passport.authenticate('local', { successRedirect: '/',
                                   failureRedirect: '/login' }));

Trong trường hợp này, các yêu cầu redirect sẽ được ghi đè trên các hành động khác. Nếu Authen thành công thì sẽ được chuyển đến trang chủ, và ngược lại sẽ được gọi đến trang login.

Thông báo

Sau khi redirect sẽ thường được thông báo cho người dùng biết hành động của mình vừa xong là thàn công hay thất bại, vì vậy flash là một lữa chọn.

app.post('/login',
  passport.authenticate('local', { successRedirect: '/',
                                   failureRedirect: '/login',
                                   failureFlash: true })
);

Thiết lập failureFlash: true để cho người dùng biêt nếu xảy ra lỗi khi authen. Đây là một cách tiếp cận tốt nhất để thông báo lại việc xảy ra lỗi khi authen.

Ngoại ra, bạn có thể đặt thông báo lỗi như sau.

passport.authenticate('local', { failureFlash: 'Invalid username or password.' });

Hoặc có thể thiết lập một flash success như sau:

passport.authenticate('local', { successFlash: 'Welcome!' });

Lưu ý: để sử dụng flash yêu cầu req.flash() function. Trong Express 3 chức nằng này ko tồn tại, tuy nhiên bạn có thể sử dụng bằng cách connect-flash.

Tắt Sessions

Sau khi Authen thành công, Passport sẽ thiết lập một session login liên tục. Điều này sẽ rát phù hợp khi đăng nhập trên cùng một trình duyệt. Tuy nhiên trong nhiều trường hợp không cần thiết phải sử dụng đến sessions. VD như khi dùng API thường yêu cầu với mỗi request. Trong trường hợp này, bạn có thể vô hiệu hóa một cách an toàn bằng cách disable sessions.

app.get('/api/users/me',
  passport.authenticate('basic', { session: false }),
  function(req, res) {
    res.json({ id: req.user.id, username: req.user.username });
  });

Authen với Username & Password

Trong các web luôn tồn tại cách Authen bằng username & password. Hỗ trợ cho việc này, Passport có sự hỗ trợ bằng module passport-local

Cài đặt

$ npm install passport-local

Thiết lập

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

Viêc callback được gọi đến để xac nhận username và password có đúng với yêu cầu hay không.

Form

Xây dựng mẫu đăng nhập cho trang web để người dùng dăng nhập.

<form action="/login" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username"/>
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password"/>
    </div>
    <div>
        <input type="submit" value="Log In"/>
    </div>
</form>

Route

Các phương thức login thường dùng method post. Xử dụng authenticate() với local để xử lý các yêu cầu login.

app.post('/login',
  passport.authenticate('local', { successRedirect: '/',
                                   failureRedirect: '/login',
                                   failureFlash: true })
);

Parameters

Mặc định của Passport-local sẽ tìm kiếm param có tên là: username & password vì vậy nếu bạn muốn thay đổi có thể dùng phương pháp sau:

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'passwd'
  },
  function(username, password, done) {
    // ...
  }
));

Kết Luận

Bài viết này của mình chỉ mang tính chất tìm hiểu về cách login với Nodejs thông qua thư viện Express và PassportJs. Vì vây có thể sẽ dẫn tới sự không đầy đủ và khó hiểu khi bạn chưa tìm hiểu về cấu trúc của nodejs + express.

Cám ơn bạn đã đọc bài viết tìm hiểu về Passport trong nodejs này. Bài này mình tham khảo tại trang chủ Passport.