Firebase: Phần 1 - Vấn đề xác thực Firebase với custom token

Trong phần mở bài tôi sẽ nói luôn, vì tôi sợ mất thời gian của các bạn khi click vào để đọc bài viết. Việc xác xác thực thông qua custom token là ở trường hợp hệ thống của của không xác thực qua những hình thức third party như (facebook, github, google mail...). Nếu bạn không thuộc trường hợp này stop tại đây và bạn đọc thêm về những lợi ích khi sử dụng firebase như hosting, notification, app index, storage, authentication, cloud mesenger, test lab

✔ Yêu cầu người đọc: 

1 - Hiểu firebase là gì? 

2 - Firebase dùng để làm gì? 

3 - Rules trong một Firebase quan trọng thế nào? 

4 - Những hình thức xác thực để có thể .read và .write trong firebase? 

Nếu như các bạn chưa hiểu những khái niệm trên thì xin mới search "firebase" trên page https://anonystick.com bạn có thể hình dung qua được rồi. Hoặc bạn có thể đọc bài này trước khi chúng ta tiến tới "Khi nào nên sử dụng Firebase?" 

Đọc thêm các bài về firebase: Đọc thêm firebase tại đây

Bài liên quan Hướng dẫn xác thực tài khoản login bằng SMS, miễn phí sử dụng Firebase

Đã xong việc require và intro cho người mới. Bây giờ tiếp tục nội dung chính của bài này mà tôi đã nêu rõ ở title của bài viết.  À khoan, tôi chưa nói đến tầm quan trọng của firebase trong mỗi ứng dụng, có thể bạn chưa biết hoặc chưa sử dụng nóm nhưng nếu bạn là một developer thì trước sau gì bạn cũng phải sử dụng chúng ít nhất một lần. Bới vì nó đã thay thế hầu hết các công nghệ trước như socket.io... 


Để tôi liệt kê những lợi thế mà khi bạn sử dụng Firebase như hosting, notification, app index, storage, authentication, cloud mesenger, test lab... Thôi để nói sau về điều đó.


✔ Ví dụ thực tế: 

Bạn đang triển khai một hệ thống chat dùng firebase (public và private). Mỗi user sẽ login qua hệ thống của bạn, và thông tin sẽ lưu ở firebase, và các action cũng trên firebase cũng giống như bạn sẽ không dùng socket.io nữa. Vấn đề: Nếu bạn không nắm rules trong firebase thì thật là nguy hiểm. Bởi vì mặc định nó sẽ cho bất cứ user nào cũng có thể .read và .write trên dữ liệu của bạn, Chỉ cần họ có file config được show trên source của bạn. Dạng như thế này 

Và bạn đọc đến đây bạn đã thấy mình sai và thiếu nhiều điều trọng rồi bạn cắm đầu vào search google tứ tung rồi tìm ra những điều như thế này.


 Đúng hình ảnh trên là nếu muốn .read và .write được dữ liệu thì các user của bạn phải xác thực trên firebase. Nhưng hệ thống của bạn không login xác thực qua thrid party như Facebook, Google... mà chỉ login qua hệ thống riêng của công ty hay của bạn đó là username và password. Vậy bạn phải làm thế nào? Tôi sẽ giúp bạn làm việc này thông qua bài viết này. 

✔ Các giải quyết xác thực xác thực Firebase với custom token (web và nodejs) 

1 - Trước khi user xâm nhập vào hệ thống chat thì cũng như bình thường bạn phải yêu cầu user gửi pass và user lên server và đồng thời server giải quyết hai việc đó là xác thực login và tạo một token cho user. 

Client:

// Client gọi hàm lấy token với các tham số mylogin và password.
function getToken(){
  return fetch(
    'https://myapp.com/auth/token/', 
    { 
      method: 'POST', 
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      }, 
      body: JSON.stringify({ 
              login: 'mylogin',
              password: 'secretpassword'
            }) 
      }
  )
}

2 - Server làm việc

// Server có nhiệm vụ xác thực login về thống nếu thành công thì tạo token rồi gửi lại cho user token này.
var firebaseAdmin = require('firebase-admin');
var express = require('express');
var router = express.Router();
var authenticate = require('my-authentication-library');
 
router.post('/token', function(request, response, next) {
  if(authenticate(request)){
    firebaseAdmin.auth().createCustomToken(request.body.login).then(function(token){
      response.json({ token: token });
    })
    .catch(function(error) {
      res.status(500).json({error: "Error during token creation"});
    });
  } else {
    res.status(401).json({error: "Invalid login or password"});
  }
});
module.exports = router

chú ý: biến request.body.login đó là user01 hay user02 trên hình ảnh phía trên của bài viết nha nếu muốn đọc trong users. 

3 - Quay lại client sau khi reponse được token khi gửi request xuống backend thì tiếp tục sử dụng signInWithCustomToken

function authorizeAndQuery(responseData){
  firebase.auth().signInWithCustomToken(responseData.token)
  .then(function(user_login){
    var myRef = firebaseApp.database().ref('firebase_data');
    myRef.once('value', function(snapshot) {
         console.log(snapshot.val());
    });
  });
} 

Token khi client lấy được có thể để ở cookie or ở đâu tuỳ bạn nhưng bạn hãy chú ý những điều sau đây về token. 

Notes: Mỗi token được sinh ra và sẽ hết hạn trong vòng 1 hour. Đến giờ cũng không hiểu vì sao mà google lại sơ ý đến như vậy? không cho anh em chúng ta customize thời gian đó. 

Xong rồi, bài tiếp theo tôi sẽ hướng dẫn cho các bạn các refresh token khi hết hạn và cách phát hiện khi firebase thông báo token hết hạn. 

  Happy codding!