Hoang  Ha

Hoang Ha

1633935983

Làm mới mã thông báo là gì và cách sử dụng chúng một cách an toàn

Tìm hiểu về mã thông báo làm mới và cách chúng giúp các nhà phát triển cân bằng giữa bảo mật và khả năng sử dụng trong các ứng dụng của họ.

Bài đăng này sẽ khám phá khái niệm về mã thông báo làm mới theo định nghĩa của OAuth 2.0 . Chúng tôi sẽ tìm hiểu cách chúng so sánh với các loại mã thông báo khác và cách chúng cho phép chúng tôi cân bằng tính bảo mật, khả năng sử dụng và quyền riêng tư.

Mã thông báo là gì?

Mã thông báo là các phần dữ liệu chỉ mang đủ thông tin để tạo điều kiện thuận lợi cho quá trình xác định danh tính của người dùng hoặc ủy quyền cho người dùng thực hiện một hành động. Nói chung, mã thông báo là hiện vật cho phép các hệ thống ứng dụng thực hiện quá trình ủy quyền và xác thực.

Các khung và giao thức nhận dạng chung sử dụng các chiến lược dựa trên mã thông báo để bảo mật quyền truy cập vào các ứng dụng và tài nguyên. Ví dụ: chúng tôi có thể sử dụng OAuth 2.0 để ủy quyền và OIDC để xác thực.

OAuth 2.0 là một trong những khuôn khổ ủy quyền phổ biến nhất hiện có. Nó được thiết kế để cho phép một ứng dụng truy cập vào các tài nguyên được lưu trữ bởi các máy chủ khác thay mặt cho người dùng. OAuth 2.0 sử dụng Mã thông báo truy cập và Mã làm mới .

OpenID Connect (OIDC) là một giao thức nhận dạng thực hiện xác thực người dùng, sự đồng ý của người dùng và phát hành mã thông báo. OIDC sử dụng Mã thông báo ID .

Hãy cùng khám phá ba loại mã thông báo mà chúng tôi sử dụng với OAuth 2.0 và OpenID Connect để thực hiện các quy trình xác thực và ủy quyền của hệ thống ứng dụng của chúng tôi. Trong quá trình này, chúng ta sẽ thấy vai trò quan trọng của mã làm mới trong việc giúp các nhà phát triển xây dựng các ứng dụng mang lại sự tiện lợi mà không ảnh hưởng đến bảo mật.

Các loại mã thông báo

Mã thông báo ID là gì?

Như tên có thể gợi ý, mã thông báo ID là một cấu phần mà các ứng dụng khách có thể sử dụng để sử dụng danh tính của người dùng. Ví dụ: mã thông báo ID có thể chứa thông tin về tên, email và ảnh hồ sơ của người dùng. Do đó, các ứng dụng khách có thể sử dụng mã thông báo ID để xây dựng hồ sơ người dùng nhằm cá nhân hóa trải nghiệm người dùng.

Máy chủ xác thực tuân theo giao thức OpenID Connect (OIDC) để thực hiện quy trình xác thực sẽ cấp cho máy khách mã thông báo ID bất cứ khi nào người dùng đăng nhập. Người tiêu dùng mã thông báo ID chủ yếu là các ứng dụng khách như Ứng dụng một trang (SPA) và thiết bị di động các ứng dụng. Họ là đối tượng dự định.

Mã thông báo truy cập là gì?

Khi người dùng đăng nhập, máy chủ ủy quyền sẽ cấp mã thông báo truy cập , này là một cấu phần mà các ứng dụng khách có thể sử dụng để thực hiện các cuộc gọi an toàn đến máy chủ API. Khi ứng dụng khách cần truy cập tài nguyên được bảo vệ trên máy chủ thay mặt cho người dùng, mã thông báo truy cập cho phép ứng dụng báo hiệu với máy chủ rằng nó đã được người dùng ủy quyền để thực hiện các tác vụ nhất định hoặc truy cập tài nguyên nhất định.

OAuth 2.0 không xác định định dạng cho mã thông báo truy cập. Ví dụ: tại Auth0, mã thông báo truy cập được cấp cho API quản lý và mã truy cập được cấp cho bất kỳ API tùy chỉnh nào mà bạn đã đăng ký với Auth0 tuân theo tiêu chuẩn Mã thông báo web JSON (JWT) . Cấu trúc cơ bản của chúng tuân theo cấu trúc JWT điển hình và chúng chứa các tuyên bố JWT tiêu chuẩn được khẳng định về chính mã thông báo.

Đây là nội dung của mã thông báo truy cập được giải mã tuân theo định dạng JWT:

{
  "iss": "https://YOUR_DOMAIN/",
  "sub": "auth0|123456",
  "aud": [
    "my-api-identifier",
    "https://YOUR_DOMAIN/userinfo"
  ],
  "azp": "YOUR_CLIENT_ID",
  "exp": 1489179954,
  "iat": 1489143954,
  "scope": "openid profile email address phone read:appointments"
}

Điều quan trọng cần làm nổi bật là mã thông báo truy cập là mã thông báo mang. Những người nắm giữ mã thông báo có thể sử dụng nó. Sau đó, mã thông báo truy cập hoạt động như một cấu phần xác thực để truy cập các tài nguyên được bảo vệ chứ không phải là một cấu phần nhận dạng. Người dùng độc hại về mặt lý thuyết có thể xâm phạm hệ thống và đánh cắp mã thông báo truy cập, do đó họ có thể sử dụng để truy cập các tài nguyên được bảo vệ bằng cách trình bày trực tiếp các mã thông báo đó lên máy chủ.

Do đó, điều quan trọng là phải có các chiến lược bảo mật để giảm thiểu nguy cơ ảnh hưởng đến mã thông báo truy cập. Một phương pháp giảm thiểu là tạo mã thông báo truy cập có tuổi thọ ngắn: chúng chỉ có giá trị trong một thời gian ngắn được xác định theo giờ hoặc ngày.

Có nhiều cách khác nhau mà ứng dụng khách có thể nhận được mã thông báo truy cập mới cho người dùng. Ví dụ: khi mã thông báo truy cập hết hạn, ứng dụng khách có thể nhắc người dùng đăng nhập lại để nhận mã thông báo truy cập mới. Ngoài ra, máy chủ ủy quyền có thể phát hành mã làm mới cho ứng dụng khách để cho phép nó thay thế mã thông báo truy cập đã hết hạn bằng một mã mới.

Mã làm mới là gì?

Như đã đề cập, vì mục đích bảo mật, mã thông báo truy cập có thể có giá trị trong một khoảng thời gian ngắn. Khi chúng hết hạn, các ứng dụng khách có thể sử dụng mã làm mới để "làm mới" mã thông báo truy cập. Nghĩa là, mã thông báo làm mới là một tạo tác thông tin xác thực cho phép ứng dụng khách nhận mã thông báo truy cập mới mà không cần phải yêu cầu người dùng đăng nhập lại.

Hệ thống ứng dụng trong đó SPA sử dụng mã thông báo làm mới để lấy mã thông báo truy cập mới

Trong sơ đồ trên, SPA = Ứng dụng một trang; AS = Máy chủ ủy quyền; RS = Máy chủ tài nguyên; AT = Mã thông báo truy cập; RT = Làm mới Mã thông báo.

Ứng dụng khách có thể nhận được mã thông báo truy cập mới miễn là mã thông báo làm mới hợp lệ và chưa hết hạn. Do đó, một mã thông báo làm mới có tuổi thọ rất dài về mặt lý thuyết có thể cung cấp sức mạnh vô hạn cho người mang mã thông báo để có được mã thông báo truy cập mới để truy cập các tài nguyên được bảo vệ bất cứ lúc nào. Người mang mã thông báo làm mới có thể là người dùng hợp pháp hoặc người dùng độc hại. Do đó, các công ty bảo mật, chẳng hạn như Auth0, tạo ra các cơ chế để đảm bảo rằng mã thông báo mạnh mẽ này chủ yếu được các bên dự định nắm giữ và sử dụng liên tục.

Khi nào sử dụng mã làm mới

Điều quan trọng cần lưu ý là đặc tả OAuth 2.0 xác định mã thông báo truy cập và mã làm mới. Vì vậy, nếu chúng ta thảo luận về các chiến lược ủy quyền về các giao thức hoặc khuôn khổ nhận dạng khác, chẳng hạn như SAML, chúng ta sẽ không có khái niệm về mã thông báo truy cập hoặc mã thông báo làm mới.

Đối với những người liên quan đến phát triển web, mã thông báo truy cập và mã thông báo làm mới là cuộc nói chuyện phổ biến vì web sử dụng rộng rãi xác thực và ủy quyền dựa trên mã thông báo thông qua khung OAuth 2.0 và giao thức OpenID Connect.

Khi được kết hợp, OAuth 2.0 và OIDC mang lại sự sống động cho một loạt các luồng xác thực và ủy quyền. Mỗi luồng có một bộ lợi ích và lưu ý riêng xác định các kịch bản và kiến ​​trúc tốt nhất mà chúng ta nên sử dụng mã thông báo truy cập và làm mới.

Máy khách có phải là ứng dụng web truyền thống đang thực thi trên máy chủ không? Sử dụng Quy trình mã ủy quyền .

Khách hàng có phải là Ứng dụng một trang (SPA) không? Sử dụng Luồng mã ủy quyền với Khóa bằng chứng cho Trao đổi mã (PKCE) .

Ứng dụng khách có phải là Ứng dụng một trang (SPA) không cần mã thông báo truy cập không? Sử dụng Quy trình ngầm định với Bài đăng trên Biểu mẫu .

Khách hàng có phải là chủ sở hữu tài nguyên không? Bạn có thể sử dụng Quy trình thông tin xác thực khách hàng .

Khách hàng có tin cậy tuyệt đối với thông tin đăng nhập của người dùng không? Bạn có thể sử dụng Luồng mật khẩu của chủ sở hữu tài nguyên .

Nếu có một ứng dụng cho điều đó, thì cũng có một luồng cho điều đó!

Hãy nhớ rằng theo thông số kỹ thuật, khi sử dụng Dòng chảy ngầm định, máy chủ ủy quyền sẽ không phát hành mã thông báo làm mới. Luồng ngầm thường được triển khai trong Ứng dụng một trang (SPA), chạy trên lớp giao diện người dùng của kiến ​​trúc hệ thống. Không có cách nào dễ dàng để giữ mã thông báo làm mới an toàn trong lớp giao diện người dùng của riêng nó.

Việc sử dụng Luồng mã ủy quyền với Khóa bằng chứng để trao đổi mã (PKCE) sẽ giảm thiểu nhiều rủi ro vốn có đối với Luồng ngầm. Ví dụ: khi sử dụng kiểu cấp ngầm, mã thông báo truy cập được truyền trong phân đoạn URI , có thể khiến cho các bên không được phép tiếp xúc. Bạn có thể tìm hiểu thêm về các lỗ hổng này bằng cách đọc phần "Lạm dụng mã truy cập để mạo danh chủ sở hữu tài nguyên trong dòng ngầm" của thông số kỹ thuật.

Tuy nhiên, việc triển khai PKCE trong các ứng dụng của bạn vẫn không ảnh hưởng đến mức độ an toàn của các mã làm mới.

Tuy nhiên, bạn có thể không cần mã thông báo làm mới.

Có những tình huống mà bạn vẫn có thể nhận được mã thông báo truy cập mà không làm gián đoạn người dùng và không cần dựa vào sức mạnh toàn năng của mã thông báo làm mới. Các ví dụ khác để duy trì một phiên có thể là cookie hoặc xác thực im lặng .

Tuy nhiên, hàng tỷ người sử dụng SPA mỗi ngày. Điều quan trọng là phải cung cấp cho người dùng trải nghiệm người dùng cân bằng tốt giữa bảo mật và tiện lợi . Có điều gì chúng tôi có thể làm để cho phép các SPA tạo điều kiện thuận lợi cho việc làm mới mã thông báo theo cách ít rủi ro hơn và an toàn hơn không?

Chắc chắn rồi!

Một nền tảng nhận dạng cung cấp Xoay vòng làm mới mã thông báo làm cho việc sử dụng mã thông báo làm mới với Ứng dụng một trang được chấp nhận. Thông số nhấn mạnh rằng khi bạn không thể xác minh rằng mã thông báo làm mới thuộc về một ứng dụng khách, một SPA như vậy, chúng tôi không nên sử dụng chúng trừ khi chúng tôi có Xoay mã làm mới tại chỗ .

Hãy cùng tìm hiểu thêm về chiến lược bảo mật này trong phần tiếp theo.

Giữ an toàn cho mã thông báo làm mới

Mã thông báo truy cập tồn tại trong thời gian ngắn giúp cải thiện tính bảo mật của các ứng dụng của chúng tôi, nhưng nó đi kèm với một cái giá phải trả: khi nó hết hạn, người dùng cần đăng nhập lại để nhận mã mới. Việc xác thực lại thường xuyên có thể làm giảm trải nghiệm người dùng nhận thức được về ứng dụng của bạn. Ngay cả khi bạn làm như vậy để bảo vệ dữ liệu của họ, người dùng có thể thấy dịch vụ của bạn gây khó chịu hoặc khó sử dụng.

Mã thông báo làm mới có thể giúp bạn cân bằng giữa bảo mật với khả năng sử dụng. Vì mã thông báo làm mới thường tồn tại lâu hơn, bạn có thể sử dụng chúng để yêu cầu mã thông báo truy cập mới sau khi mã thông báo truy cập có tuổi thọ ngắn hơn hết hạn.

Tuy nhiên, vì mã thông báo làm mới cũng là mã thông báo mang, chúng tôi cần phải có một chiến lược để hạn chế hoặc cắt giảm việc sử dụng chúng nếu chúng bị rò rỉ hoặc bị xâm phạm. Tất cả những người nắm giữ mã thông báo làm mới đều có quyền nhận mã thông báo truy cập mới bất cứ khi nào họ muốn. "Họ" có thể là người dùng hợp pháp hoặc kẻ tấn công.

Tại Auth0, chúng tôi đã tạo ra một tập hợp các tính năng giúp giảm thiểu rủi ro liên quan đến việc sử dụng mã thông báo làm mới bằng cách áp đặt các biện pháp bảo vệ và kiểm soát đối với vòng đời của chúng. Nền tảng nhận dạng của chúng tôi cung cấp xoay vòng mã thông báo làm mới, cũng đi kèm với tính năng phát hiện sử dụng lại tự động.

Hãy đi sâu hơn vào kỹ thuật bảo mật này.

Làm mới xoay vòng mã thông báo

Cho đến gần đây, một chiến lược mạnh mẽ để giúp các SPA duy trì phiên của người dùng là sử dụng Luồng mã ủy quyền với PKCE kết hợp với xác thực im lặng. Làm mới vòng quay mã thông báo là một kỹ thuật để nhận mã thông báo truy cập mới bằng cách sử dụng mã làm mới vượt ra ngoài xác thực im lặng .

Vòng quay mã thông báo làm mới đảm bảo rằng mỗi khi ứng dụng trao đổi mã thông báo làm mới để lấy mã thông báo truy cập mới, thì mã làm mới mới cũng được trả lại. Do đó, bạn không còn mã thông báo làm mới tồn tại lâu dài có thể cung cấp quyền truy cập bất hợp pháp vào tài nguyên nếu nó bị xâm phạm. Mối đe dọa về việc truy cập bất hợp pháp được giảm bớt khi các mã thông báo làm mới liên tục được trao đổi và mất hiệu lực.

Ví dụ: với tính năng xoay vòng mã thông báo làm mới được bật trong Bảng điều khiển Auth0, mỗi khi ứng dụng của bạn trao đổi mã thông báo làm mới để lấy mã thông báo truy cập mới, máy chủ ủy quyền cũng trả về một cặp mã thông báo truy cập làm mới mới. Biện pháp bảo vệ này giúp ứng dụng của bạn giảm thiểu các cuộc tấn công phát lại do các mã thông báo bị xâm phạm.

Làm mới mã thông báo tự động phát hiện sử dụng lại

Mã thông báo làm mới là mã thông báo không mang. Máy chủ ủy quyền không thể biết ai là hợp pháp hoặc độc hại khi nhận được yêu cầu mã thông báo truy cập mới. Sau đó, chúng tôi có thể coi tất cả người dùng là có khả năng độc hại.

Làm thế nào chúng ta có thể xử lý tình huống có điều kiện chạy đua giữa người dùng hợp pháp và người dùng độc hại? Ví dụ:

🐱 Người dùng hợp pháp🔄 Mã làm mới 1🔑 Mã truy cập 1 .

😈 Người dùng độc hại quản lý để đánh cắp 🔄 Làm mới mã thông báo 1 từ 🐱 Người dùng hợp pháp .

🐱 Người dùng hợp pháp sử dụng 🔄 Làm mới Mã thông báo 1 để nhận một cặp mã thông báo truy cập làm mới mới.

Các 🚓 Auth0 Authorization server nhuận 🔄 Refresh Mã 2🔑 access token 2 đến 🐱 hợp pháp tài .

😈 Người dùng độc hại sau đó cố gắng sử dụng 🔄 Làm mới mã thông báo 1 để nhận mã thông báo truy cập mới. Thuần ác!

Bạn nghĩ điều gì sẽ xảy ra tiếp theo? Would 😈 độc hại tài quản lý để nhận mã truy cập mới?

Đây là những gì sẽ xảy ra khi nền tảng danh tính của bạn có 🤖 Phát hiện tái sử dụng tự động :

Các 🚓 Auth0 Authorization máy chủ đã được lưu giữ theo dõi của tất cả các mã thông báo refresh giảm dần từ refresh dấu hiệu ban đầu. Đó là, nó đã tạo ra một "gia đình mã thông báo".

Các 🚓 Auth0 Authorization máy chủ nhận ra rằng ai đó đang tái sử dụng 🔄 Refresh Mã 1 và ngay lập tức làm mất hiệu lực gia đình thẻ làm mới, bao gồm 🔄 Refresh Mã 2 .

Các 🚓 Auth0 Authorization server trả về một Access Denied đối phó với 😈 độc hại tài .

🔑 Mã thông báo truy cập 2 hết hạn và 🐱 Người dùng hợp pháp cố gắng sử dụng 🔄 Mã thông báo làm mới 2 để yêu cầu một cặp mã thông báo truy cập làm mới mới.

Các 🚓 Auth0 Authorization server trả về một Access Denied đối phó với 🐱 hợp pháp tài .

Các 🚓 Auth0 Authorization máy chủ đòi hỏi phải tái thẩm định để có được truy cập mới và thẻ làm mới.

Điều quan trọng là mã làm mới được phát hành gần đây nhất phải bị vô hiệu ngay lập tức khi mã làm mới đã sử dụng trước đó được gửi đến máy chủ ủy quyền. Điều này ngăn không cho bất kỳ mã làm mới nào trong cùng một họ mã thông báo được sử dụng để nhận mã thông báo truy cập mới.

Cơ chế bảo vệ này hoạt động bất kể người dùng hợp pháp hay độc hại có thể trao đổi 🔄 Mã thông báo làm mới 1 để lấy cặp mã thông báo truy cập làm mới mới trước cặp mã kia. Nếu không thực thi ràng buộc người gửi, máy chủ ủy quyền không thể biết tác nhân nào là hợp pháp hoặc độc hại trong trường hợp tấn công phát lại.

Tự động phát hiện sử dụng lại là một thành phần chính của chiến lược xoay vòng mã thông báo làm mới. Máy chủ đã làm mất hiệu lực mã thông báo làm mới đã được sử dụng. Tuy nhiên, vì máy chủ ủy quyền không có cách nào để biết liệu người dùng hợp pháp có đang nắm giữ mã thông báo làm mới mới nhất hay không, nên nó sẽ làm mất hiệu lực toàn bộ họ mã thông báo chỉ để an toàn.

Làm mới mã thông báo giúp chúng tôi nắm bắt các công cụ bảo mật

Quyền riêng tư là một chủ đề nóng trong thế giới kỹ thuật số của chúng tôi. Chúng ta không chỉ cần cân bằng giữa bảo mật với tiện lợi mà còn cần thêm quyền riêng tư vào hành động cân bằng.

Những phát triển gần đây trong công nghệ bảo mật của trình duyệt, chẳng hạn như Ngăn chặn Theo dõi Thông minh (ITP), ngăn chặn quyền truy cập vào cookie phiên, yêu cầu người dùng xác thực lại.

Không có cơ chế lưu trữ liên tục nào trong một trình duyệt chỉ có thể đảm bảo quyền truy cập của ứng dụng đã định. Do đó, các mã thông báo làm mới tồn tại lâu dài không phù hợp với các SPA vì có những lỗ hổng mà người dùng độc hại có thể khai thác để lấy được các tạo tác có giá trị cao này, cấp cho họ quyền truy cập vào các tài nguyên được bảo vệ.

Vì xoay vòng mã thông báo làm mới không dựa vào quyền truy cập vào cookie phiên Auth0, nó không bị ảnh hưởng bởi ITP hoặc các cơ chế tương tự.

Tuy nhiên, mã thông báo làm mới có thể có tuổi thọ của nó bị giới hạn bởi tuổi thọ của mã thông báo truy cập. Điều này có nghĩa là chúng tôi có thể sử dụng mã làm mới một cách an toàn để chơi cùng với các công cụ bảo mật của trình duyệt và cung cấp quyền truy cập liên tục cho người dùng cuối mà không làm gián đoạn trải nghiệm người dùng.

Bạn có thể lưu trữ mã làm mới trong bộ nhớ cục bộ

Bạn đã đọc đúng. Khi chúng tôi có vòng quay mã thông báo làm mới tại chỗ, chúng tôi có thể lưu trữ mã thông báo trong bộ nhớ cục bộ hoặc bộ nhớ trình duyệt.

Bạn có thể đã nghe trước đây (có thể từ chúng tôi) rằng chúng tôi không nên lưu trữ mã thông báo trong bộ nhớ cục bộ.

Lưu trữ mã thông báo trong bộ nhớ cục bộ của trình duyệt cung cấp sự bền bỉ trên các lần làm mới trang và các tab trình duyệt; tuy nhiên, nếu người dùng độc hại quản lý để chạy JavaScript trong SPA bằng cách sử dụng cuộc tấn công tập lệnh trên nhiều trang web (XSS), họ có thể truy xuất mã thông báo được lưu trữ trong bộ nhớ cục bộ. Một lỗ hổng dẫn đến một cuộc tấn công XSS thành công có thể có trong mã nguồn SPA hoặc bất kỳ mã JavaScript nào của bên thứ ba mà ứng dụng sử dụng, chẳng hạn như Bootstrap hoặc Google Analytics.

Tuy nhiên, chúng tôi có thể giảm thời gian hết hạn tuyệt đối của mã thông báo để giảm rủi ro bảo mật khi lưu trữ mã thông báo trong bộ nhớ cục bộ. Điều này làm giảm tác động của một cuộc tấn công XSS được phản ánh (nhưng không phải là một cuộc tấn công dai dẳng). Mã thông báo làm mới có thể có tuổi thọ lâu dài theo cấu hình. Tuy nhiên, tuổi thọ dài được xác định của mã thông báo làm mới bị cắt ngắn với việc xoay vòng mã thông báo làm mới. Việc làm mới chỉ hợp lệ trong vòng đời của mã thông báo truy cập, sẽ tồn tại trong thời gian ngắn.

Sử dụng mã làm mới trong ứng dụng Auth0 của bạn

Nếu bạn quan tâm đến việc thêm xác thực và ủy quyền vào ứng dụng của mình chỉ trong vài bước, hãy đăng ký tài khoản Auth0 miễn phí ngay bây giờ .

Tài liệu "Các phương pháp hay nhất về mã thông báo " của chúng tôi nêu một số lưu ý cơ bản cần ghi nhớ khi sử dụng mã thông báo:

  • Giữ bí mật. Giữ nó an toàn.
  • Không thêm dữ liệu nhạy cảm vào tải trọng.
  • Cung cấp cho các mã thông báo hết hạn.
  • Nắm bắt HTTPS.
  • Xem xét tất cả các trường hợp sử dụng ủy quyền của bạn.
  • Lưu trữ và tái sử dụng.

Bảng điều khiển Auth0 giúp bạn dễ dàng định cấu hình các dịch vụ xác thực và ủy quyền để sử dụng mã thông báo làm mới. Các thư viện và SDK Auth0 hỗ trợ mã thông báo làm mới cho các ứng dụng web, Ứng dụng một trang (SPA) và ứng dụng gốc / ứng dụng dành cho thiết bị di động.

Nguồn: https://auth0.com

#jwt #auth0 #security #jwt 

What is GEEK

Buddha Community

Làm mới mã thông báo là gì và cách sử dụng chúng một cách an toàn
Hoang  Ha

Hoang Ha

1633935983

Làm mới mã thông báo là gì và cách sử dụng chúng một cách an toàn

Tìm hiểu về mã thông báo làm mới và cách chúng giúp các nhà phát triển cân bằng giữa bảo mật và khả năng sử dụng trong các ứng dụng của họ.

Bài đăng này sẽ khám phá khái niệm về mã thông báo làm mới theo định nghĩa của OAuth 2.0 . Chúng tôi sẽ tìm hiểu cách chúng so sánh với các loại mã thông báo khác và cách chúng cho phép chúng tôi cân bằng tính bảo mật, khả năng sử dụng và quyền riêng tư.

Mã thông báo là gì?

Mã thông báo là các phần dữ liệu chỉ mang đủ thông tin để tạo điều kiện thuận lợi cho quá trình xác định danh tính của người dùng hoặc ủy quyền cho người dùng thực hiện một hành động. Nói chung, mã thông báo là hiện vật cho phép các hệ thống ứng dụng thực hiện quá trình ủy quyền và xác thực.

Các khung và giao thức nhận dạng chung sử dụng các chiến lược dựa trên mã thông báo để bảo mật quyền truy cập vào các ứng dụng và tài nguyên. Ví dụ: chúng tôi có thể sử dụng OAuth 2.0 để ủy quyền và OIDC để xác thực.

OAuth 2.0 là một trong những khuôn khổ ủy quyền phổ biến nhất hiện có. Nó được thiết kế để cho phép một ứng dụng truy cập vào các tài nguyên được lưu trữ bởi các máy chủ khác thay mặt cho người dùng. OAuth 2.0 sử dụng Mã thông báo truy cập và Mã làm mới .

OpenID Connect (OIDC) là một giao thức nhận dạng thực hiện xác thực người dùng, sự đồng ý của người dùng và phát hành mã thông báo. OIDC sử dụng Mã thông báo ID .

Hãy cùng khám phá ba loại mã thông báo mà chúng tôi sử dụng với OAuth 2.0 và OpenID Connect để thực hiện các quy trình xác thực và ủy quyền của hệ thống ứng dụng của chúng tôi. Trong quá trình này, chúng ta sẽ thấy vai trò quan trọng của mã làm mới trong việc giúp các nhà phát triển xây dựng các ứng dụng mang lại sự tiện lợi mà không ảnh hưởng đến bảo mật.

Các loại mã thông báo

Mã thông báo ID là gì?

Như tên có thể gợi ý, mã thông báo ID là một cấu phần mà các ứng dụng khách có thể sử dụng để sử dụng danh tính của người dùng. Ví dụ: mã thông báo ID có thể chứa thông tin về tên, email và ảnh hồ sơ của người dùng. Do đó, các ứng dụng khách có thể sử dụng mã thông báo ID để xây dựng hồ sơ người dùng nhằm cá nhân hóa trải nghiệm người dùng.

Máy chủ xác thực tuân theo giao thức OpenID Connect (OIDC) để thực hiện quy trình xác thực sẽ cấp cho máy khách mã thông báo ID bất cứ khi nào người dùng đăng nhập. Người tiêu dùng mã thông báo ID chủ yếu là các ứng dụng khách như Ứng dụng một trang (SPA) và thiết bị di động các ứng dụng. Họ là đối tượng dự định.

Mã thông báo truy cập là gì?

Khi người dùng đăng nhập, máy chủ ủy quyền sẽ cấp mã thông báo truy cập , này là một cấu phần mà các ứng dụng khách có thể sử dụng để thực hiện các cuộc gọi an toàn đến máy chủ API. Khi ứng dụng khách cần truy cập tài nguyên được bảo vệ trên máy chủ thay mặt cho người dùng, mã thông báo truy cập cho phép ứng dụng báo hiệu với máy chủ rằng nó đã được người dùng ủy quyền để thực hiện các tác vụ nhất định hoặc truy cập tài nguyên nhất định.

OAuth 2.0 không xác định định dạng cho mã thông báo truy cập. Ví dụ: tại Auth0, mã thông báo truy cập được cấp cho API quản lý và mã truy cập được cấp cho bất kỳ API tùy chỉnh nào mà bạn đã đăng ký với Auth0 tuân theo tiêu chuẩn Mã thông báo web JSON (JWT) . Cấu trúc cơ bản của chúng tuân theo cấu trúc JWT điển hình và chúng chứa các tuyên bố JWT tiêu chuẩn được khẳng định về chính mã thông báo.

Đây là nội dung của mã thông báo truy cập được giải mã tuân theo định dạng JWT:

{
  "iss": "https://YOUR_DOMAIN/",
  "sub": "auth0|123456",
  "aud": [
    "my-api-identifier",
    "https://YOUR_DOMAIN/userinfo"
  ],
  "azp": "YOUR_CLIENT_ID",
  "exp": 1489179954,
  "iat": 1489143954,
  "scope": "openid profile email address phone read:appointments"
}

Điều quan trọng cần làm nổi bật là mã thông báo truy cập là mã thông báo mang. Những người nắm giữ mã thông báo có thể sử dụng nó. Sau đó, mã thông báo truy cập hoạt động như một cấu phần xác thực để truy cập các tài nguyên được bảo vệ chứ không phải là một cấu phần nhận dạng. Người dùng độc hại về mặt lý thuyết có thể xâm phạm hệ thống và đánh cắp mã thông báo truy cập, do đó họ có thể sử dụng để truy cập các tài nguyên được bảo vệ bằng cách trình bày trực tiếp các mã thông báo đó lên máy chủ.

Do đó, điều quan trọng là phải có các chiến lược bảo mật để giảm thiểu nguy cơ ảnh hưởng đến mã thông báo truy cập. Một phương pháp giảm thiểu là tạo mã thông báo truy cập có tuổi thọ ngắn: chúng chỉ có giá trị trong một thời gian ngắn được xác định theo giờ hoặc ngày.

Có nhiều cách khác nhau mà ứng dụng khách có thể nhận được mã thông báo truy cập mới cho người dùng. Ví dụ: khi mã thông báo truy cập hết hạn, ứng dụng khách có thể nhắc người dùng đăng nhập lại để nhận mã thông báo truy cập mới. Ngoài ra, máy chủ ủy quyền có thể phát hành mã làm mới cho ứng dụng khách để cho phép nó thay thế mã thông báo truy cập đã hết hạn bằng một mã mới.

Mã làm mới là gì?

Như đã đề cập, vì mục đích bảo mật, mã thông báo truy cập có thể có giá trị trong một khoảng thời gian ngắn. Khi chúng hết hạn, các ứng dụng khách có thể sử dụng mã làm mới để "làm mới" mã thông báo truy cập. Nghĩa là, mã thông báo làm mới là một tạo tác thông tin xác thực cho phép ứng dụng khách nhận mã thông báo truy cập mới mà không cần phải yêu cầu người dùng đăng nhập lại.

Hệ thống ứng dụng trong đó SPA sử dụng mã thông báo làm mới để lấy mã thông báo truy cập mới

Trong sơ đồ trên, SPA = Ứng dụng một trang; AS = Máy chủ ủy quyền; RS = Máy chủ tài nguyên; AT = Mã thông báo truy cập; RT = Làm mới Mã thông báo.

Ứng dụng khách có thể nhận được mã thông báo truy cập mới miễn là mã thông báo làm mới hợp lệ và chưa hết hạn. Do đó, một mã thông báo làm mới có tuổi thọ rất dài về mặt lý thuyết có thể cung cấp sức mạnh vô hạn cho người mang mã thông báo để có được mã thông báo truy cập mới để truy cập các tài nguyên được bảo vệ bất cứ lúc nào. Người mang mã thông báo làm mới có thể là người dùng hợp pháp hoặc người dùng độc hại. Do đó, các công ty bảo mật, chẳng hạn như Auth0, tạo ra các cơ chế để đảm bảo rằng mã thông báo mạnh mẽ này chủ yếu được các bên dự định nắm giữ và sử dụng liên tục.

Khi nào sử dụng mã làm mới

Điều quan trọng cần lưu ý là đặc tả OAuth 2.0 xác định mã thông báo truy cập và mã làm mới. Vì vậy, nếu chúng ta thảo luận về các chiến lược ủy quyền về các giao thức hoặc khuôn khổ nhận dạng khác, chẳng hạn như SAML, chúng ta sẽ không có khái niệm về mã thông báo truy cập hoặc mã thông báo làm mới.

Đối với những người liên quan đến phát triển web, mã thông báo truy cập và mã thông báo làm mới là cuộc nói chuyện phổ biến vì web sử dụng rộng rãi xác thực và ủy quyền dựa trên mã thông báo thông qua khung OAuth 2.0 và giao thức OpenID Connect.

Khi được kết hợp, OAuth 2.0 và OIDC mang lại sự sống động cho một loạt các luồng xác thực và ủy quyền. Mỗi luồng có một bộ lợi ích và lưu ý riêng xác định các kịch bản và kiến ​​trúc tốt nhất mà chúng ta nên sử dụng mã thông báo truy cập và làm mới.

Máy khách có phải là ứng dụng web truyền thống đang thực thi trên máy chủ không? Sử dụng Quy trình mã ủy quyền .

Khách hàng có phải là Ứng dụng một trang (SPA) không? Sử dụng Luồng mã ủy quyền với Khóa bằng chứng cho Trao đổi mã (PKCE) .

Ứng dụng khách có phải là Ứng dụng một trang (SPA) không cần mã thông báo truy cập không? Sử dụng Quy trình ngầm định với Bài đăng trên Biểu mẫu .

Khách hàng có phải là chủ sở hữu tài nguyên không? Bạn có thể sử dụng Quy trình thông tin xác thực khách hàng .

Khách hàng có tin cậy tuyệt đối với thông tin đăng nhập của người dùng không? Bạn có thể sử dụng Luồng mật khẩu của chủ sở hữu tài nguyên .

Nếu có một ứng dụng cho điều đó, thì cũng có một luồng cho điều đó!

Hãy nhớ rằng theo thông số kỹ thuật, khi sử dụng Dòng chảy ngầm định, máy chủ ủy quyền sẽ không phát hành mã thông báo làm mới. Luồng ngầm thường được triển khai trong Ứng dụng một trang (SPA), chạy trên lớp giao diện người dùng của kiến ​​trúc hệ thống. Không có cách nào dễ dàng để giữ mã thông báo làm mới an toàn trong lớp giao diện người dùng của riêng nó.

Việc sử dụng Luồng mã ủy quyền với Khóa bằng chứng để trao đổi mã (PKCE) sẽ giảm thiểu nhiều rủi ro vốn có đối với Luồng ngầm. Ví dụ: khi sử dụng kiểu cấp ngầm, mã thông báo truy cập được truyền trong phân đoạn URI , có thể khiến cho các bên không được phép tiếp xúc. Bạn có thể tìm hiểu thêm về các lỗ hổng này bằng cách đọc phần "Lạm dụng mã truy cập để mạo danh chủ sở hữu tài nguyên trong dòng ngầm" của thông số kỹ thuật.

Tuy nhiên, việc triển khai PKCE trong các ứng dụng của bạn vẫn không ảnh hưởng đến mức độ an toàn của các mã làm mới.

Tuy nhiên, bạn có thể không cần mã thông báo làm mới.

Có những tình huống mà bạn vẫn có thể nhận được mã thông báo truy cập mà không làm gián đoạn người dùng và không cần dựa vào sức mạnh toàn năng của mã thông báo làm mới. Các ví dụ khác để duy trì một phiên có thể là cookie hoặc xác thực im lặng .

Tuy nhiên, hàng tỷ người sử dụng SPA mỗi ngày. Điều quan trọng là phải cung cấp cho người dùng trải nghiệm người dùng cân bằng tốt giữa bảo mật và tiện lợi . Có điều gì chúng tôi có thể làm để cho phép các SPA tạo điều kiện thuận lợi cho việc làm mới mã thông báo theo cách ít rủi ro hơn và an toàn hơn không?

Chắc chắn rồi!

Một nền tảng nhận dạng cung cấp Xoay vòng làm mới mã thông báo làm cho việc sử dụng mã thông báo làm mới với Ứng dụng một trang được chấp nhận. Thông số nhấn mạnh rằng khi bạn không thể xác minh rằng mã thông báo làm mới thuộc về một ứng dụng khách, một SPA như vậy, chúng tôi không nên sử dụng chúng trừ khi chúng tôi có Xoay mã làm mới tại chỗ .

Hãy cùng tìm hiểu thêm về chiến lược bảo mật này trong phần tiếp theo.

Giữ an toàn cho mã thông báo làm mới

Mã thông báo truy cập tồn tại trong thời gian ngắn giúp cải thiện tính bảo mật của các ứng dụng của chúng tôi, nhưng nó đi kèm với một cái giá phải trả: khi nó hết hạn, người dùng cần đăng nhập lại để nhận mã mới. Việc xác thực lại thường xuyên có thể làm giảm trải nghiệm người dùng nhận thức được về ứng dụng của bạn. Ngay cả khi bạn làm như vậy để bảo vệ dữ liệu của họ, người dùng có thể thấy dịch vụ của bạn gây khó chịu hoặc khó sử dụng.

Mã thông báo làm mới có thể giúp bạn cân bằng giữa bảo mật với khả năng sử dụng. Vì mã thông báo làm mới thường tồn tại lâu hơn, bạn có thể sử dụng chúng để yêu cầu mã thông báo truy cập mới sau khi mã thông báo truy cập có tuổi thọ ngắn hơn hết hạn.

Tuy nhiên, vì mã thông báo làm mới cũng là mã thông báo mang, chúng tôi cần phải có một chiến lược để hạn chế hoặc cắt giảm việc sử dụng chúng nếu chúng bị rò rỉ hoặc bị xâm phạm. Tất cả những người nắm giữ mã thông báo làm mới đều có quyền nhận mã thông báo truy cập mới bất cứ khi nào họ muốn. "Họ" có thể là người dùng hợp pháp hoặc kẻ tấn công.

Tại Auth0, chúng tôi đã tạo ra một tập hợp các tính năng giúp giảm thiểu rủi ro liên quan đến việc sử dụng mã thông báo làm mới bằng cách áp đặt các biện pháp bảo vệ và kiểm soát đối với vòng đời của chúng. Nền tảng nhận dạng của chúng tôi cung cấp xoay vòng mã thông báo làm mới, cũng đi kèm với tính năng phát hiện sử dụng lại tự động.

Hãy đi sâu hơn vào kỹ thuật bảo mật này.

Làm mới xoay vòng mã thông báo

Cho đến gần đây, một chiến lược mạnh mẽ để giúp các SPA duy trì phiên của người dùng là sử dụng Luồng mã ủy quyền với PKCE kết hợp với xác thực im lặng. Làm mới vòng quay mã thông báo là một kỹ thuật để nhận mã thông báo truy cập mới bằng cách sử dụng mã làm mới vượt ra ngoài xác thực im lặng .

Vòng quay mã thông báo làm mới đảm bảo rằng mỗi khi ứng dụng trao đổi mã thông báo làm mới để lấy mã thông báo truy cập mới, thì mã làm mới mới cũng được trả lại. Do đó, bạn không còn mã thông báo làm mới tồn tại lâu dài có thể cung cấp quyền truy cập bất hợp pháp vào tài nguyên nếu nó bị xâm phạm. Mối đe dọa về việc truy cập bất hợp pháp được giảm bớt khi các mã thông báo làm mới liên tục được trao đổi và mất hiệu lực.

Ví dụ: với tính năng xoay vòng mã thông báo làm mới được bật trong Bảng điều khiển Auth0, mỗi khi ứng dụng của bạn trao đổi mã thông báo làm mới để lấy mã thông báo truy cập mới, máy chủ ủy quyền cũng trả về một cặp mã thông báo truy cập làm mới mới. Biện pháp bảo vệ này giúp ứng dụng của bạn giảm thiểu các cuộc tấn công phát lại do các mã thông báo bị xâm phạm.

Làm mới mã thông báo tự động phát hiện sử dụng lại

Mã thông báo làm mới là mã thông báo không mang. Máy chủ ủy quyền không thể biết ai là hợp pháp hoặc độc hại khi nhận được yêu cầu mã thông báo truy cập mới. Sau đó, chúng tôi có thể coi tất cả người dùng là có khả năng độc hại.

Làm thế nào chúng ta có thể xử lý tình huống có điều kiện chạy đua giữa người dùng hợp pháp và người dùng độc hại? Ví dụ:

🐱 Người dùng hợp pháp🔄 Mã làm mới 1🔑 Mã truy cập 1 .

😈 Người dùng độc hại quản lý để đánh cắp 🔄 Làm mới mã thông báo 1 từ 🐱 Người dùng hợp pháp .

🐱 Người dùng hợp pháp sử dụng 🔄 Làm mới Mã thông báo 1 để nhận một cặp mã thông báo truy cập làm mới mới.

Các 🚓 Auth0 Authorization server nhuận 🔄 Refresh Mã 2🔑 access token 2 đến 🐱 hợp pháp tài .

😈 Người dùng độc hại sau đó cố gắng sử dụng 🔄 Làm mới mã thông báo 1 để nhận mã thông báo truy cập mới. Thuần ác!

Bạn nghĩ điều gì sẽ xảy ra tiếp theo? Would 😈 độc hại tài quản lý để nhận mã truy cập mới?

Đây là những gì sẽ xảy ra khi nền tảng danh tính của bạn có 🤖 Phát hiện tái sử dụng tự động :

Các 🚓 Auth0 Authorization máy chủ đã được lưu giữ theo dõi của tất cả các mã thông báo refresh giảm dần từ refresh dấu hiệu ban đầu. Đó là, nó đã tạo ra một "gia đình mã thông báo".

Các 🚓 Auth0 Authorization máy chủ nhận ra rằng ai đó đang tái sử dụng 🔄 Refresh Mã 1 và ngay lập tức làm mất hiệu lực gia đình thẻ làm mới, bao gồm 🔄 Refresh Mã 2 .

Các 🚓 Auth0 Authorization server trả về một Access Denied đối phó với 😈 độc hại tài .

🔑 Mã thông báo truy cập 2 hết hạn và 🐱 Người dùng hợp pháp cố gắng sử dụng 🔄 Mã thông báo làm mới 2 để yêu cầu một cặp mã thông báo truy cập làm mới mới.

Các 🚓 Auth0 Authorization server trả về một Access Denied đối phó với 🐱 hợp pháp tài .

Các 🚓 Auth0 Authorization máy chủ đòi hỏi phải tái thẩm định để có được truy cập mới và thẻ làm mới.

Điều quan trọng là mã làm mới được phát hành gần đây nhất phải bị vô hiệu ngay lập tức khi mã làm mới đã sử dụng trước đó được gửi đến máy chủ ủy quyền. Điều này ngăn không cho bất kỳ mã làm mới nào trong cùng một họ mã thông báo được sử dụng để nhận mã thông báo truy cập mới.

Cơ chế bảo vệ này hoạt động bất kể người dùng hợp pháp hay độc hại có thể trao đổi 🔄 Mã thông báo làm mới 1 để lấy cặp mã thông báo truy cập làm mới mới trước cặp mã kia. Nếu không thực thi ràng buộc người gửi, máy chủ ủy quyền không thể biết tác nhân nào là hợp pháp hoặc độc hại trong trường hợp tấn công phát lại.

Tự động phát hiện sử dụng lại là một thành phần chính của chiến lược xoay vòng mã thông báo làm mới. Máy chủ đã làm mất hiệu lực mã thông báo làm mới đã được sử dụng. Tuy nhiên, vì máy chủ ủy quyền không có cách nào để biết liệu người dùng hợp pháp có đang nắm giữ mã thông báo làm mới mới nhất hay không, nên nó sẽ làm mất hiệu lực toàn bộ họ mã thông báo chỉ để an toàn.

Làm mới mã thông báo giúp chúng tôi nắm bắt các công cụ bảo mật

Quyền riêng tư là một chủ đề nóng trong thế giới kỹ thuật số của chúng tôi. Chúng ta không chỉ cần cân bằng giữa bảo mật với tiện lợi mà còn cần thêm quyền riêng tư vào hành động cân bằng.

Những phát triển gần đây trong công nghệ bảo mật của trình duyệt, chẳng hạn như Ngăn chặn Theo dõi Thông minh (ITP), ngăn chặn quyền truy cập vào cookie phiên, yêu cầu người dùng xác thực lại.

Không có cơ chế lưu trữ liên tục nào trong một trình duyệt chỉ có thể đảm bảo quyền truy cập của ứng dụng đã định. Do đó, các mã thông báo làm mới tồn tại lâu dài không phù hợp với các SPA vì có những lỗ hổng mà người dùng độc hại có thể khai thác để lấy được các tạo tác có giá trị cao này, cấp cho họ quyền truy cập vào các tài nguyên được bảo vệ.

Vì xoay vòng mã thông báo làm mới không dựa vào quyền truy cập vào cookie phiên Auth0, nó không bị ảnh hưởng bởi ITP hoặc các cơ chế tương tự.

Tuy nhiên, mã thông báo làm mới có thể có tuổi thọ của nó bị giới hạn bởi tuổi thọ của mã thông báo truy cập. Điều này có nghĩa là chúng tôi có thể sử dụng mã làm mới một cách an toàn để chơi cùng với các công cụ bảo mật của trình duyệt và cung cấp quyền truy cập liên tục cho người dùng cuối mà không làm gián đoạn trải nghiệm người dùng.

Bạn có thể lưu trữ mã làm mới trong bộ nhớ cục bộ

Bạn đã đọc đúng. Khi chúng tôi có vòng quay mã thông báo làm mới tại chỗ, chúng tôi có thể lưu trữ mã thông báo trong bộ nhớ cục bộ hoặc bộ nhớ trình duyệt.

Bạn có thể đã nghe trước đây (có thể từ chúng tôi) rằng chúng tôi không nên lưu trữ mã thông báo trong bộ nhớ cục bộ.

Lưu trữ mã thông báo trong bộ nhớ cục bộ của trình duyệt cung cấp sự bền bỉ trên các lần làm mới trang và các tab trình duyệt; tuy nhiên, nếu người dùng độc hại quản lý để chạy JavaScript trong SPA bằng cách sử dụng cuộc tấn công tập lệnh trên nhiều trang web (XSS), họ có thể truy xuất mã thông báo được lưu trữ trong bộ nhớ cục bộ. Một lỗ hổng dẫn đến một cuộc tấn công XSS thành công có thể có trong mã nguồn SPA hoặc bất kỳ mã JavaScript nào của bên thứ ba mà ứng dụng sử dụng, chẳng hạn như Bootstrap hoặc Google Analytics.

Tuy nhiên, chúng tôi có thể giảm thời gian hết hạn tuyệt đối của mã thông báo để giảm rủi ro bảo mật khi lưu trữ mã thông báo trong bộ nhớ cục bộ. Điều này làm giảm tác động của một cuộc tấn công XSS được phản ánh (nhưng không phải là một cuộc tấn công dai dẳng). Mã thông báo làm mới có thể có tuổi thọ lâu dài theo cấu hình. Tuy nhiên, tuổi thọ dài được xác định của mã thông báo làm mới bị cắt ngắn với việc xoay vòng mã thông báo làm mới. Việc làm mới chỉ hợp lệ trong vòng đời của mã thông báo truy cập, sẽ tồn tại trong thời gian ngắn.

Sử dụng mã làm mới trong ứng dụng Auth0 của bạn

Nếu bạn quan tâm đến việc thêm xác thực và ủy quyền vào ứng dụng của mình chỉ trong vài bước, hãy đăng ký tài khoản Auth0 miễn phí ngay bây giờ .

Tài liệu "Các phương pháp hay nhất về mã thông báo " của chúng tôi nêu một số lưu ý cơ bản cần ghi nhớ khi sử dụng mã thông báo:

  • Giữ bí mật. Giữ nó an toàn.
  • Không thêm dữ liệu nhạy cảm vào tải trọng.
  • Cung cấp cho các mã thông báo hết hạn.
  • Nắm bắt HTTPS.
  • Xem xét tất cả các trường hợp sử dụng ủy quyền của bạn.
  • Lưu trữ và tái sử dụng.

Bảng điều khiển Auth0 giúp bạn dễ dàng định cấu hình các dịch vụ xác thực và ủy quyền để sử dụng mã thông báo làm mới. Các thư viện và SDK Auth0 hỗ trợ mã thông báo làm mới cho các ứng dụng web, Ứng dụng một trang (SPA) và ứng dụng gốc / ứng dụng dành cho thiết bị di động.

Nguồn: https://auth0.com

#jwt #auth0 #security #jwt 

Hoang  Kim

Hoang Kim

1646842141

Mã Hóa Có Nghĩa Là Gì Và Nó Được Sử Dụng Để Làm Gì?

Bạn có thể đã nghe thuật ngữ "mã hóa" một thời gian. Nó đã thay đổi cách chúng ta sống và làm việc, từ việc tự động hóa các công việc sang việc giúp mọi người có được công việc được trả lương cao để hỗ trợ gia đình của họ.

Nếu bạn muốn tìm hiểu về ý nghĩa của việc viết mã và nó được sử dụng để làm gì, bạn đã đến đúng nơi. Trong bài viết này, tôi sẽ đi sâu vào viết mã thực sự là gì, bạn có thể làm gì với nó và cách bạn có thể học viết mã.

Ý nghĩa của mã hóa

Mã hóa là quá trình tạo ra các hướng dẫn mà máy tính sau đó giải thích và làm theo. Mã hóa còn được gọi là lập trình - mặc dù nhiều người cho rằng có sự khác biệt nhỏ giữa hai phương pháp này, nhưng về lâu dài, mã hóa và lập trình vẫn tham chiếu đến cùng một quy trình chung.

Những người viết mã được gọi là lập trình viên hoặc nhà phát triển và tập hợp các hướng dẫn mà họ truyền cho máy tính được gọi là chương trình.

Các chương trình này có thể được máy tính thông dịch để sau đó máy tính có thể thực thi những gì mà lập trình viên định làm cho nó. Ví dụ về các chương trình và những thứ được xây dựng bằng mã là trang web, ứng dụng web, ứng dụng di động, trò chơi và hệ thống trí tuệ nhân tạo.

Tại sao mã hóa lại quan trọng?

Máy tính không hiểu ngôn ngữ mà con người chúng ta nói. Vì vậy, với tư cách là một con người để giao tiếp với máy tính, bạn cần phải học một ngôn ngữ mã hóa, hay nói cách khác, một ngôn ngữ lập trình.

Loại mã chính mà máy tính hiểu là nhị phân. Nhị phân chỉ bao gồm các số 0 và 1, với 0 nghĩa là tắt và 1 nghĩa là bật.

Máy tính hiểu các số 0 và 1 này vì chúng được tạo ra bằng cách kết hợp hàng nghìn bóng bán dẫn - các công tắc tắt và bật trạng thái rắn.

Các số 0 của nhị phân thông báo cho các bóng bán dẫn tắt và số 1 cho các bóng bán dẫn bật. Khi hàng nghìn bóng bán dẫn này hoạt động thông qua sự trợ giúp của hệ nhị phân, thì bạn có thể giao tiếp với máy tính và yêu cầu chúng làm điều gì đó cho bạn.

Nhược điểm của hệ nhị phân là làm việc với nó để bật và tắt hàng nghìn bóng bán dẫn trong máy tính bằng tay sẽ mất nhiều thời gian. Vì vậy, các ngôn ngữ lập trình cấp thấp và cấp cao khác đã được tạo ra để giúp các lập trình viên thực hiện các công việc này dễ dàng hơn.

Điều này đưa chúng ta đến chủ đề tiếp theo - tìm hiểu ngôn ngữ lập trình là gì.

Ngôn ngữ lập trình là gì?

Ngôn ngữ lập trình xác định một tập hợp các quy tắc phải tuân theo để viết mã cho phép chúng ta giao tiếp với máy tính.

Với các ngôn ngữ lập trình này, bạn có thể viết mã để tạo trang web, ứng dụng web, ứng dụng di động, ứng dụng máy tính để bàn và nhiều thứ khác.

Ví dụ về các ngôn ngữ lập trình này là C, C ++, C #, Java, JavaScript, PHP, Ruby, R, Solidity, Python, SQL, và nhiều ngôn ngữ khác.

Tất cả các ngôn ngữ lập trình này đều là cấp thấp hoặc cấp cao. Các ngôn ngữ lập trình cấp thấp gần với hệ nhị phân hơn và cần có thời gian để làm quen với nó. Một số ví dụ là C và C ++.

Mặt khác, các ngôn ngữ cấp cao gần với ngôn ngữ của con người hơn và bạn có thể viết một lượng lớn chúng bằng tiếng Anh thuần túy. Chúng dễ bắt đầu hơn và hiệu quả khi được triển khai. Một số ví dụ là Python và JavaScript.

Các ngôn ngữ lập trình là duy nhất trong cách hoạt động và những gì chúng làm chủ yếu.

Ví dụ: JavaScript chủ yếu được sử dụng để lập trình trang web và ứng dụng web, PHP được sử dụng để tạo máy chủ web, Python là mục đích chung và cũng được sử dụng để lập trình phía máy chủ và C ++ gần gũi hơn với máy móc và do đó nó được sử dụng để làm cho máy tính vận hành. hệ thống và máy lập trình.

Mã hóa được sử dụng để làm gì?

Trong cuộc sống hàng ngày của chúng ta, mã hóa ở khắp mọi nơi và được sử dụng cho hầu hết mọi thứ. Vì mã hóa được sử dụng cho hầu hết mọi thứ, nên các lập trình viên máy tính cần phải chuyên sâu về một lĩnh vực cụ thể.

Một số ứng dụng chính của mã hóa là trong phát triển web, phát triển ứng dụng dành cho thiết bị di động, quản trị cơ sở dữ liệu và hơn thế nữa.

Phát triển web

Phát triển web liên quan đến việc tạo ra các trang web và ứng dụng web. Các chuyên gia tạo ra các trang web và ứng dụng web này được gọi là nhà phát triển web.

Trong phát triển web, có phát triển giao diện người dùng và phát triển phụ trợ.

Phát triển giao diện người dùng liên quan đến việc tạo giao diện người dùng (UI) với các ngôn ngữ đánh dấu như HTML và CSS, và một chương trình được gọi là JavaScript. Những người tạo ra các giao diện người dùng này được gọi là nhà phát triển giao diện người dùng.

Để có tính linh hoạt, JavaScript được xây dựng nhiều hơn khi sử dụng các thư viện và khuôn khổ như React, Vue, Svelte và Angular.

Mặt khác, phát triển phụ trợ là việc tạo ra các máy chủ web làm cho giao diện người dùng (UI) tương tác hơn. Điều này được thực hiện với các ngôn ngữ như PHP, Ruby, Python và JavaScript (thông qua Node JS).

Những người tham gia vào phát triển phụ trợ được gọi là nhà phát triển phụ trợ.
Rất nhiều người chuyên về phát triển phụ trợ hoặc giao diện người dùng, trong khi một số người khác thích phiêu lưu hơn, vì vậy họ làm cả hai và được gọi là nhà phát triển fullstack.

Phát triển điện thoại di động

Phát triển di động liên quan đến việc tạo ra các ứng dụng di động để người dùng có thể dễ dàng truy cập nội dung và dịch vụ trên điện thoại của họ. Các nhà phát triển tham gia vào phát triển thiết bị di động được gọi là nhà phát triển di động.

Trong nhiều trường hợp, phát triển trên thiết bị di động có nghĩa là lấy nội dung của một trang web và sau đó sửa đổi nó thành dạng ứng dụng dành cho thiết bị di động. Một ví dụ là ứng dụng di động freeCodeCamp mà bạn có thể truy cập các tài nguyên học tập freeCodeCamp và các bài báo viết hay trên điện thoại của mình.

Ví dụ về các ngôn ngữ lập trình bạn có thể sử dụng để tạo ứng dụng di động là Dart (với Flutter), Java, Swift và JavaScript (với React native).

Quản lý cơ sở dữ liệu

Quản trị cơ sở dữ liệu là việc tạo và quản lý cơ sở dữ liệu để lưu trữ lượng dữ liệu khổng lồ mà các công ty cần làm việc.

Ví dụ: ngân hàng, bệnh viện, trang web và công ty bảo hiểm cần theo dõi nhân viên và người dùng cũng như thông tin của họ, vì vậy cách tốt nhất họ có thể làm là tạo cơ sở dữ liệu cho những nhân viên và người dùng đó.

Một ví dụ về ngôn ngữ lập trình được sử dụng trong quản trị cơ sở dữ liệu là SQL (Ngôn ngữ truy vấn có cấu trúc).

Ngoài 3 cách sử dụng mã hóa mà chúng ta đã thảo luận ở đây, mã hóa còn được sử dụng trong nhiều lĩnh vực khác như Khoa học dữ liệu, Trí tuệ nhân tạo, mạng máy tính, lập trình TV thông minh và các máy móc tiên tiến khác, v.v. Bộ định tuyến bạn sử dụng để kết nối internet thậm chí còn có một số mã trong đó.

Làm thế nào bạn có thể học viết mã

Nếu bạn muốn học viết mã, điều đầu tiên bạn nên quyết định là bạn muốn làm gì với việc viết mã. Điều này là do mã hóa được sử dụng để làm rất nhiều thứ - như đã chỉ ra trong bài viết này. Bạn nên chuyên môn hóa thay vì cố gắng làm tất cả.

Khi bạn quyết định mình muốn làm gì với việc viết mã, thì đó là lúc bạn học cách viết mã bằng một ngôn ngữ cụ thể. Bạn sẽ học một số ngôn ngữ đánh dấu và lập trình phù hợp với con đường bạn đã chọn.

Ví dụ:

  • Nếu bạn quyết định trở thành một nhà phát triển giao diện người dùng, bạn sẽ cần học HTML, CSS, JavaScript và một khung công tác giao diện người dùng như React, Vue, Svelte, Angular.
  • Nếu nghề bạn chọn là phát triển phụ trợ, bạn có thể học một số HTML và sau đó là một ngôn ngữ lập trình như PHP, Golang, Ruby hoặc JavaScript (Node JS)
  • Nếu bạn muốn trở thành nhà khoa học dữ liệu hoặc bạn muốn học máy, thì Python sẽ trở thành một ngôn ngữ tuyệt vời để học, cùng với R khi bạn trở nên nâng cao hơn
  • Nếu bạn muốn trở thành một kỹ sư phần mềm dày dạn, bạn có thể học Python và JavaScript, nhưng tại một thời điểm, bạn cũng sẽ cần biết một số ngôn ngữ lập trình như C ++, Java và C #

Khi bạn đã nghĩ đến ngôn ngữ mình muốn học, bạn có thể quyết định đi học đại học, hoàn thành khóa đào tạo hoặc tự học viết mã bằng các tài nguyên trực tuyến miễn phí (hoặc trả phí) ..

Nhiều nhà phát triển thành công đã làm theo cách tự học và nó ngày càng trở thành một lựa chọn phổ biến hơn.

Nếu bạn quyết định đi theo con đường tự học, freeCodeCamp là một nền tảng tuyệt vời để học cách viết mã.

Chương trình học có nhiều chứng chỉ mà bạn có thể lựa chọn để bắt đầu hành trình viết mã của mình - về các chủ đề từ Phát triển web đến Máy tính khoa học với Python. Ngoài ra còn có một diễn đàn hữu ích , nơi bạn có thể đặt câu hỏi và giải quyết bất kỳ vấn đề nào bạn gặp phải với mã của mình.

Ấn phẩm của freeCodeCamp có rất nhiều hướng dẫn dựa trên văn bản bao gồm HTML, CSS, JavaScript, Python, Node JS và Express.
ss-1-1
ss-2-1

Ngoài ra, kênh YouTube freeCodeCamp có đủ các khóa học video miễn phí để giúp bạn trở thành một lập trình viên giỏi vì có hơn 1.200 khóa học ở đó.
fccyt

Lời kết

Trong bài viết này, chúng ta đã nói về mã hóa là gì, các ngôn ngữ liên quan đến mã hóa và cách học viết mã.

Một điều vẫn còn là một nguồn tranh luận là sự khác biệt giữa mã hóa và lập trình. Cả hai từ thường được sử dụng thay thế cho nhau, nhưng nhiều nhà phát triển sẽ cho rằng có sự khác biệt. Hãy xem lập trình như một bức tranh toàn cảnh hơn về mã hóa.

Các cơ hội việc làm trong lĩnh vực viết mã khiến nó trở thành một kỹ năng quý giá để học hỏi. Ngày nay, mọi người đang kiếm được lợi nhuận cao hàng năm bởi vì họ biết cách viết mã.

Vì mã hóa được sử dụng trong cuộc sống hàng ngày của con người, nên có rất nhiều tài nguyên trực tuyến để học nó.

Việc bạn có muốn thực hiện những hy sinh cần thiết để trở thành một lập trình viên được tuyển dụng hay không là tùy thuộc vào bạn - bởi vì viết mã có thể khó học và cần rất nhiều công sức để trở nên thực sự giỏi. Nhưng nó phụ thuộc vào tư duy của bạn.

Đừng quên xem các hướng dẫn, bài viết dựa trên văn bản miễn phí CodeCamp và kênh YouTube nếu bạn muốn học viết mã.

Cảm ơn bạn đã đọc.

Nguồn: https://www.freecodecamp.org/news/coding-meaning-what-does-coding-mean/

#coding 

Josefa  Corwin

Josefa Corwin

1659852060

A Template Language That Completely Separates Structure and Logic/Ruby

Curly

Curly is a template language that completely separates structure and logic. Instead of interspersing your HTML with snippets of Ruby, all logic is moved to a presenter class.

Installing

Installing Curly is as simple as running gem install curly-templates. If you're using Bundler to manage your dependencies, add this to your Gemfile

gem 'curly-templates'

Curly can also install an application layout file, replacing the .erb file commonly created by Rails. If you wish to use this, run the curly:install generator.

$ rails generate curly:install

How to use Curly

In order to use Curly for a view or partial, use the suffix .curly instead of .erb, e.g. app/views/posts/_comment.html.curly. Curly will look for a corresponding presenter class named Posts::CommentPresenter. By convention, these are placed in app/presenters/, so in this case the presenter would reside in app/presenters/posts/comment_presenter.rb. Note that presenters for partials are not prepended with an underscore.

Add some HTML to the partial template along with some Curly components:

<!-- app/views/posts/_comment.html.curly -->
<div class="comment">
  <p>
    {{author_link}} posted {{time_ago}} ago.
  </p>

  {{body}}

  {{#author?}}
    <p>{{deletion_link}}</p>
  {{/author?}}
</div>

The presenter will be responsible for providing the data for the components. Add the necessary Ruby code to the presenter:

# app/presenters/posts/comment_presenter.rb
class Posts::CommentPresenter < Curly::Presenter
  presents :comment

  def body
    SafeMarkdown.render(@comment.body)
  end

  def author_link
    link_to @comment.author.name, @comment.author, rel: "author"
  end

  def deletion_link
    link_to "Delete", @comment, method: :delete
  end

  def time_ago
    time_ago_in_words(@comment.created_at)
  end

  def author?
    @comment.author == current_user
  end
end

The partial can now be rendered like any other, e.g. by calling

render 'comment', comment: comment
render comment
render collection: post.comments

Curly components are surrounded by curly brackets, e.g. {{hello}}. They always map to a public method on the presenter class, in this case #hello. Methods ending in a question mark can be used for conditional blocks, e.g. {{#admin?}} ... {{/admin?}}.

Identifiers

Curly components can specify an identifier using the so-called dot notation: {{x.y.z}}. This can be very useful if the data you're accessing is hierarchical in nature. One common example is I18n:

<h1>{{i18n.homepage.header}}</h1>
# In the presenter, the identifier is passed as an argument to the method. The
# argument will always be a String.
def i18n(key)
  translate(key)
end

The identifier is separated from the component name with a dot. If the presenter method has a default value for the argument, the identifier is optional – otherwise it's mandatory.

Attributes

In addition to an identifier, Curly components can be annotated with attributes. These are key-value pairs that affect how a component is rendered.

The syntax is reminiscent of HTML:

<div>{{sidebar rows=3 width=200px title="I'm the sidebar!"}}</div>

The presenter method that implements the component must have a matching keyword argument:

def sidebar(rows: "1", width: "100px", title:); end

All argument values will be strings. A compilation error will be raised if

  • an attribute is used in a component without a matching keyword argument being present in the method definition; or
  • a required keyword argument in the method definition is not set as an attribute in the component.

You can define default values using Ruby's own syntax. Additionally, if the presenter method accepts arbitrary keyword arguments using the **doublesplat syntax then all attributes will be valid for the component, e.g.

def greetings(**names)
  names.map {|name, greeting| "#{name}: #{greeting}!" }.join("\n")
end
{{greetings alice=hello bob=hi}}
<!-- The above would be rendered as: -->
alice: hello!
bob: hi!

Note that since keyword arguments in Ruby are represented as Symbol objects, which are not garbage collected in Ruby versions less than 2.2, accepting arbitrary attributes represents a security vulnerability if your application allows untrusted Curly templates to be rendered. Only use this feature with trusted templates if you're not on Ruby 2.2 yet.

Conditional blocks

If there is some content you only want rendered under specific circumstances, you can use conditional blocks. The {{#admin?}}...{{/admin?}} syntax will only render the content of the block if the admin? method on the presenter returns true, while the {{^admin?}}...{{/admin?}} syntax will only render the content if it returns false.

Both forms can have an identifier: {{#locale.en?}}...{{/locale.en?}} will only render the block if the locale? method on the presenter returns true given the argument "en". Here's how to implement that method in the presenter:

class SomePresenter < Curly::Presenter
  # Allows rendering content only if the locale matches a specified identifier.
  def locale?(identifier)
    current_locale == identifier
  end
end

Furthermore, attributes can be set on the block. These only need to be specified when opening the block, not when closing it:

{{#square? width=3 height=3}}
  <p>It's square!</p>
{{/square?}}

Attributes work the same way as they do for normal components.

Collection blocks

Sometimes you want to render one or more items within the current template, and splitting out a separate template and rendering that in the presenter is too much overhead. You can instead define the template that should be used to render the items inline in the current template using the collection block syntax.

Collection blocks are opened using an asterisk:

{{*comments}}
  <li>{{body}} ({{author_name}})</li>
{{/comments}}

The presenter will need to expose the method #comments, which should return a collection of objects:

class Posts::ShowPresenter < Curly::Presenter
  presents :post

  def comments
    @post.comments
  end
end

The template within the collection block will be used to render each item, and it will be backed by a presenter named after the component – in this case, comments. The name will be singularized and Curly will try to find the presenter class in the following order:

  • Posts::ShowPresenter::CommentPresenter
  • Posts::CommentPresenter
  • CommentPresenter

This allows you some flexibility with regards to how you want to organize these nested templates and presenters.

Note that the nested template will only have access to the methods on the nested presenter, but all variables passed to the "parent" presenter will be forwarded to the nested presenter. In addition, the current item in the collection will be passed, as well as that item's index in the collection:

class Posts::CommentPresenter < Curly::Presenter
  presents :post, :comment, :comment_counter

  def number
    # `comment_counter` is automatically set to the item's index in the collection,
    # starting with 1.
    @comment_counter
  end

  def body
    @comment.body
  end

  def author_name
    @comment.author.name
  end
end

Collection blocks are an alternative to splitting out a separate template and rendering that from the presenter – which solution is best depends on your use case.

Context blocks

While collection blocks allow you to define the template that should be used to render items in a collection right within the parent template, context blocks allow you to define the template for an arbitrary context. This is very powerful, and can be used to define widget-style components and helpers, and provide an easy way to work with structured data. Let's say you have a comment form on your page, and you'd rather keep the template inline. A simple template could look like:

<!-- post.html.curly -->
<h1>{{title}}</h1>
{{body}}

{{@comment_form}}
  <b>Name: </b> {{name_field}}<br>
  <b>E-mail: </b> {{email_field}}<br>
  {{comment_field}}

  {{submit_button}}
{{/comment_form}}

Note that an @ character is used to denote a context block. Like with collection blocks, a separate presenter class is used within the block, and a simple convention is used to find it. The name of the context component (in this case, comment_form) will be camel cased, and the current presenter's namespace will be searched:

class PostPresenter < Curly::Presenter
  presents :post
  def title; @post.title; end
  def body; markdown(@post.body); end

  # A context block method *must* take a block argument. The return value
  # of the method will be used when rendering. Calling the block argument will
  # render the nested template. If you pass a value when calling the block
  # argument it will be passed to the presenter.
  def comment_form(&block)
    form_for(Comment.new, &block)
  end

  # The presenter name is automatically deduced.
  class CommentFormPresenter < Curly::Presenter
    # The value passed to the block argument will be passed in a parameter named
    # after the component.
    presents :comment_form

    # Any parameters passed to the parent presenter will be forwarded to this
    # presenter as well.
    presents :post

    def name_field
      @comment_form.text_field :name
    end

    # ...
  end
end

Context blocks were designed to work well with Rails' helper methods such as form_for and content_tag, but you can also work directly with the block. For instance, if you want to directly control the value that is passed to the nested presenter, you can call the call method on the block yourself:

def author(&block)
  content_tag :div, class: "author" do
    # The return value of `call` will be the result of rendering the nested template
    # with the argument. You can post-process the string if you want.
    block.call(@post.author)
  end
end

Context shorthand syntax

If you find yourself opening a context block just in order to use a single component, e.g. {{@author}}{{name}}{{/author}}, you can use the shorthand syntax instead: {{author:name}}. This works for all component types, e.g.

{{#author:admin?}}
  <p>The author is an admin!</p>
{{/author:admin?}}

The syntax works for nested contexts as well, e.g. {{comment:author:name}}. Any identifier and attributes are passed to the target component, which in this example would be {{name}}.

Setting up state

Although most code in Curly presenters should be free of side effects, sometimes side effects are required. One common example is defining content for a content_for block.

If a Curly presenter class defines a setup! method, it will be called before the view is rendered:

class PostPresenter < Curly::Presenter
  presents :post

  def setup!
    content_for :title, post.title

    content_for :sidebar do
      render 'post_sidebar', post: post
    end
  end
end

Escaping Curly syntax

In order to have {{ appear verbatim in the rendered HTML, use the triple Curly escape syntax:

This is {{{escaped}}.

You don't need to escape the closing }}.

Comments

If you want to add comments to your Curly templates that are not visible in the rendered HTML, use the following syntax:

{{! This is some interesting stuff }}

Presenters

Presenters are classes that inherit from Curly::Presenter – they're usually placed in app/presenters/, but you can put them anywhere you'd like. The name of the presenter classes match the virtual path of the view they're part of, so if your controller is rendering posts/show, the Posts::ShowPresenter class will be used. Note that Curly is only used to render a view if a template can be found – in this case, at app/views/posts/show.html.curly.

Presenters can declare a list of accepted variables using the presents method:

class Posts::ShowPresenter < Curly::Presenter
  presents :post
end

A variable can have a default value:

class Posts::ShowPresenter < Curly::Presenter
  presents :post
  presents :comment, default: nil
end

Any public method defined on the presenter is made available to the template as a component:

class Posts::ShowPresenter < Curly::Presenter
  presents :post

  def title
    @post.title
  end

  def author_link
    # You can call any Rails helper from within a presenter instance:
    link_to author.name, profile_path(author), rel: "author"
  end

  private

  # Private methods are not available to the template, so they're safe to
  # use.
  def author
    @post.author
  end
end

Presenter methods can even take an argument. Say your Curly template has the content {{t.welcome_message}}, where welcome_message is an I18n key. The following presenter method would make the lookup work:

def t(key)
  translate(key)
end

That way, simple ``functions'' can be added to the Curly language. Make sure these do not have any side effects, though, as an important part of Curly is the idempotence of the templates.

Layouts and content blocks

Both layouts and content blocks (see content_for) use yield to signal that content can be inserted. Curly works just like ERB, so calling yield with no arguments will make the view usable as a layout, while passing a Symbol will make it try to read a content block with the given name:

# Given you have the following Curly template in
# app/views/layouts/application.html.curly
#
#   <html>
#     <head>
#       <title>{{title}}</title>
#     </head>
#     <body>
#       <div id="sidebar">{{sidebar}}</div>
#       {{body}}
#     </body>
#   </html>
#
class ApplicationLayout < Curly::Presenter
  def title
    "You can use methods just like in any other presenter!"
  end

  def sidebar
    # A view can call `content_for(:sidebar) { "some HTML here" }`
    yield :sidebar
  end

  def body
    # The view will be rendered and inserted here:
    yield
  end
end

Rails helper methods

In order to make a Rails helper method available as a component in your template, use the exposes_helper method:

class Layouts::ApplicationPresenter < Curly::Presenter
  # The components {{sign_in_path}} and {{root_path}} are made available.
  exposes_helper :sign_in_path, :root_path
end

Testing

Presenters can be tested directly, but sometimes it makes sense to integrate with Rails on some levels. Currently, only RSpec is directly supported, but you can easily instantiate a presenter:

SomePresenter.new(context, assigns)

context is a view context, i.e. an object that responds to render, has all the helper methods you expect, etc. You can pass in a test double and see what you need to stub out. assigns is the hash containing the controller and local assigns. You need to pass in a key for each argument the presenter expects.

Testing with RSpec

In order to test presenters with RSpec, make sure you have rspec-rails in your Gemfile. Given the following presenter:

# app/presenters/posts/show_presenter.rb
class Posts::ShowPresenter < Curly::Presenter
  presents :post

  def body
    Markdown.render(@post.body)
  end
end

You can test the presenter methods like this:

# You can put this in your `spec_helper.rb`.
require 'curly/rspec'

# spec/presenters/posts/show_presenter_spec.rb
describe Posts::ShowPresenter, type: :presenter do
  describe "#body" do
    it "renders the post's body as Markdown" do
      assign(:post, double(:post, body: "**hello!**"))
      expect(presenter.body).to eq "<strong>hello!</strong>"
    end
  end
end

Note that your spec must be tagged with type: :presenter.

Examples

Here is a simple Curly template – it will be looked up by Rails automatically.

<!-- app/views/posts/show.html.curly -->
<h1>{{title}}<h1>
<p class="author">{{author}}</p>
<p>{{description}}</p>

{{comment_form}}

<div class="comments">
  {{comments}}
</div>

When rendering the template, a presenter is automatically instantiated with the variables assigned in the controller or the render call. The presenter declares the variables it expects with presents, which takes a list of variables names.

# app/presenters/posts/show_presenter.rb
class Posts::ShowPresenter < Curly::Presenter
  presents :post

  def title
    @post.title
  end

  def author
    link_to(@post.author.name, @post.author, rel: "author")
  end

  def description
    Markdown.new(@post.description).to_html.html_safe
  end

  def comments
    render 'comment', collection: @post.comments
  end

  def comment_form
    if @post.comments_allowed?
      render 'comment_form', post: @post
    else
      content_tag(:p, "Comments are disabled for this post")
    end
  end
end

Caching

Caching is handled at two levels in Curly – statically and dynamically. Static caching concerns changes to your code and templates introduced by deploys. If you do not wish to clear your entire cache every time you deploy, you need a way to indicate that some view, helper, or other piece of logic has changed.

Dynamic caching concerns changes that happen on the fly, usually made by your users in the running system. You wish to cache a view or a partial and have it expire whenever some data is updated – usually whenever a specific record is changed.

Dynamic Caching

Because of the way logic is contained in presenters, caching entire views or partials by the data they present becomes exceedingly straightforward. Simply define a #cache_key method that returns a non-nil object, and the return value will be used to cache the template.

Whereas in ERB you would include the cache call in the template itself:

<% cache([@post, signed_in?]) do %>
  ...
<% end %>

In Curly you would instead declare it in the presenter:

class Posts::ShowPresenter < Curly::Presenter
  presents :post

  def cache_key
    [@post, signed_in?]
  end
end

Likewise, you can add a #cache_duration method if you wish to automatically expire the fragment cache:

class Posts::ShowPresenter < Curly::Presenter
  ...

  def cache_duration
    30.minutes
  end
end

In order to set any cache option, define a #cache_options method that returns a Hash of options:

class Posts::ShowPresenter < Curly::Presenter
  ...

  def cache_options
    { compress: true, namespace: "my-app" }
  end
end

Static Caching

Static caching will only be enabled for presenters that define a non-nil #cache_key method (see Dynamic Caching.)

In order to make a deploy expire the cache for a specific view, set the version of the view to something new, usually by incrementing by one:

class Posts::ShowPresenter < Curly::Presenter
  version 3

  def cache_key
    # Some objects
  end
end

This will change the cache keys for all instances of that view, effectively expiring the old cache entries.

This works well for views, or for partials that are rendered in views that themselves are not cached. If the partial is nested within a view that is cached, however, the outer cache will not be expired. The solution is to register that the inner partial is a dependency of the outer one such that Curly can automatically deduce that the outer partial cache should be expired:

class Posts::ShowPresenter < Curly::Presenter
  version 3
  depends_on 'posts/comment'

  def cache_key
    # Some objects
  end
end

class Posts::CommentPresenter < Curly::Presenter
  version 4

  def cache_key
    # Some objects
  end
end

Now, if the version of Posts::CommentPresenter is bumped, the cache keys for both presenters would change. You can register any number of view paths with depends_on.

Curly integrates well with the caching mechanism in Rails 4 (or Cache Digests in Rails 3), so the dependencies defined with depends_on will be tracked by Rails. This will allow you to deploy changes to your templates and have the relevant caches automatically expire.

Thanks

Thanks to Zendesk for sponsoring the work on Curly.

Contributors

Build Status


Author: zendesk
Source code: https://github.com/zendesk/curly

#ruby   #ruby-on-rails 

Manh  Cuong

Manh Cuong

1648455180

Mã thông báo của nhà cung cấp thanh khoản (Mã thông báo LP) là gì?

 Trong bài đăng này, bạn sẽ tìm hiểu Mã thông báo của nhà cung cấp thanh khoản là gì và Mã thông báo của nhà cung cấp thanh khoản (Mã thông báo LP) hoạt động như thế nào?

Nhà cung cấp thanh khoản là gì?

Các nhà cung cấp thanh khoản là các nhà đầu tư đặt cược mã thông báo tiền điện tử của họ trên DEX để kiếm phí giao dịch, thường được gọi là khai thác thanh khoản hoặc tạo thị trường. Phí giao dịch này thường được tính theo lãi suất và lãi suất thay đổi dựa trên số lượng thanh khoản có sẵn và số lượng giao dịch trong nhóm thanh khoản. Mặc dù Uniswap không hiển thị lãi suất bạn sẽ kiếm được, nhưng bạn có thể ước tính lợi nhuận của mình dựa trên khối lượng giao dịch và số lượng thanh khoản được đặt trong nhóm.


Tại sao bạn cần thanh khoản?

Điều đầu tiên xuất hiện trong tâm trí khi nghĩ về cách hoạt động của mã thông báo LP sẽ là các yếu tố cụ thể chịu trách nhiệm thúc đẩy nhu cầu thanh khoản. DeFi đã tăng vọt về mức độ phổ biến và được chấp nhận trong thời gian COVID bị khóa vào năm 2020. Tính đến thời điểm hiện tại, tổng giá trị bị khóa trong các giao thức DeFi dễ dàng vượt quá 200 tỷ đô la với một biên lợi nhuận lành mạnh. Trong số nhiều giải pháp DeFi thành công, Uniswap, một sàn giao dịch tiền điện tử phi tập trung, đã cho thấy sự tăng trưởng đầy hứa hẹn với tài sản tiền điện tử trị giá hơn 9 tỷ đô la được khóa trong nền tảng. Phản ánh kỹ hơn về Uniswap sẽ cung cấp câu trả lời lý tưởng cho các câu hỏi về nhu cầu thanh khoản.

Uniswap đóng vai trò là nền tảng của chuỗi khối Ethereum và tận dụng các hợp đồng thông minh để nắm giữ tài sản tiền điện tử trong các nhóm thanh khoản. Các nhà đầu tư có thể giao dịch tiền điện tử trực tiếp từ các nhóm thanh khoản này. Bạn cũng nên lưu ý khả năng kiếm phí giao dịch bằng cách cung cấp thanh khoản cho các sàn giao dịch phi tập trung như Uniswap. Làm sao? Đây là nơi bạn phải tìm hiểu cách thức hoạt động của các mã thông báo của nhà cung cấp thanh khoản trong các nhóm thanh khoản của các sàn giao dịch phi tập trung. Nhóm thanh khoản ETH-USDC trên Uniswap có thể giúp các nhà đầu tư kiếm được phí giao dịch gần bằng 25% lãi suất hàng năm cho các khoản đầu tư của họ. 

Tìm hiểu về hồ thanh khoản và mã thông báo của nhà cung cấp thanh khoản

Nếu bạn đã theo dõi chặt chẽ hệ sinh thái DeFi, thì chắc hẳn bạn đã từng nghe về thuật ngữ Nhà tạo thị trường tự động hoặc AMM tại một thời điểm nào đó. Các nền tảng AMM như Uniswap, Balancer và Curve là những khía cạnh trọng tâm trong hệ sinh thái DeFi hoặc tài chính phi tập trung đang phát triển nhanh chóng. 

Quan trọng nhất, AMM đại diện cho một cách tiếp cận hoàn toàn mới và đã được chuyển đổi để giao dịch ở góc độ chung. AMM là gì? Các nhà tạo thị trường tự động tạo ra thị trường nơi người dùng không phải phụ thuộc vào các bên khác để thực hiện giao dịch. Ví dụ: nếu bạn muốn hoán đổi Bitcoin của mình lấy Ether trên hệ thống AMM, bạn không cần phải đợi chủ sở hữu Ether thực hiện giao dịch. 

Ngược lại, hệ thống AMM sử dụng một chức năng chính được gọi là mã thông báo Nhà cung cấp thanh khoản hoặc mã thông báo LP. Vậy, nhà cung cấp thanh khoản là gì? Các nhà cung cấp thanh khoản thực sự là những nhà đầu tư khóa tài sản tiền điện tử của họ trên các sàn giao dịch phi tập trung để kiếm phí giao dịch. Các mã thông báo LP là một khía cạnh quan trọng trong việc đảm bảo tính thanh khoản cho các sàn giao dịch phi tập trung. Quan trọng nhất, chúng đảm bảo rằng AMM không bị giám sát và không giữ các mã thông báo của bạn. Trên thực tế, bạn có thể thắc mắc về những câu hỏi như “các nhà cung cấp thanh khoản hoạt động như thế nào đối với tiền điện tử?” với AMM. 

Làm nông với Mã thông báo LP 

Mã thông báo của nhà cung cấp thanh khoản là bằng chứng rằng bạn sở hữu một phần của quỹ thanh khoản mà bạn đặt tài sản tiền điện tử của mình vào. Bạn cần những mã thông báo này để mua lại tài sản của mình khi bạn muốn bán mã thông báo của mình, nhưng cho đến thời điểm đó, bạn có thể sử dụng một số mã thông báo LP nhất định để thu lợi nhuận từ trang trại .

Nuôi lợi nhuận đề cập đến một chiến lược đầu tư trong đó các nhà đầu tư tiền điện tử chuyển đổi giữa các nhóm thanh khoản khác nhau để kiếm được mức lãi suất cao nhất có thể. Họ thường làm điều này bằng cách tận dụng các vị thế của mình bằng cách cho vay trên các nền tảng DeFi như Compound hoặc MakerDao.

Một số nền tảng nhất định cho phép bạn đặt cược mã thông báo LP của mình để kiếm thêm phần thưởng trong các nhóm thanh khoản riêng biệt. Hầu hết các nền tảng này đều nhỏ và bạn có nguy cơ mất tài sản của mình do thất bại hợp đồng thông minh. Tùy thuộc vào khả năng chấp nhận rủi ro của bạn, có thể tốt hơn là chỉ cần đặt cược tài sản tiền điện tử của bạn vào 1 nhóm thanh khoản.

Pool thanh khoản là gì?

Các nhóm thanh khoản sử dụng các hợp đồng thông minh trên blockchain của Ethereum để cung cấp tính thanh khoản cho các sàn giao dịch phi tập trung. Các nhà cung cấp thanh khoản có thể sử dụng ví Ethereum của họ để gửi mã thông báo đến một nhóm thanh khoản, nơi các khoản tiền của nhà đầu tư được tổng hợp để thanh khoản trên DEX. 

Uniswap tính phí giao dịch cố định 0,3% cho mỗi lần hoán đổi và phí này được phân bổ theo tỷ lệ cho mỗi nhà đầu tư trong nhóm thanh khoản. Tùy thuộc vào số tiền bạn đầu tư và số lượng giao dịch trên Uniswap, bạn có thể kiếm được bất kỳ khoản tiền lãi hàng năm từ 2% đến 50% từ phí nhà cung cấp thanh khoản.

Hoạt động của các mã thông báo của nhà cung cấp thanh khoản

Mã thông báo của nhà cung cấp thanh khoản hoặc mã thông báo LP là điểm nhấn bắt buộc của các DEX mới dựa trên Hệ thống tạo thị trường tự động. Họ đảm bảo rằng AMM không bị giam giữ. Vì vậy, bạn có thể nhận thấy rằng mã thông báo LP hoạt động mà không cần phân bổ quyền kiểm soát tài sản tiền điện tử của bạn cho DEX. Ngược lại, mã thông báo LP hoạt động thông qua các chức năng tự động, có thể thúc đẩy sự công bằng và phân quyền. Sau đó, mã thông báo của nhà cung cấp thanh khoản cũng có thể mở ra những con đường mới để giao dịch và truy cập mã thông báo trong toàn bộ hệ sinh thái DeFi. Đặc điểm không giám sát trong các nền tảng AMM là một trong những điểm nổi bật nhất mà chúng có trong hệ sinh thái DeFi. 

Bạn có thể hiểu cách hoạt động của các mã thông báo của nhà cung cấp thanh khoản bằng cách ghi lại thực tế rằng bạn đang nắm quyền kiểm soát. Các nhà cung cấp thanh khoản nhận được các mã thông báo LP để đổi lại việc cung cấp tài sản trong các nhóm thanh khoản và giữ quyền kiểm soát các mã thông báo của họ. Điều quan trọng cần lưu ý là mã tự quản hỗ trợ việc quản lý nhóm thanh khoản. Không có bất kỳ sự can thiệp thủ công nào, các nhóm thanh khoản cung cấp sự đảm bảo về tính công bằng. Ngoài ra, mã thông báo LP cũng đại diện cho phần của nhà cung cấp thanh khoản trong một nhóm cụ thể. Đồng thời, bạn cũng cần lưu ý rằng các nhà cung cấp thanh khoản hoàn toàn kiểm soát các mã thông báo LP của họ. 

Việc phân phối đồng đều các mã thông báo LP theo sự đóng góp của các nhà cung cấp thanh khoản là một điểm nhấn độc đáo trong cách mã thông báo LP hoạt động. Nếu bạn đang đóng góp tài sản trị giá $ 100 USD trong một nhóm Uniswap có tổng giá trị là $ 1000, thì bạn sẽ nhận được 10% số token LP cho nhóm đó. Mã thông báo của nhà cung cấp thanh khoản đại diện cho phần của bạn trong tài sản trong nhóm thanh khoản. Các mã thông báo LP cho phép bạn kiểm soát hoàn toàn tài sản của mình và tự do rút chúng theo sở thích của bạn. 

Các ứng dụng của Token Nhà cung cấp Thanh khoản (LP) 

Nếu bạn muốn tìm câu trả lời cho “các nhà cung cấp thanh khoản hoạt động như thế nào đối với tiền điện tử?” bạn cũng nên hiểu các ứng dụng của mã thông báo LP. Là một nhà cung cấp thanh khoản, bạn có thể tận dụng mã thông báo LP của mình cho các trường hợp sử dụng riêng biệt. Một trong những đề xuất giá trị quan trọng nhất được liên kết với mã thông báo LP đề cập đến những cải thiện về tính thanh khoản. Cách tiếp cận hữu ích khác để tận dụng mã thông báo LP là canh tác năng suất. Hãy để chúng tôi xem mã thông báo LP hoạt động như thế nào để cải thiện tính thanh khoản trong DeFi và tạo điều kiện cho việc tăng năng suất.

Mã thông báo của nhà cung cấp thanh khoản và tính thanh khoản

Tính thanh khoản là một yêu cầu tất yếu trong không gian DeFi, có thể hỗ trợ việc chuyển đổi tài sản này sang tài sản khác mà không có bất kỳ biến động mạnh nào về giá của tài sản đó. Trong trường hợp tài chính truyền thống, bạn có thể thấy rằng tiền mặt là tài sản nổi bật nhất với tính thanh khoản cao. Mặt khác, bạn không thể tìm thấy những cách dễ dàng để chuyển đổi tiền mặt thành tiền điện tử. 

Trước khi xuất hiện các mã thông báo của nhà cung cấp thanh khoản, thực tế là không thể truy cập các mã thông báo dựa trên Ethereum. Nói chung, người dùng phải khóa tài sản của họ trong hệ sinh thái Ethereum trong suốt thời gian sử dụng. Trên thực tế, chủ sở hữu mã thông báo không thể truy cập mã thông báo của họ khi chúng đang được sử dụng. 

Trước khi bạn hiểu cách hoạt động của mã thông báo nhà cung cấp thanh khoản, bạn nên xác định cách mã thông báo bị khóa khi đặt cược, nói chung là một phần của cơ chế quản trị. Cơ chế Proof-of-Stake hoặc PoS của Ethereum 2.0 yêu cầu chủ sở hữu mã thông báo đặt cược tài sản của họ vào nền tảng. 

Chủ sở hữu ETH phải khóa tài sản của họ trong nền tảng để xác thực và thêm các khối mới để kiếm phần thưởng. Trong những trường hợp như vậy, bạn có thể tìm thấy sự khác biệt rõ rệt về cách hoạt động của mã thông báo LP. Đặt một mã thông báo trong Ethereum về cơ bản có nghĩa là bạn không thể sử dụng nó cho các mục đích khác. Kết quả là thanh khoản của hệ thống giảm xuống triệt để. 

Tuy nhiên, việc xem xét kỹ hơn cách các mã thông báo của nhà cung cấp thanh khoản hoạt động trong các hệ thống dựa trên AMM có thể giúp bạn tìm cách họ giải quyết các vấn đề về thanh khoản trong DeFi. Sự thật thú vị về mã thông báo LP là bạn có thể sử dụng cùng một mã thông báo nhiều lần. Không quan trọng là bạn có khóa mã thông báo của mình trong cơ chế quản trị nền tảng hay giải pháp DeFi hay không. Token LP hoạt động bằng cách mở ra các con đường cho việc đặt cược gián tiếp, có thể giải quyết các vấn đề về tính thanh khoản tiền điện tử hạn chế. Làm sao? Mã thông báo LP cho phép bạn chứng minh quyền sở hữu của mình đối với mã thông báo, do đó mở rộng triển vọng sử dụng mã thông báo của bạn thay vì đặt cược.

Triển vọng canh tác năng suất

Các nhà cung cấp thanh khoản cũng là công cụ hữu ích để kích hoạt khả năng canh tác năng suất trong các giải pháp DeFi. Tài chính phi tập trung hay DeFi là một không gian phát triển nhanh chóng và sự hiểu biết chi tiết về câu trả lời cho “cách các nhà cung cấp thanh khoản hoạt động tiền điện tử?” có thể mở thêm chi tiết về mã thông báo LP. Không phân biệt tên của chúng trên các nền tảng khác nhau, mã thông báo LP đóng vai trò là bằng chứng toán học về những đóng góp của bạn cho nhóm thanh khoản. Bây giờ, bạn cũng nên lưu ý đến một thuật ngữ thú vị khác trong không gian DeFi, tức là canh tác năng suất. 

Nuôi trồng lợi nhuận và mã thông báo LP có liên quan chặt chẽ với nhau nếu bạn cố gắng điều tra sâu cách hoạt động của mã thông báo LP. Nuôi trồng lợi nhuận về cơ bản liên quan đến việc gửi mã thông báo vào các giải pháp DeFi khác nhau để cải thiện thu nhập từ cổ phần. Bạn có thể di chuyển mã thông báo giữa các giao thức khác nhau để tối đa hóa lợi nhuận. Tuy nhiên, việc sử dụng mã thông báo LP và canh tác năng suất cùng nhau đã dần dần bắt đầu được chú ý. Ví dụ: bạn có thể tìm kiếm mã thông báo CRV trên giao thức Curve bằng cách sử dụng mã thông báo DAI. Các mã thông báo LP có thể cho phép tính thanh khoản của bạn hoạt động cho bạn bằng cách kiếm phí giao dịch cũng như lợi tức canh tác cho bạn.

Tổng quan rõ ràng về cách hoạt động của mã thông báo nhà cung cấp thanh khoản trình bày tổng quan toàn diện về tiềm năng của DeFi. Các nhà cung cấp thanh khoản là một khía cạnh không thể tách rời của bối cảnh DeFi mới nổi, chủ yếu dựa vào các sàn giao dịch phi tập trung như Uniswap và Balancer. Các nhà cung cấp thanh khoản đặt tài sản của họ vào các nhóm thanh khoản trên các sàn giao dịch này hoặc các giải pháp DeFi khác. Các nhóm thanh khoản cung cấp các tài nguyên cần thiết cho các nhà giao dịch và người dùng khác trên nền tảng để thực hiện các giao dịch. 

Cảm ơn bạn đã đọc!

davis mike

1626331037

Caching In WordPress: What You Need to Learn?

WordPress caching has nothing new to showcase in this context. WordPress websites also run on a specific server system and you have to make sure these servers work well for user engagement. So caching can help your website server work effectively to serve too many visitors collectively. The commonly requested items can be converted into varied copies that the website server doesn’t want to showcase every time to every website visitor. Classification of Caching is usually divided into two kinds. The Client-Side Caching & the Server Side Caching. Where client-side caching has nothing to do with your website, Server Side Caching is usually its opposite. Read more on https://bit.ly/3rbqvVh

#caching plugins #server side caching #client side caching #wordpress websites #wordpress caching