Offline token với Keycloak

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Offline access là một tính năng của OpenID Connect được định nghĩa tại https://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess. Nó giúp cho application với offline token (một loại của refresh token) có thể lấy access token và sử dụng resource mà không cần user phải đăng nhập trong thời gian dài hoặc mãi mãi. Keycloak hỗ trợ chúng ta làm việc với offline access bằng cách sử dụng offline token. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!

  Authorization Code grant type với Proof Key for Code Exchange (PKCE) trong OAuth 2.1
  C Token là gì? Cú pháp trong lập trình C/C++

Xem thêm nhiều việc làm NextJS lương cao trên TopDev

Để làm ví dụ, mình sẽ tạo mới một client với grant type Authorization Code trong Keycloak như sau:

 

Điều đầu tiên các bạn cần phải biết là làm thế nào chúng ta lấy được offline token.

Rất đơn giản, trong request lấy authorization code cho client, chúng ta cần truyền thêm scope là offline_access là được:

 

Keycloak sẽ hỏi chúng ta có cho phép Client Application Offline Access hay không?

Nếu các bạn đồng ý thì sau khi có authorization code, request lấy access token cho client này:

 

parse nội dung của refresh token, các bạn sẽ thấy nội dung payload như sau:

Type của token này là Offline thay vì Refresh và các bạn có thể thấy, không có claim “exp” với expiration time như khi chúng ta parse access token:

 

Chúng ta có thể sử dụng offline token này để lấy access token mới tương tự như refresh token.

Ví dụ như sau:

Điểm khác biệt giữa offline token và refresh token là không có expiration time cho offline token.

 

Mặc định thì offline token là nó sẽ luôn valid dù user không đăng nhập hoặc server bị restart, chỉ trừ khi nó bị revoke. Tuy nhiên, các bạn cần sử dụng offline token này ít nhất là một lần trong khoảng thời gian mặc định là 30 ngày, kể từ lần sử dụng gần nhất. Đó là bởi vì, một offline token sẽ associate với một offline session. Và offline session này chỉ có thời gian chờ (idle time) mặc định là 30 ngày như mình nói ở trên. Ở Realm level thì giá trị 30 ngày này được cấu hình trong tab Tokens của Realm Settings, field Offline Session Idle:

Ở tab Tokens này, như các bạn thấy, chúng ta còn có 1 field khác liên quan đến offline session nữa, tên là Offline Session Max Limited. Ý nghĩa của field này là nếu các bạn enable, offline token sẽ bị expired trong thời gian mặc định là 60 ngày, dù chúng ta có sử dụng offline token này bao nhiêu lần đi chẳng nữa:

Các bạn có thể thay đổi các cấu hình liên quan đến offline session ở Realm level nếu muốn, các client sẽ kế thừa cấu hình này. Còn nếu muốn cấu hình cụ thể cho một client nào đó thì hãy expand phần Advance Settings trong mỗi client:

chúng ta có thể thay đổi cấu hình của Client Offline Session Idle và Client Offline Session Max ở đây.

Các bạn có thể xem tất cả các offline token của một client bằng cách vào tab Offline Access của client đó