Dodaj dodatkowe nagłówki żądań HTTP

Pavol Drotar
Pavol Drotar

Żądania HTTP zawierają nagłówki takie jak User-Agent lub Content-Type. Oprócz nagłówków dołączonych przez przeglądarek, aplikacje na Androida mogą dodawać dodatkowe nagłówki, np. Cookie czy Referrer, EXTRA_HEADERS Zamiar dodatkowe. Ze względów bezpieczeństwa Chrome filtruje niektóre dodatkowe nagłówki w zależności od sposobu i miejsca uruchomienia intencji.

Żądania między domenami wymagają dodatkowej warstwy zabezpieczeń, ponieważ klient i serwer nie należą do tej samej strony. W tym przewodniku omawiamy uruchamianie takich próśb w Chrome niestandardowe karty, czyli intencje uruchamiane z poziomu aplikacji, które otwierają adres URL na karcie przeglądarki. Do Chrome 83 programiści mogli dodawać dowolne nagłówki przy uruchamianiu karty niestandardowej. Chrome (od wersji 83) zaczęto filtrować wszystkie nagłówki z innych domen z wyjątkiem ApprovalList, ponieważ nagłówki, które nie zostały zatwierdzone, stwarza zagrożenie dla bezpieczeństwa. Od Chrome 86 można dołączać nagłówki spoza listy zatwierdzonych do żądań z innych domen, jeśli serwer i klient są powiązane za pomocą linku do zasobu cyfrowego. Podsumowanie tego zachowania znajdziesz w tej tabeli:

Wersja Chrome Nagłówki CORS są dozwolone
przed Chrome 83 lista zatwierdzonych, niezatwierdzona
Od Chrome 83 do Chrome 85 lista zatwierdzonych
od Chrome 86 znajduje się na liście zatwierdzonych i niezaakceptowanych, gdy skonfigurowano połączenie z zasobami cyfrowymi

Tabela 1. Filtrowanie nagłówków CORS, które nie zostały zatwierdzone.

Z tego artykułu dowiesz się, jak skonfigurować zweryfikowane połączenie między serwerem a klientem i użyć tego wysyłanie nagłówków HTTP z listy zatwierdzonych oraz tych, które nie zostały zatwierdzone. Możesz przejść do Dodawanie dodatkowych nagłówków do intencji związanych z kartami niestandardowymi w kodzie.

Tło

zatwierdzone i niezatwierdzone nagłówki żądań CORS

Udostępnianie zasobów między pochodzeniem (CORS) umożliwia aplikacji internetowej z jednego źródła żądania w zasobach różnego pochodzenia. Lista nagłówków CORS-AcceptedList jest przechowywana w: Standardowy HTML. Przykładowe zatwierdzone nagłówki znajdziesz w następnej tabeli:

Header Opis
accept-language Reklamuje język naturalny, którym klient rozumie
język treści opisuje język przeznaczony dla obecnych odbiorców.
content-type, wskazuje typ mediów zasobu

Tabela 2. Przykładowe zatwierdzone nagłówki CORS.

Nagłówki zatwierdzone na liście są uznawane za bezpieczne, ponieważ nie zawierają poufnych informacji informacje o użytkownikach, przez co jest mało prawdopodobne, aby powodowały one wykonywanie przez serwer potencjalnie szkodliwych operacji.

Przykłady nagłówków, które nie zostały zatwierdzone, znajdziesz w tej tabeli:

Header Opis
bearer-token uwierzytelnia klienta na serwerze
pochodzenie wskazuje źródło żądania
ciastko zawiera pliki cookie ustawione przez serwer

Tabela 3. Przykładowe, niezatwierdzone nagłówki CORS.

Standard HTML i serwery odradzają dołączanie do żądań CORS nagłówków niezatwierdzonych przez zatwierdzenie zakłada, że żądania z innych domen zawierają tylko nagłówki z listy zatwierdzonych. Wysyłam nagłówki, które nie znajdują się na liście zatwierdzonych z domen z innych domen pozwalałoby złośliwym aplikacjom innych firm tworzyć nagłówki, które niewłaściwie wykorzystują pliki cookie, które Chrome (lub inna przeglądarka) zapisuje i dołącza do żądań. Pliki cookie mogą do uwierzytelniania złośliwych transakcji z serwerem, które w innym przypadku nie byłyby możliwe.

Dołączanie zatwierdzonych nagłówków CORS do żądań kart niestandardowych

Karty niestandardowe to specjalny sposób uruchamiania stron internetowych w spersonalizowanej karcie przeglądarki. Karta niestandardowa intencje można tworzyć za pomocą funkcji CustomTabsIntent.Builder(). Do tych plików możesz też dołączyć nagłówki, za pomocą intencji Bundle z flagą 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"));

Zawsze możemy dołączać zatwierdzone nagłówki do żądań CORS kart niestandardowych. Filtry Chrome domyślne nagłówki, które nie zostały zatwierdzone. Chociaż inne przeglądarki mogą działać inaczej, deweloperzy powinni się spodziewać, że nagłówki, które nie zostały zatwierdzone, będą ogólnie blokowane.

Obsługiwanym sposobem umieszczania nagłówków, które nie znajdują się na liście zatwierdzonych, na kartach niestandardowych jest sprawdzenie między domenami za pomocą cyfrowego linku dostępu. W następnej sekcji dowiesz się, jak i uruchom intencję Tabele niestandardowe z wymaganymi nagłówkami.

Dodawanie dodatkowych nagłówków do intencji związanych z kartami niestandardowymi

Aby zezwolić na przekazywanie przez intencje karty niestandardowej nagłówków, które nie zostały zatwierdzone, musisz ustawić link do zasobu cyfrowego między Androidem a aplikacją internetową w celu potwierdzenia, że autor jest właścicielem obu aplikacji.

Aby skonfigurować link do zasobu cyfrowego, postępuj zgodnie z oficjalnym przewodnikiem. Dla relacji link użyj „delegate_permission/common.use_as_origin”, który wskazuje, że obie aplikacje należą do tej samej domeny .

Utwórz intencję niestandardową z dodatkowymi nagłówkami

Istnieje wiele sposobów tworzenia intencji dotyczących kart niestandardowych. Możesz użyć kreatora w AndroidX przez dodanie biblioteki do zależności kompilacji:

MULTI_LINE_CODE_PLACEHOLDER_1

Utwórz intencję i dodaj dodatkowe nagłówki:

MULTI_LINE_CODE_PLACEHOLDER_2

Połączenie z kartami niestandardowymi jest używane do konfigurowania CustomTabsSession między aplikacją a kartami Chrome. Potrzebujemy sesji, aby sprawdzić, czy aplikacja i aplikacja internetowa należą do tego samego źródła. Weryfikacja zakończy się prawidłowo tylko wtedy, gdy linki do zasobów cyfrowych zostały prawidłowo skonfigurowane.

Warto zadzwonić pod numer CustomTabsClient.warmup(). Pozwala aplikacji przeglądarki można wstępnie zainicjować w tle i przyspieszyć proces otwierania adresu URL.

MULTI_LINE_CODE_PLACEHOLDER_3

Skonfiguruj wywołanie zwrotne, które po weryfikacji uruchamia intencję

Element CustomTabsCallback został przekazany do sesji. Skonfigurujemy onRelationshipValidationResult(), aby uruchomić wcześniej utworzony CustomTabsIntent po pomyślnej weryfikacji punktu początkowego.

MULTI_LINE_CODE_PLACEHOLDER_4

Powiąż połączenie z usługą kart niestandardowych

Powiązanie usługi uruchamia usługę i onCustomTabsServiceConnected() połączenia który zostanie ostatecznie wywołany. Nie zapomnij prawidłowo usunąć powiązania usługi. Powiązanie i usunięcie powiązania jest zwykle wykonywana w metodach cyklu życia aktywności onStart() i 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);

Kod aplikacji w wersji demonstracyjnej

Więcej informacji o usłudze kart niestandardowych znajdziesz tutaj. Zobacz android-browser-helper repozytorium GitHub na działającą przykładową aplikację.

Podsumowanie

W tym przewodniku pokazujemy, jak dodawać dowolne nagłówki do żądań CORS kart niestandardowych. nagłówki z listy zatwierdzonych można dołączać do każdego żądania CORS kart niestandardowych. Nagłówki, które nie zostały zatwierdzone: są ogólnie uznawane za niebezpieczne w żądaniach CORS, a Chrome domyślnie je odfiltrowuje. Załączam je dozwolone tylko w przypadku klientów i serwerów tego samego pochodzenia, zweryfikowanych za pomocą linku do zasobu cyfrowego.