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

Các yêu cầu HTTP chứa tiêu đề như User-Agent hoặc Content-Type. Ngoài tiêu đề được đính kèm bởi trình duyệt, ứng dụng Android có thể thêm tiêu đề bổ sung, như Cookie hoặc Referrer thông qua thẻ EXTRA_HEADERS Ý định bổ sung. 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 từ nhiều nguồn yêu cầu thêm một lớp bảo mật vì máy khách 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 đưa ra những yêu cầu như vậy thông qua Chrome thẻ tuỳ chỉnh, tức là các ý định được khởi chạy từ những ứng dụng mở 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 Tab tuỳ chỉnh. Từ phiên bản 83 trở đi, Chrome đã bắt đầu lọc tất cả, ngoại trừ tiêu đề trên nhiều nguồn gốc được liệt kê trong danh sách phê duyệt, vì các tiêu đề chưa được phê duyệt trong danh sách phê duyệt dẫn đến rủi ro bảo mật. Kể từ Chrome 86, bạn có thể đính kèm tiêu đề chưa được phê duyệt cho các yêu cầu trên nhiều nguồn gốc, khi máy chủ và máy khách có liên quan với nhau bằng một đườ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 Cho phép tiêu đề CORS (Chia sẻ tài nguyên giữa nhiều nguồn gốc)
trước Chrome 83 đã đưa vào danh sách phê duyệt, chưa được phê duyệt
Chrome 83 đến Chrome 85 đã đưa vào danh sách phê duyệt
từ Chrome 86 trở lên đã đưa vào danh sách phê duyệt, không được đưa vào danh sách phê duyệt khi 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 phê duyệt 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 trong danh sách phê duyệt cũng như không được phê duyệt. Bạn có thể chuyển tới Thêm các tiêu đề bổ sung vào ý định của thẻ tuỳ chỉnh cho mã.

Thông tin khái quát

Tiêu đề của yêu cầu CORS có trong danh sách phê duyệt so với tiêu đề không đượ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 có nguồn gốc khác. Danh sách các tiêu đề được phê duyệt trong danh sách cho phép của CORS được duy trì trong Chuẩn HTML. Ví dụ về tiêu đề trong danh sách phê duyệt sẽ xuất hiện trong bảng tiếp theo:

Tiêu đề Nội dung mô tả
accept-language quảng cáo các ngôn ngữ tự nhiên mà khách hàng hiểu được
ngôn ngữ-nội-dung mô tả ngôn ngữ dành cho độc giả hiện tại
loại nội dung cho biết loại đ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 thông tin người dùng và ít có khả năng làm cho máy chủ thực hiện các hoạt động có thể gây tổn hại.

Ví dụ về tiêu đề không được phê duyệt trong bảng sau:

Tiêu đề Nội dung mô tả
bearer-token xác thực ứng dụng khách 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 trong danh sách phê duyệt.

Tiêu đề HTML và máy chủ không khuyến khích đính kèm các tiêu đề không được phê duyệt vào yêu cầu CORS giả định rằng các yêu cầu từ nhiều nguồn chỉ chứa tiêu đề trong danh sách phê duyệt. Gửi tiêu đề không có trong danh sách phê duyệt từ các miền có 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 đề sai mục đích của người dùng cookie 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à lẽ ra không thể thực hiện được.

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

Thẻ tuỳ chỉnh là một cách đặc biệt để khởi chạy trang web trong một thẻ trình duyệt tuỳ chỉnh. Thẻ tùy chỉnh bạn có thể tạo ý định bằng CustomTabsIntent.Builder(). Bạn cũng có thể đính kèm tiêu đề cho ý định sử dụng Bundle có 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 đề trong danh sách phê duyệt vào yêu cầu CORS của thẻ tuỳ chỉnh. Tuy nhiên, bộ lọc của Chrome tiêu đề không được phê duyệt theo mặc định. Mặc dù các trình duyệt khác có thể có hành vi khác, nhà phát triển thường sẽ bị chặn các tiêu đề không có trong danh sách phê duyệt.

Cách được hỗ trợ để đưa 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 đặt những tham số này và khởi chạy ý định Thẻ tuỳ chỉnh với 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 tiêu đề không có trong danh sách phê duyệt thông qua ý định Thẻ tuỳ chỉnh, bạn cần phải đặt thiết lập đường liên kết 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.

Hãy 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 "Dispatcher_permission/common.use_as_origin"` cho biết cả hai ứng dụng thuộc cùng một ứng dụng sau khi liên kết được xác minh.

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

Có nhiều cách để tạo một Ý định Thẻ tuỳ chỉnh. Bạn có thể 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

Xây dựng ý định và thêm 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 có cùng nguồn gốc. Quy trình xác minh chỉ thành công 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(). Cách này cho phép ứng dụng trình duyệt khởi chạy trước trong nền và tăng tốc quá trình mở URL.

MULTI_LINE_CODE_PLACEHOLDER_3

Thiết lập một 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 tôi thiết lập onRelationshipValidationResult() để chạy CustomTabsIntent được tạo trước đó sau khi xác minh xong nguồn gốc.

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 phù hợp. 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. Xem android-browser-helper kho lưu trữ GitHub cho một ứng dụng mẫu đang hoạt động.

Tóm tắt

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