Thứ Ba, Tháng Năm 30, 2023
31 C
Ho Chi Minh City
spot_img

Sự Khác Biệt Giữa Jwts Và Bearer Token Là Gì ? Nếu Không Có Bearer Trước Token

Must read

Openlivenft
Openlivenfthttps://openlivenft.info/
Trang tổng hợp thông tin nhanh - mới nhất về NFT, COIN, Metaverse, tài chính, crypto của OpenliveNFT

Thời gian qua, mình có phảivật lộn với 1 framework mới, mày mòtrong tài liệu hướng dẫn thì thấy nócó đề cập tới 1 phương pháp xác thực quyền truy cập (Authentication)bằng JSON Web Token (JWT). Sau khi đào sâu hơn về cái này, mình nhậnthấy quả thực JWT nó còntuyệt vời hơnngoài mong đờivà khả năngcủa nó sẽkhông chỉ dừng lại ở mỗiAuthentication. Qua bài viết này mình muốn giúpnhững ai còn chưa biết tới JWT hoặc chưa hiểu rõ về nó hình dung đượcmô tả trực quan nhấtvề JWT và những gì mà JWT có thể đem lại cho Web Service.

Bạn đang xem : Bearer token là gì

JSON Web Token là gì?

JSON Web Token (JWT) là 1 tiêu chuẩn mở (RFC 7519) định nghĩa cách thức truyền tin an toàn giữa các thành viên bằng 1 đối tượng JSON. Thông tin này có thể được xác thực và đánh dấu tin cậy nhờ vào “chữ ký” của nó. Phần chữ ký của JWT sẽ được mã hóa lạibằng HMAC hoặc RSA.

*

Ví dụ cho 1 JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0. yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXwNhững đặc thù điển hình nổi bật của JWT :Kích thước nhỏ: JWT có thể được truyền thông qua URL, hoặc qua giao thức POST, hay nhét vàobên trong phần HTTP Header. Kích thước nhỏ hơn ứng với công việc truyền tải sẽ nhanh hơn. Dưới đây là cách thức truyền token vào trong HTTP Header sử dụng Bearer SchemaKích thước nhỏ : JWT hoàn toàn có thể được truyền thông qua URL, hoặc qua giao thức POST, hay nhét vàobên trong phần HTTP Header. Kích thước nhỏ hơn ứng với việc làm truyền tải sẽ nhanh hơn. Dưới đây là phương pháp truyền token vào trong HTTP Header sử dụngSchemaAuthorization : Bearer Khép kín : Phần Payload ( hiểu nôm na là khốihàng ) chứa hàng loạt những thông tin mà tất cả chúng ta cần tới, ví dụ như thông tin của người dùng ( thay vì phải truy vấn cơ sở tài liệu nhiều lần )

Khi nào nên dùng JSON Web Token?

Dưới đây là 1 vài kịch bản thích hợp với JWT:Authentication: Đây là kịch bản phổ biến nhất cho việc sử dụng JWT. Một khi người dùng đã đăng nhập vào hệ thống thì những requesttiếp theo từ phía người dùngsẽ chứa thêm mãJWT, cho phép người dùng quyền truy cập vào các đường dẫn, dịch vụ, và tài nguyên mà cần phải có sự cho phép nếu có mã Token đó. Phương pháp này không bị ảnh hưởng bởi Cross-Origin Resource Sharing (CORS)do nó không sử dụng cookie.Dưới đây là 1 vài ngữ cảnh thích hợp với JWT :: Đây là ngữ cảnh phổ cập nhất cho việc sử dụng JWT. Một khi người dùng đã đăng nhập vào mạng lưới hệ thống thì những requesttiếp theo từ phía người dùngsẽ chứa thêm mãJWT, được cho phép người dùng quyền truy vấn vào những đường dẫn, dịch vụ, và tài nguyên mà cần phải có sự được cho phép nếu có mã Token đó. Phương pháp này không bị ảnh hưởng tác động bởi Cross-Origin Resource Sharing ( CORS ) do nó không sử dụng cookie .

Client application API ——– ———– | | | GET /api/employees | |—————————————————–>| | 403 Forbidden | || | 200 Success | | { token: “my.personal.token” } | || | 200 Success | |Trao đổi thông tin: JSON Web Token là 1 cách thức không tồi để truyền tin an toàn giữa các thành viên với nhau, nhờ vào phần “chữ ký” của nó. Phía ngườinhận có thể biết đượcngười gửi là ai thông qua phần chữ ký. Ngoài ra, chữ ký được tạo ra bằng việc kết hợp cảphần header, payload lạinên thông qua đó ta có thể xác nhận được chữ ký có bị giả mạo hay không.Đăng ký ngay hôm nay để xem toàn bộ các video bài giảng, mã nguồn dự án mẫu, hướng dẫn thực hành lập trình HTML5, CSS3, JavaScript

Cấu trúc của JSON Web Token:

JSON Web Token gồm có 3 phần, được ngăn cách nhau bởi dấu chấm (. ) :HeaderPayloadSignature (chữ ký)HeaderPayloadSignature ( chữ ký )Tổng quát thì nó có dạng như sau :xxxxx.yyyyy. zzzzzHãy cùng nhau mày mò mỗi phần bên trong JWT nhé :

Phần Header dùng để khai báo kiểu chữ ký và thuật toán mã hóa sẽ dùng cho cái token của tất cả chúng ta .Xem thêm : Cách Ẩn / Hiện Cột Bị Ẩn Trong Excel, Cách Ẩn / Hiện Cực Nhanh Hàng Hoặc Cột Trong Excel

Ví dụ cho phần Header:

{ “ alg ” : “ HS256 ”, “ typ ” : “ JWT ” } Đoạn Header này khai báo rằng đối tượng người tiêu dùng được mã hóa là 1 JWT ( để phân biệt với JWS hay JWE ), và chữ ký của nó sử dụng thuật toánmã hóa HMAC SHA-256 .

Đoạn Header này sẽ được mã hóa base64url, và ta thu được phần đầu tiên của JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9Chú ý rằng mình viết ở phía trên là base64urlchứ không phải là base64. Về cơ bản 2 cái này là tương tự nhau nhưng giữa chúng vẫn có những sự khác biệt:

Không thêm =vàoCác ký tự +/ sẽ được thay thế bằng _Không thêmvàoCác ký tựvàsẽ được sửa chữa thay thế bằngvà

Các bạn có thể so sánh sự khác biệt của chúng ở trang web encode online này:http://kjur.github.io/jsjws/tool_b64uenc.html

Chúng ta có thể tự triển khai 1 hàm encode base64url do chính mình tạo ra. Dưới đây là code mô phỏng bằng Javascript:

function base64url ( source ) { / / Encode in classical base64 encodedSource = CryptoJS. enc. Base64. stringify ( source ) ; / / Remove padding equal characters encodedSource = encodedSource. replace ( / = + USD /, ” ” ) ; / / Replace characters according to base64url specifications encodedSource = encodedSource. replace ( / \ + / g, ” – ” ) ; encodedSource = encodedSource. replace ( / \ / / g, ” _ ” ) ; return encodedSource ; } Ở đoạn code trên mình đã sử dụng thư viện CryptoJSđể hoàn toàn có thể mã hóa base64 rồi sau đó vô hiệu những ký tự = và thay thế sửa chữa những ký tự + / đi .Để hoàn toàn có thể sử dụng được hàm trên, nguồn vào của bạn cần là 1 mảng byte ở định dạng UTF-8. Ta hoàn toàn có thể quy đổi từ xâu ký tự sang mảng byte bằng 1 hàm khác cũng được phân phối bởi CryptoJS :var source = ” Hello ! ” ; / / 48 65 6 c 6 c 6 f 21console.log ( CryptoJS. enc. Utf8. parse ( source ). toString ( ) ) ; Cuối cùng ta đãthu được phần tiên phong của JWT :var header = { ” alg ” : ” HS256 “, ” typ ” : ” JWT ” } ; var stringifiedHeader = CryptoJS. enc. Utf8. parse ( JSON.stringify ( header ) ) ; var encodedHeader = base64url ( stringifiedHeader ) ;

Payload (Claims):

Phần thứ 2 của token đó là Payload, nơi chứa các nội dung của thông tin (claim). Thông tin truyền đi có thể là mô tả của 1 thực thể (ví dụ như người dùng) hoặc cũng có thể là các thông tin bổ sung thêm cho phần Header. Nhìn chung, chúng được chia làm 3 loại: reserved, public và private.Reserved: là những thông tin đã được quy định ở trongIANA JSON Web Token Claims registry. Chúng bao gồm: Chú ý rằng các khóa của claim đều chỉ dài 3 ký tự vì mục đích giảm kích thước của Tokeniss (issuer): tổ chức phát hành tokensub (subject): chủ đề của tokenaud (audience): đối tượng sử dụng tokenexp(expired time): thời điểmtoken sẽ hết hạnnbf(not before time): token sẽ chưa hợp lệtrước thời điểm nàyiat(issued at): thời điểm token được phát hành, tính theo UNIX timejti: JWT IDPublic: Khóa nên được quy định ở trongIANA JSON Web Token Registry hoặc là 1 URI có chứa không gian tên không bị trùng lặp.Ví dụ:Phần thứ 2 của token đó là Payload, nơi chứa những nội dung của thông tin ( claim ). Thông tin truyền đi hoàn toàn có thể là diễn đạt của 1 thực thể ( ví dụ như người dùng ) hoặc cũng hoàn toàn có thể là những thông tin bổ trợ thêm cho phần Header. Nhìn chung, chúng được chia làm 3 loại : reserved, public và private. : là những thông tin đã được lao lý ở trongIANA JSON Web Token Claims registry. Chúng gồm có : Chú ý rằng những khóa của claim đều chỉ dài 3 ký tự vì mục tiêu giảm kích cỡ của Token ( issuer ) : tổ chức triển khai phát hành token ( subject ) : chủ đề của token ( audience ) : đối tượng người tiêu dùng sử dụng token ( expired time ) : thời điểmtoken sẽ hết hạn ( not before time ) : token sẽ chưa hợp lệtrước thời gian này ( issued at ) : thời gian token được phát hành, tính theo UNIX time : JWT ID : Khóa nên được lao lý ở trongIANA JSON Web Token Registry hoặc là 1 URI có chứa khoảng trống tên không bị trùng lặp. Ví dụ :

“https://www.vuialo.net/jwt_claims/is_admin”: truePrivate: Phần thông tin thêmdùng để truyền qua giữa các máy thành viên.Ví dụ:{ “sub”: “1234567890”, “name”: “paduvi”, “admin”: true}Ví dụ cho phần Payload:

{ “ iss ” : “ vuialo.net ”, “ exp ” : 1426420800, “ https://www.vuialo.net/jwt_claims/is_admin ” : true, “ user ” : “ paduvi ”, “ awesome ” : true } Mã hóa base64url ta thu được phần thứ 2 của token :eyJpc3MiOiJ0ZWNobWFzdGVyIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwczovL3d3dy50ZWNobWFzdGVyLnZuL2p3dF9jbGFpbXMvaXNfYWRtaW4iOnRydWUsInVzZXIiOiJwYWR1dmkiLCJhd2Vzb21lIjp0cnVlfQ

Signature:

Phần chữ ký được tạo bằng cách kết hợp 2 phần Header +Payload, rồi mã hóa nó lạibằng 1 giải thuật encode nào đó, càng phức tạp thì càng tốt, ví dụ nhưHMAC SHA-256Phần chữ ký được tạo bằng cách phối hợp 2 phần Header + Payload, rồi mã hóa nó lạibằng 1 giải thuật encode nào đó, càng phức tạp thì càng tốt, ví dụ nhưHMAC SHA-256USD encodedContent = base64UrlEncode ( header ) + “. ” + base64UrlEncode ( payload ) ; USD signature = hashHmacSHA256 ( $ encodedContent ) ; Rồita sẽthu được phần cuối của token :uL7nEjM7ihbQe7l01rmQCtGYoKyb4VyabWqX8PZKdt4

Putting All Together:

Tổng kết lại, JWT gom lại từ ví dụ trên sẽ có dạng là:Tổng kết lại, JWT gom lại từ ví dụ trên sẽ có dạng là :eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJpc3MiOiJ0ZWNobWFzdGVyIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwczovL3d3dy50ZWNobWFzdGVyLnZuL2p3dF9jbGFpbXMvaXNfYWRtaW4iOnRydWUsInVzZXIiOiJwYWR1dmkiLCJhd2Vzb21lIjp0cnVlfQ. uL7nEjM7ihbQe7l01rmQCtGYoKyb4VyabWqX8PZKdt4Và đây là đoạn code Javascript tiến hành hàng loạt việc làm trên :var header = { ” alg ” : ” HS256 “, ” typ ” : ” JWT ” } ; var stringifiedHeader = CryptoJS. enc. Utf8. parse ( JSON.stringify ( header ) ) ; var encodedHeader = base64url ( stringifiedHeader ) ; var data = { ” iss ” : ” vuialo.net “, ” exp ” : 1426420800, ” https://www.vuialo.net/jwt_claims/is_admin ” : true, ” user ” : ” paduvi “, ” awesome ” : true } ; var stringifiedData = CryptoJS. enc. Utf8. parse ( JSON.stringify ( data ) ) ; var encodedData = base64url ( stringifiedData ) ; var token = encodedHeader + “. ” + encodedData ; var secret = ” My very confidential secret ! ” ; var signature = CryptoJS. HmacSHA256 ( token, secret ) ; signature = base64url ( signature ) ; var signedToken = token + “. ” + signature ; Mình chỉ minh họa như vậy thôi, chứ không khuyến khích mọi người tự mất công làm lại tổng thể những quy trình vì lúc bấy giờ đã có rất nhiều thư viện tương hỗ việc làm này. Các bạn hoàn toàn có thể tìm hiểu thêm list những thư viện và thử debug JWT ở trên trang webhttps : / / jwt.io/ .Hiện tại mình đang lập trình Node. js và Golang nên yêu cầu 2 thư viện rất dễ sử dụng, đó là : jsonwebtoken ( Node. js ) vàdgrijalva / jwt-go ( Golang )

Ví dụ đơn giản về Authentication bằng JWT

Code bên phía API Server, sử dụng Golang :package mainimport ( ” github.com/dgrijalva/jwt-go”jwtmiddleware ” github.com/iris-contrib/middleware/jwt””github.com/kataras/iris ” ) func main ( ) { myJwtMiddleware : = jwtmiddleware. New ( jwtmiddleware. Config { ValidationKeyGetter : func ( token * jwt. Token ) ( interface { }, error ) { return < > byte ( ” My Secret ” ), nil }, SigningMethod : jwt. SigningMethodHS256, } ) iris. Get ( ” / secured / ping “, myJwtMiddleware. Serve, SecuredPingHandler ) iris. Listen ( ” : 8080 ” ) } type Response struct { Text string ` json : ” text ” ` } func SecuredPingHandler ( ctx * iris. Context ) { response : = Response { ” All good. You only get this message if you ” re authenticated ” } / / get the * jwt. Token which contains user information using : / / user : = myJwtMiddleware. Get ( ctx ) or context. Get ( ” jwt ” ). ( * jwt. Token ) ctx. JSON ( iris. StatusOK, response ) } Bây giờ nếu mình vào thử đường dẫnhttp : / / localhost : 8080 / secured / ping bằng trình duyệt ta sẽ thu được hiệu quả là :

Required authorization token not foundĐúng như dự kiến, truy cập vào đường dẫn không thành công do mình chưa khai báo token. Để có thể authenticate thành công, ta cần bổ sung thêm HTTP Header cho request phíaclient truy cập. Phía dưới là code minh họa bằng Node.js:

Status Code : 200R esponse Data : { ” text ” : ” All good. You only get this message if you ” re authenticated ” } Nếu như mình dùng secret key không hợp lệ, hiệu quả trả về sẽ là :

Status Code: 401Response Data: signature is invalidHay bổ sung thêm Reserved Claim nbf(Not before time) với thời gian là khoảng vài phút sau thì kết quả là:

Status Code: 401Response Data: Token is not valid yetNgoài ra, các bạn có thểchỉnh sửa lại code để testnốt với các trường hợp còn lại có thể xảy ra, ví dụ như exp(expired at), iat (issued at)…

Source: https://openlivenft.info
Category : TIN COIN

Đánh giá bài post
- Advertisement -spot_img

More articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisement -spot_img

Latest article

Ethereum là gì? | OpenliveNFT