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

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, ứng dụng Android có thể thêm các tiêu đề bổ sung, chẳng hạn như Cookie hoặc Referrer 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 ý định.

Các yêu cầu trên 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 quyền 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 đó thông qua thẻ tuỳ chỉnh của Chrome, tức là các ý định được khởi chạy từ các ứng dụng mở URL trong thẻ trình duyệt. Cho đến Chrome phiên bản 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. Kể từ phiên bản 83 trở đi, Chrome bắt đầu lọc tất cả các tiêu đề ngoại trừ tiêu đề có trong danh sách phê duyệt trên nhiều nguồn gốc, vì các tiêu đề không có trong danh sách phê duyệt gây ra rủi ro bảo mật. Kể từ Chrome 86, bạn có thể đính kèm các tiêu đề không có trong danh sách phê duyệt vào các yêu cầu trên nhiều nguồn gốc, khi máy chủ và ứng dụng liên quan với nhau bằng đường liên kết 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 Cho phép tiêu đề CORS
trước Chrome 83 được phê duyệt, không được phê duyệt
Chrome 83 đến Chrome 85 có trong danh sách cho phép
từ Chrome 86 trở lên có trong danh sách phê duyệt, không có trong danh sách phê duyệt khi bạn thiết lập đường liên kết đến tài sản kỹ thuật số

Bảng 1.: Lọc các tiêu đề CORS không có trong danh sách phê duyệt.

Bài viết này hướng dẫn 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 tiêu đề http được phê duyệt cũng như không được phê duyệt. Bạn có thể chuyển đến phần Thêm tiêu đề bổ sung vào ý định thẻ tuỳ chỉnh để xem mã.

Thông tin khái quát

Tiêu đề yêu cầu CORS có trong danh sách phê duyệt so với không có trong danh sách phê duyệt

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 của một nguồn gốc khác. Danh sách các tiêu đề được CORS phê duyệt được duy trì trong Tiêu chuẩn HTML. Ví dụ về tiêu đề trong danh sách phê duyệt được thể hiện trong bảng sau:

Tiêu đề Nội dung mô tả
accept-language quảng cáo các ngôn ngữ tự nhiên mà ứng dụng khách hiểu được
content-language mô tả ngôn ngữ dành cho đối tượng hiện tại
content-type cho biết loại nội dung nghe nhìn của tài nguyên

Bảng 2.: Ví dụ về tiêu đề CORS trong danh sách 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 thao tác có thể gây hại.

Ví dụ về các tiêu đề không có trong danh sách phê duyệt được trình bày trong bảng sau:

Tiêu đề Nội dung mô tả
mã thông báo truy cập xác thực ứng dụng khách tại 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ó trong danh sách phê duyệt.

Tiêu chuẩn HTML không khuyến khích việc đính kèm các tiêu đề không có trong danh sách phê duyệt vào các yêu cầu CORS và các máy chủ giả định rằng các yêu cầu trên 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 của bên thứ ba tạo tiêu đề sử dụng sai cookie của người dùng mà Chrome (hoặc trình duyệt khác) lưu trữ và đính kèm vào các yêu cầu. Cookie có thể xác thực các giao dịch máy chủ độc hại mà nếu không thì không thể thực hiện được.

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

Thẻ tuỳ chỉnh là một cách đặc biệt để khởi chạy trang web trong thẻ trình duyệt tuỳ chỉnh. Bạn có thể tạo ý định Thẻ tuỳ chỉnh bằ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 các tiêu đề trong danh sách phê duyệt vào các 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 nói chung, nhà phát triển nên dự kiến rằng các tiêu đề không có trong danh sách phê duyệt sẽ bị chặn.

Cách được hỗ trợ để đưa các tiêu đề không có trong danh sách phê duyệt vào thẻ tuỳ chỉnh là trước tiên, hãy 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 các thẻ này và chạy ý định Thẻ tuỳ chỉnh bằng các tiêu đề bắt buộc.

Thêm tiêu đề bổ sung vào ý định 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 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 mối 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" để cho biết rằng cả hai ứng dụng đều thuộc cùng một nguồn gốc sau khi xác minh mối liên kết.

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

Có nhiều cách để tạo ý định về 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 bản dựng:

MULTI_LINE_CODE_PLACEHOLDER_1

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

MULTI_LINE_CODE_PLACEHOLDER_2

Kết nối Thẻ tuỳ chỉnh được 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ỉ thành công nếu bạn thiết lập đúng đường liên kết đến tài sản kỹ thuật số.

Bạn nên gọi CustomTabsClient.warmup(). Tính năng này cho phép ứng dụng trình duyệt khởi chạy 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 để chạy Ý định sau khi xác thực

CustomTabsCallback đã được truyền vào phiên. Chúng ta thiết lập onRelationshipValidationResult() để chạy CustomTabsIntent đã tạo trước đó sau khi 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 sẽ được gọi sau cùng. Đừ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ã ứng dụng minh hoạ

Bạn có thể xem 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ữ GitHub android-browser-helper để biế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 các yêu cầu CORS của thẻ tuỳ chỉnh. Bạn có thể đính kèm các tiêu đề 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 được coi là không an toàn trong các yêu cầu CORS và Chrome sẽ lọc các tiêu đề đó theo mặc định. Chỉ những ứ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ố.