Antipattern: Đặt thời gian hết hạn cho mã thông báo OAuth

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về Apigee X.
thông tin

Apigee Edge cung cấp khung OAuth 2.0 cho các API bảo mật. OAuth2 là một trong những lược đồ xác thực và uỷ quyền dựa trên mã thông báo theo tiêu chuẩn mở phổ biến nhất. Thư viện này cho phép các ứng dụng khách thay mặt người dùng truy cập vào API mà không yêu cầu người dùng tiết lộ tên người dùng và mật khẩu của họ.

Apigee cho phép các nhà phát triển tạo quyền truy cập và/hoặc làm mới mã thông báo bằng cách triển khai một trong 4 loại cấp quyền OAuth2 – thông tin xác thực ứng dụng, mật khẩu, mã uỷ quyền ngầm ẩnmã uỷ quyền – thông qua chính sách OAuthv2. Ứng dụng khách dùng mã truy cập để sử dụng các API an toàn. Mỗi mã truy cập có thời gian hết hạn riêng. Bạn có thể đặt thời gian này trong chính sách OAuthv2.

Nếu muốn, bạn có thể cấp mã làm mới cùng với mã truy cập cùng với một số loại quyền. Mã làm mới được dùng để lấy mã truy cập mới, hợp lệ sau khi mã truy cập ban đầu hết hạn hoặc bị thu hồi. Bạn cũng có thể đặt thời gian hết hạn cho mã làm mới trong chính sách OAuthv2.

Phản mẫu này liên quan đến phản mẫu của việc đặt thời gian hết hạn dài cho mã thông báo OAuth.

Phản mẫu

Việc không đặt thời gian hết hạn cho mã thông báo làm mới trong chính sách OAuthv2 sẽ dẫn đến tình trạng tích luỹ mã thông báo OAuth và tăng mức sử dụng dung lượng ổ đĩa trên các nút Cassandra.

Ví dụ sau đây về chính sách OAuthV2 cho thấy một cấu hình bị thiếu của <RefreshTokenExpiresIn>:

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <!--<RefreshTokenExpiresIn> is missing -->
    <SupportedGrantTypes>
      <GrantType>password</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

Trong ví dụ trên:

  • Mã truy cập được đặt với thời gian hết hạn hợp lý là 30 phút.
  • Chưa đặt thời gian hết hạn của mã làm mới.
  • Mã thông báo làm mới vẫn tồn tại vĩnh viễn trong kho dữ liệu (Cassandra), gây ra hiện tượng tích luỹ dữ liệu.
  • Bạn có thể sử dụng mã làm mới được tạo mà không có thời hạn vô thời hạn để tạo mã truy cập.
  • Nếu lưu lượng truy cập đến API này là 10 yêu cầu mỗi giây, thì API này có thể tạo ra tối đa 864.000 mã thông báo trong một ngày.

Mức độ tác động

  • Nếu mã làm mới được tạo mà không có thời hạn, thì có hai hậu quả chính:
    • Bạn có thể dùng mã làm mới bất cứ lúc nào trong tương lai (có thể là trong nhiều năm) để lấy mã truy cập. Điều này có thể gây ra những vấn đề về bảo mật.
    • Hàng trong Cassandra chứa mã làm mới sẽ không bao giờ bị xoá. Điều này sẽ khiến dữ liệu được tích luỹ trong Cassandra.
  • Nếu bạn không dùng mã làm mới để lấy mã truy cập mới, mà thay vào đó, hãy tạo một mã làm mới và mã truy cập mới, thì mã làm mới cũ hơn sẽ vẫn nằm trong Cassandra. Kết quả là, các mã làm mới sẽ tiếp tục tích luỹ trong Cassandra, làm tăng dung lượng ổ đĩa, tăng mức sử dụng ổ đĩa và tình trạng nén nặng hơn và cuối cùng sẽ gây ra độ trễ đọc/ghi trong Cassandra.

Phương pháp hay nhất

Sử dụng thời gian hết hạn thấp sao cho phù hợp cho cả mã làm mới và mã truy cập. Xem phương pháp hay nhất để đặt thời gian hết hạn của mã làm mới và mã truy cập. Hãy nhớ chỉ định cấu hình thời hạn cho cả mã truy cập và mã làm mới trong chính sách. Hãy tham khảo tài liệu về chính sách OauthV2 để biết thêm thông tin chi tiết về cách định cấu hình chính sách.

Các phương pháp hay nhất dành riêng cho Edge cho khách hàng dùng nền tảng đám mây riêng tư

Phần này mô tả các phương pháp hay nhất dành riêng cho khách hàng Edge dành cho khách hàng dùng nền tảng đám mây riêng tư.

Chỉ định thời hạn của mã làm mới mặc định

Theo mặc định, nếu thời hạn của mã làm mới không được chỉ định trong cấu hình chính sách, Edge sẽ tạo một mã làm mới mà không có thời hạn. Bạn có thể ghi đè hành vi này theo quy trình sau:

  1. Trên nút trình xử lý thông báo, hãy chỉnh sửa hoặc tạo tệp ghi đè cấu hình $APIGEE_ROOT/customer/application/message-processor.properties. Hãy đảm bảo người dùng apigee có thể đọc được tệp này.
  2. Thêm dòng sau vào tệp:
    conf_keymanagement_oauth_refresh_token_expiry_time_in_millis=3600000
    Thao tác này sẽ đặt thời hạn của mã thông báo làm mới mặc định (nếu không có chỉ định nào trong chính sách) là 1 giờ. Bạn có thể thay đổi giá trị mặc định này dựa trên nhu cầu kinh doanh của mình.
  3. Khởi động lại dịch vụ Trình xử lý tin nhắn:
    apigee-service edge-message-processor restart
  4. Lặp lại các bước trên trong tất cả các nút trình xử lý thông báo lần lượt.

Các phương pháp hay nhất ở Cassandra

Hãy thử nâng cấp lên phiên bản Apigee mới nhất được cung cấp công khai. Apigee tiếp tục phát hành các bản sửa lỗi và tính năng nâng cao để tiếp tục cải thiện và tối ưu hoá việc quản lý mã thông báo trong Apigee. Trong Apigee, mã truy cập và làm mới được lưu trữ trong Cassandra trong không gian khoá "K". Bạn phải đảm bảo rằng chiến lược nén của không gian khoá này được đặt thành LeveledCompactionStrategy. Bạn nên kiểm tra để đảm bảo rằng các chỉ mục sau không xuất hiện:
  • kms.OAuth_20_access_tokens.OAuth_20_access_tokens_organization_name_idx#f0f0f0 và
  • kms.oauth_20_access_tokens.oauth_20_access_tokens_status_idx

Bạn cũng có thể giảm gc_grace_seconds trong bảng kms.oauth_20_access_tokens từ 10 ngày mặc định xuống giá trị thấp hơn (chẳng hạn như 3 ngày) để đảm bảo tombstone được tạo do mã thông báo bị xoá sẽ được xoá khỏi kho dữ liệu nhanh hơn.

Tài liệu đọc thêm