Thêm tiêu đề bổ sung của yêu cầu HTTP

Tiếng Pavol Drotar
Pavol Drotar

Các yêu cầu HTTP chứa các tiêu đề như User-Agent hoặc Content-Type. Ngoài các tiêu đề do trình duyệt đính kèm, các ứng dụng Android có thể thêm tiêu đề bổ sung, chẳng hạn như Cookie hoặc Đường liên kết giới thiệu thông qua Ý định bổ sung EXTRA_HEADERS. Vì lý do bảo mật, Chrome sẽ lọc một số tiêu đề bổ sung, tuỳ thuộc vào cách thức và vị trí khởi chạy một ý định.

Các yêu cầu nhiều nguồn gốc yêu cầu thêm một lớp bảo mật vì ứng dụng và máy chủ không thuộc sở hữu của cùng một bên. Hướng dẫn này thảo luận về việc khởi chạy các yêu cầu như vậy thông qua thẻ tuỳ chỉnh của Chrome, tức là ý định được khởi chạy từ các ứng dụng mở ra một URL trong thẻ trình duyệt. Cho đến Chrome 83, nhà phát triển có thể thêm bất kỳ tiêu đề nào khi khởi chạy Thẻ tuỳ chỉnh. Từ phiên bản 83 trở đi, Chrome bắt đầu lọc tất cả, ngoại trừ các tiêu đề nhiều nguồn gốc được liệt kê, vì các tiêu đề không được phê duyệt sẽ gây ra rủi ro bảo mật. Kể từ Chrome 86, bạn có thể đính kèm tiêu đề không được liệt kê vào các yêu cầu nhiều nguồn gốc khi máy chủ và ứng dụng có liên quan với nhau bằng đường liên kết đến tài sản kỹ thuật số. Hành vi này được tóm tắt trong bảng sau:

Phiên bản Chrome Được phép sử dụng tiêu đề CORS
trước Chrome 83 được thêm vào danh sách phê duyệt, không được liệt kê trong danh sách phê duyệt
Chrome 83 đến Chrome 85 đã đưa vào danh sách phê duyệt
từ Chrome 86 trở đi được thêm vào danh sách phê duyệt, không được phê duyệt khi đường liên kết đến tài sản kỹ thuật số được thiết lập

Bảng 1.: Lọc các tiêu đề CORS không được phê duyệt.

Bài viết này cho biết cách thiết lập kết nối đã xác minh giữa máy chủ và ứng dụng, đồng thời sử dụng kết nối đó để gửi các tiêu đề http đã được phê duyệt cũng như không được liệt kê. Bạn có thể chuyển đến phần Thêm tiêu đề bổ sung vào ý định thẻ tuỳ chỉnh cho mã.

Thông tin khái quát

Tiêu đề của yêu cầu CORS được liệt kê so với danh sách phê duyệt chưa được phê duyệt

Tính năng Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS) cho phép một ứng dụng web từ một nguồn gốc yêu cầu tài nguyên ở một nguồn gốc khác. Danh sách tiêu đề được liệt kê trong danh sách phê duyệt của CORS được duy trì trong Tiêu chuẩn HTML. Ví dụ về tiêu đề có trong danh sách được phê duyệt xuất hiện trong bảng tiếp theo:

Tiêu đề Mô tả
chấp nhận ngôn ngữ quảng cáo ngôn ngữ tự nhiên mà khách hàng hiểu
ngôn ngữ nội dung mô tả ngôn ngữ dành cho đối tượng hiện tại
loại nội dung cho biết loại nội dung đa phương tiện của tài nguyên

Bảng 2.: Ví dụ về các tiêu đề CORS đã được phê duyệt.

Các tiêu đề trong danh sách phê duyệt được coi là an toàn vì không chứa thông tin nhạy cảm của người dùng và không có khả năng khiến máy chủ thực hiện các hoạt động có thể gây hại.

Ví dụ về tiêu đề không được liệt kê trong danh sách phê duyệt được hiển thị trong bảng sau:

Tiêu đề Mô tả
mã thông báo truy cập xác thực ứng dụng tại một máy chủ
nguồn gốc cho biết nguồn gốc của yêu cầu
bánh quy chứa cookie do máy chủ đặt

Bảng 3.: Ví dụ về các tiêu đề CORS không được phê duyệt.

Tiêu chuẩn HTML không khuyến khích đính kèm các tiêu đề không có trong danh sách phê duyệt vào yêu cầu CORS, đồng thời các máy chủ cho rằng các yêu cầu nhiều nguồn gốc chỉ chứa các tiêu đề có trong danh sách phê duyệt. Việc gửi tiêu đề không có trong danh sách phê duyệt từ các miền nhiều nguồn gốc sẽ cho phép các ứng dụng độc hại bên thứ ba tạo tiêu đề sử dụng sai cookie của người dùng mà Chrome (hoặc một trình duyệt khác) lưu trữ và đính kèm vào yêu cầu. Cookie có thể xác thực các giao dịch máy chủ độc hại mà thường không thể thực hiện được.

Đính kèm các tiêu đề có trong danh sách đã phê duyệt của CORS vào các yêu cầu Thẻ tuỳ chỉnh

Thẻ tuỳ chỉnh là một cách đặc biệt để mở các trang web trong thẻ trình duyệt tuỳ chỉnh. Bạn có thể tạo ý định trong Thẻ tuỳ chỉnh bằng cách sử dụng CustomTabsIntent.Builder(). Bạn cũng có thể đính kèm tiêu đề vào các ý định này bằng cách sử dụng Bundle với cờ Browser.EXTRA_HEADERS:

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

Chúng tôi luôn có thể đính kèm tiêu đề có trong danh sách được phê duyệt vào yêu cầu CORS của thẻ tuỳ chỉnh. Tuy nhiên, theo mặc định, Chrome sẽ lọc các tiêu đề không có trong danh sách phê duyệt. Mặc dù các trình duyệt khác có thể có hành vi khác, nhưng nhà phát triển thường sẽ bị chặn các tiêu đề không được phê duyệt.

Cách hỗ trợ để đưa các tiêu đề không được liệt kê vào thẻ tuỳ chỉnh là xác minh kết nối nhiều nguồn gốc bằng đường liên kết truy cập kỹ thuật số. Phần tiếp theo cho biết cách thiết lập và chạy một ý định Thẻ tuỳ chỉnh với các tiêu đề bắt buộc.

Thêm tiêu đề bổ sung vào ý định của thẻ tuỳ chỉnh

Để cho phép truyền các tiêu đề không có trong danh sách phê duyệt thông qua ý định của Thẻ tuỳ chỉnh, bạn cần thiết lập đường liên kết đến tài sản kỹ thuật số giữa ứng dụng Android và ứng dụng web để xác minh rằng tác giả sở hữu cả hai ứng dụng.

Làm theo hướng dẫn chính thức để thiết lập đường liên kết đến tài sản kỹ thuật số. Đối với mối quan hệ liên kết, hãy sử dụng "delegate_permission/common.use_as_origin"". API này cho biết cả hai ứng dụng đều có cùng một nguồn gốc sau khi đường liên kết được xác minh.

Tạo ý định thẻ tuỳ chỉnh bằng tiêu đề bổ sung

Có nhiều cách để tạo Ý định trên Thẻ tuỳ chỉnh. Bạn có thể sử dụng trình tạo có sẵn trong androidX bằng cách thêm thư viện vào phần phụ thuộc của bản dựng:

MULTI_LINE_CODE_PLACEHOLDER_1

Tạo ý định và thêm tiêu đề bổ sung:

MULTI_LINE_CODE_PLACEHOLDER_2

Kết nối Tab tuỳ chỉnh dùng để thiết lập CustomTabsSession giữa ứng dụng và thẻ Chrome. Chúng ta cần phiên này để xác minh rằng ứng dụng và ứng dụng web thuộc cùng một nguồn gốc. Quy trình xác minh chỉ đạt nếu các đường liên kết đến tài sản kỹ thuật số được thiết lập đúng cách.

Bạn nên gọi CustomTabsClient.warmup(). API này cho phép ứng dụng trình duyệt khởi động trước ở chế độ nền và tăng tốc quá trình mở URL.

MULTI_LINE_CODE_PLACEHOLDER_3

Thiết lập lệnh gọi lại khởi chạy ý định sau khi xác thực

CustomTabsCallback đã được chuyển vào phiên. Chúng tôi thiết lập onRelationshipValidationResult() để chạy CustomTabsIntent đã tạo trước đó sau khi quá trình xác minh nguồn gốc thành công.

MULTI_LINE_CODE_PLACEHOLDER_4

Liên kết kết nối dịch vụ thẻ tuỳ chỉnh

Việc liên kết dịch vụ sẽ khởi chạy dịch vụ và onCustomTabsServiceConnected() của kết nối cuối cùng sẽ được gọi. Đừng quên huỷ liên kết dịch vụ một cách thích hợp. Việc liên kết và huỷ liên kết thường được thực hiện trong các phương thức vòng đời hoạt động onStart()onStop().

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

Mã xử lý ứng dụng minh hoạ

Bạn có thể tìm thêm thông tin chi tiết về Dịch vụ thẻ tuỳ chỉnh tại đây. Hãy xem kho lưu trữ android-browser-helper trên GitHub để xem một ứng dụng mẫu đang hoạt động.

Tóm tắt

Hướng dẫn này đã minh hoạ cách thêm tiêu đề tuỳ ý vào yêu cầu CORS của thẻ tuỳ chỉnh. Bạn có thể đính kèm các tiêu đề có trong danh sách phê duyệt vào mọi yêu cầu CORS của thẻ tuỳ chỉnh. Các tiêu đề không có trong danh sách phê duyệt thường bị coi là không an toàn trong các yêu cầu CORS và Chrome sẽ lọc các tiêu đề này theo mặc định. Chỉ các ứng dụng và máy chủ có cùng nguồn gốc mới được phép đính kèm các tệp này, được xác minh bằng đường liên kết đến tài sản kỹ thuật số.