JS: jsrsasign dễ dàng với JWT

jsrsasign: opensource free pure JavaScript cryptographic library supports RSA/RSAPSS/ECDSA/DSA signing/validation, ASN.1, PKCS#1/5/8 private/public key, X.509 certificate, CRL, CMS SignedData, TimeStamp, CAdES and JSON Web Signature(JWS)/Token(JWT)/Key(JWK)

Bài viết: "Khái niệm về JSON Web Token" trên techmaster:

Có ví dụ demo về: HA256, phương pháp này mã hóa đơn giản, cũng như tác giả bài viết khuyến nghị truyền các obj kiểu json khá là gọn.
Nếu sử dụng thư viện: http://kjur.github.io/jsrsasign/jsrsasign-latest-all-min.js

(bạn có thể inspect ngay trên trang này, tôi đã nhúng thư viện này vào rồi, view page source để thấy)

var sHeader = JSON.stringify({alg: "HS256"});
var sPayload = '{"user": "diepgepa"}';
var sJWS = KJUR.jws.JWS.sign(null, sHeader, sPayload, "616161"); 
console.log(sJWS );
console.log(KJUR.jws.JWS.parse(sJWS).payloadObj);

Hoặc test token mà tác giả bài viết trên techmaster đã generator ra được:
var a = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0ZWNobWFzdGVyIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwczovL3d3dy50ZWNobWFzdGVyLnZuL2p3dF9jbGFpbXMvaXNfYWRtaW4iOnRydWUsInVzZXIiOiJwYWR1dmkiLCJhd2Vzb21lIjp0cnVlfQ.uL7nEjM7ihbQe7l01rmQCtGYoKyb4VyabWqX8PZKdt4';
console.log(KJUR.jws.JWS.parse(a).payloadObj)





Vấn đề tôi đề cập ở đây là thuật toán RS256 (RS512 chưa thực sự gọi là phổ biến).
Đây là thuật toán mã hóa phức tạp hơn mà các nhà cung cấp dịch vụ dùng để xác thực người dùng hay quyền truy cập vào ứng dụng của họ.
Khác với HA256, bạn cần phải chuẩn bị: "RSA PRIVATE KEY".

Tạo RSA private key, các bạn sử dụng openssl, còn nếu bạn muốn tạo server làm việc này, ví dụ bằng nodejs có thư viện: https://www.npmjs.com/package/openssl-wrapper (và bạn cũng rõ thêm rằng từ khóa wrapper trong tình huống này chứ)

Bạn muốn tạo ngay mã này trên PC của mình, cài đặt openssl, khoan, tôi giới thiệu luôn cho bạn chương trình khá tiện trên window, nó tích hợp các tools có ở nhiều HĐH như linux, mac ...




Coi như bạn cài xong openssl, cũng như 1 vài tool hữu ích khác, kiểm tra chúng trong: ~\\Program Files\cmder\vendor\git-for-windows\..

"RSA PRIVATE KEY" được tạo bởi openssl trong file định dạng .key với câu lệnh:
giả sử : "Generating RSA private key, 1024 bit long modulus"
openssl genrsa 1024 > a.key

cuối cùng mở file .key và copy vào biến:

var sPemPrvKey = `
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC4CVNwPRaPrKT6sFqbui3awY1hx0W6qpj6DHwHS6wl8oAT9mYl
BmgroUOlXPQbxaOAKZ3RikXz4D3LcCqWHiCCenkINAwyteAdYOmzLTnHzwRR0kXZ
R0s8xnbSQxz7WX6pQxXx16tnemcERt5kHL4DUvLYwxIITYGEsc5Npr8LYQIDAQAB
AoGAdqV0iHipsejA1+mYEKuf4ldEGdSJrMVNKG+iCmYLzs8fKT+CLL6LrA0keliJ
+9mYBglOeIenf4mC7UQcAHndxIg4QS6Urxt1YDdr/VT7lGBDSPdQBNwwtz5R3wlf
+KSiOkjdsclKGa1v9/705eo/SwPhklxQOIEhXo6L+OkzLkECQQDoyCeV+GnfIggS
dP46IXLJyI52Vcd7YTWCZ+cI5lMZzeCofzCosVxbwdQIAnaqQ1EYmTegrOeK5XuC
mBPDwyopAkEAymSByeQT33uWXXBJBTGjdJzQtBvc9eZV92L6yqLulA0bAxt0nA7f
5C8QqQg2t9d+o+tH7AMAy/QLj2CkgZ7ueQJAeBq9gf138q7GZ2+BtFCJv18BUkET
+a7AQxaE9+yOt+OnpIhrfL52Hsm1MqTCwTqWXxC+yOItXVbmEQ2SNRE/cQJBAMeO
wDY7r6icaA9rhmQbpIp3kIT2MDE5UqwhKR0h99F89pRivuCc/f80tN2l3qX4UcL4
WysHbwKqd7eAV9QCzCkCQQCjnwK8nm+e7p0n75UG2Q8Bw3TNF+nEuz4xW7YEsZGK
gUQcMlBCn5EWGPDTHctJSO/38BG2f9yJepfeLigHbnv4
-----END RSA PRIVATE KEY-----
`;

Test thử:

var sHeader = JSON.stringify({alg: "RS256"});

var sPayload = '{"user": "diepgepa"}';
var sJWS = KJUR.jws.JWS.sign(null, sHeader, sPayload, sPemPrvKey);
console.log(sJWS);
console.log(KJUR.jws.JWS.parse(sJWS).payloadObj);


QUAN TRỌNG: XÁC THỰC

Nếu không có xác thực thì quả nhiên chúng ta sẽ chỉ dùng để truyền đối tượng mà thôi

function showYourToken(sJWT){
 var headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(sJWT.split(".")[0]));
 var payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(sJWT.split(".")[1]));
 console.log(headerObj,payloadObj);
};

Hãy lấy token mà bạn tạo ra ở trên, lưu vào biến sJWT và chạy showYourToken(sJWT).
Bạn sẽ thấy header và payload lòi ra ngay.

Vậy hãy đọc tiếp bài: Xác thực tokens


Nhận xét