Żądania HTTP zawierają nagłówki takie jak User-Agent czy Content-Type. Oprócz nagłówków dołączonych przez przeglądarki aplikacje na Androida mogą dodawać dodatkowe nagłówki, takie jak Cookie lub Odsyłacz, za pomocą dodatku do instrukcji EXTRA_HEADERS
. Ze względów bezpieczeństwa Chrome filtruje niektóre dodatkowe nagłówki w zależności od tego, jak i gdzie uruchamiana jest intencja.
Żądania między domenami wymagają dodatkowego poziomu zabezpieczeń, ponieważ klient i serwer nie należą do tej samej strony. W tym przewodniku omówiono uruchamianie takich żądań na kartach niestandardowych w Chrome, czyli intencje uruchamiane z aplikacji, które otwierają adres URL na karcie przeglądarki. Do wersji Chrome 83 deweloperzy mogli dodawać dowolne nagłówki podczas uruchamiania niestandardowej karty. Od wersji 83 Chrome zaczęło filtrować wszystkie nagłówki między domenami z wyjątkiem zatwierdzonych, ponieważ nagłówki, które nie zostały zatwierdzone, stanowiły zagrożenie dla bezpieczeństwa. Począwszy od wersji 86 przeglądarki Chrome można dołączać nagłówki niewymagające zatwierdzenia do żądań między domenami, gdy serwer i klient są powiązane za pomocą linku do zasobu cyfrowego. Zachowanie to zostało opisane w tabeli poniżej:
Wersja Chrome | Dozwolone nagłówki CORS |
---|---|
przed wersją Chrome 83. | zatwierdzona, niezatwierdzona |
Od Chrome 83 do Chrome 85 | approvelisted |
od wersji Chrome 86, | zatwierdzona, niezatwierdzona, gdy skonfigurowano link do zasobu cyfrowego |
Tabela 1. Filtrowanie nagłówków CORS, które nie są na liście zatwierdzonych.
Z tego artykułu dowiesz się, jak skonfigurować uwierzytelnione połączenie między serwerem a klientem i wykorzystywać je do wysyłania nagłówków HTTP z listy zatwierdzonych i niezatwierdzonych. Aby dowiedzieć się, jak wygląda kod, przejdź do sekcji Dodawanie dodatkowych nagłówków do intencji na karcie niestandardowej.
Tło
Nagłówki żądań CORS z listy zatwierdzonych i niezatwierdzonych
Cross-Origin Resource Sharing (CORS) umożliwia aplikacji internetowej z jednego źródła wysyłanie żądań do zasobów z innego źródła. Lista zatwierdzonych nagłówków CORS jest dostępna w standardzie HTML. Przykłady nagłówków z listy zatwierdzonych:
Header | Opis |
---|---|
accept-language | reklamuje języki naturalne zrozumiałe dla klienta; |
content-language | opisuje język przeznaczony dla obecnych odbiorców. |
content-type | wskazuje typ nośnika zasobu, |
Tabela 2. Przykład nagłówków CORS na liście zatwierdzonych
Nagłówki z listy zatwierdzonych są uznawane za bezpieczne, ponieważ nie zawierają poufnych informacji o użytkownikach i nie mogą spowodować, że serwer wykona potencjalnie szkodliwe operacje.
Przykłady nagłówków, które nie są na liście zatwierdzonych, znajdziesz w tabeli poniżej:
Header | Opis |
---|---|
bearer-token | uwierzytelnia klienta na serwerze, |
pochodzenie | wskazuje źródło żądania |
ciastko | zawiera pliki cookie ustawione przez serwer; |
Tabela 3. Przykład nagłówków CORS, które nie są na liście zatwierdzonych.
Standard HTML zaleca, aby nie dołączać do żądań CORS nagłówków, które nie są wymienione na liście zatwierdzonych, a serwery zakładają, że żądania między domenami zawierają tylko nagłówki z listy zatwierdzonych. Wysyłanie nagłówków, które nie są na liście zatwierdzonych, z domen w różnych domenach, pozwoliłoby złośliwym aplikacjom innych firm na tworzenie nagłówków, które nadużywają plików cookie użytkownika przechowywanych i dołączanych do żądań przez Chrome (lub inną przeglądarkę). Pliki cookie mogły uwierzytelniać złośliwe transakcje serwera, co w innym przypadku nie byłoby możliwe.
Dołączanie nagłówków z listy zatwierdzonych nagłówków CORS do żądań w ramach kart niestandardowych
Karty niestandardowe to specjalny sposób uruchamiania stron internetowych na niestandardowej karcie przeglądarki. Intencje karty niestandardowej można tworzyć za pomocą CustomTabsIntent.Builder()
. Możesz też dołączyć nagłówki do tych intencji, używając Bundle
z oznaczeniem 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łączyć zatwierdzone nagłówki do żądań CORS w kartach niestandardowych. Jednak domyślnie Chrome odfiltrowuje nagłówki, które nie są na liście zatwierdzonych. Chociaż inne przeglądarki mogą działać inaczej, deweloperzy powinni się spodziewać, że nagłówki, które nie są na liście zatwierdzonych, są ogólnie blokowane.
Obsługiwany sposób uwzględniania nagłówków nieobjętych listą zatwierdzonych w kartach niestandardowych polega na wcześniejszym zweryfikowaniu połączenia między domenami za pomocą linku dostępu cyfrowego. W następnej sekcji opisujemy, jak je skonfigurować i uruchomić intent Custom Tabs z wymaganymi nagłówkami.
Dodawanie dodatkowych nagłówków do niestandardowych intencji na karcie
Konfigurowanie linków do zasobów cyfrowych
Aby umożliwić przekazywanie nagłówków, które nie są na liście zatwierdzonych, przez intencje karty niestandardowej, konieczne jest skonfigurowanie połączenia zasobów cyfrowych między aplikacją na Androida a aplikacją internetową, które potwierdzi, że autor jest właścicielem obu aplikacji.
Aby skonfigurować link do zasobu cyfrowego, postępuj zgodnie z oficjalnym przewodnikiem. W przypadku relacji linku użyj wartości „delegate_permission/common.use_as_origin”, która wskazuje, że po zweryfikowaniu linku obie aplikacje należą do tego samego źródła.
Tworzenie niestandardowej karty intencji z dodatkowymi nagłówkami
Intencje kart niestandardowych można tworzyć na kilka sposobów. Możesz użyć kreatora dostępnego w androidX, dodając bibliotekę do zależności kompilacji:
implementation 'androidx.browser:browser:1.2.0'
Określ intencję i dodaj dodatkowe nagłówki:
CustomTabsIntent constructExtraHeadersIntent(CustomTabsSession session) {
CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();
// Example non-cors-approvelisted headers.
Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);
return intent;
}
Konfigurowanie połączenia z kartami niestandardowymi w celu sprawdzenia linku do zasobu
Połączenie z kartami niestandardowymi służy do konfigurowania CustomTabsSession
między aplikacją a kartą Chrome. Potrzebujemy tej sesji, aby sprawdzić, czy aplikacja i aplikacja internetowa należą do tej samej witryny.
Weryfikacja powiedzie się tylko wtedy, gdy linki do zasobów cyfrowych zostały prawidłowo skonfigurowane.
Zachęcamy do zadzwonienia pod numer CustomTabsClient.warmup()
. Umożliwia to aplikacji przeglądarki wstępną inicjalizację w tle i przyspieszenie procesu otwierania adresu URL.
// Set up a connection that warms up and validates a session.
CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(@NonNull ComponentName name,
@NonNull CustomTabsClient client) {
// Create session after service connected.
mSession = client.newSession(callback);
client.warmup(0);
// Validate the session as the same origin to allow cross origin headers.
mSession.validateRelationship(CustomTabsService.RELATION_USE_AS_ORIGIN,
Uri.parse(url), null);
}
@Override
public void onServiceDisconnected(ComponentName componentName) { }
};
Konfigurowanie wywołania zwrotnego, które uruchamia intent po weryfikacji
Wartość CustomTabsCallback
została przekazana do sesji. Po pomyślnej weryfikacji pochodzenia skonfigurujemy onRelationshipValidationResult()
tak, aby uruchamiał wcześniej utworzony CustomTabsIntent
.
// Set up a callback that launches the intent after session validated.
CustomTabsCallback callback = new CustomTabsCallback() {
@Override
public void onRelationshipValidationResult(int relation, @NonNull Uri requestedOrigin,
boolean result, @Nullable Bundle extras) {
// Launch custom tabs intent after session was validated as the same origin.
CustomTabsIntent intent = constructExtraHeadersIntent(mSession);
intent.launchUrl(MainActivity.this, Uri.parse(url));
}
};
Połącz połączenie z usługą kart niestandardowych
Powiązanie usługi powoduje jej uruchomienie, a w efekcie połączenia onCustomTabsServiceConnected()
zostanie wywołane. Pamiętaj, aby odpowiednio odłączyć usługę. Wiązanie i rozwiązywanie są zwykle wykonywane 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 demonstracyjnej
Więcej informacji o usłudze kart niestandardowych znajdziesz tutaj. Przykład działającej aplikacji znajdziesz w repozytorium GitHub android-browser-helper.
Podsumowanie
W tym przewodniku pokazano, jak dodawać dowolne nagłówki do żądań CORS w kartach niestandardowych. Zatwierdzone nagłówki mogą być dołączane do każdego żądania CORS w kartach niestandardowych. Nagłówki, które nie są na liście zatwierdzonych, są zazwyczaj uznawane za niebezpieczne w żądaniach CORS i domyślnie są odfiltrowywane przez Chrome. Ich dołączanie jest dozwolone tylko w przypadku klientów i serwerów z tego samego źródła, które zostały zweryfikowane za pomocą linku do zasobu cyfrowego.