HTTP-verzoeken bevatten headers zoals User-Agent of Content-Type. Naast headers die door browsers worden toegevoegd, kunnen Android-apps extra headers toevoegen, zoals Cookie of Referrer, via de Intent-extra EXTRA_HEADERS . Om veiligheidsredenen filtert Chrome sommige van deze extra headers, afhankelijk van hoe en waar een intent wordt gestart.
Cross-origin -verzoeken vereisen een extra beveiligingslaag, omdat de client en server niet van dezelfde partij zijn. Deze handleiding beschrijft het uitvoeren van dergelijke verzoeken via aangepaste tabbladen in Chrome, oftewel intents die worden gestart vanuit apps die een URL openen in het browsertabblad. Tot Chrome 83 konden ontwikkelaars alle headers toevoegen bij het openen van een aangepast tabblad. Vanaf versie 83 begon Chrome alle cross-origin-headers te filteren, behalve de goedgekeurde headers, omdat niet-goedgekeurde headers een beveiligingsrisico vormden. Vanaf Chrome 86 is het mogelijk om niet-goedgekeurde headers toe te voegen aan cross-origin-verzoeken, wanneer de server en client met elkaar verbonden zijn via een digitale asset-link . Dit gedrag wordt samengevat in de volgende tabel:
| Chrome-versie | CORS-headers toegestaan |
|---|---|
| vóór Chrome 83 | goedgekeurd, niet goedgekeurd |
| Chrome 83 naar Chrome 85 | goedgekeurde lijst |
| vanaf Chrome 86 | goedgekeurd, niet goedgekeurd wanneer een link naar een digitaal activum is ingesteld |
Tabel 1: Filteren van niet-goedgekeurde CORS-headers.
Dit artikel laat zien hoe je een geverifieerde verbinding tussen de server en de client opzet en hoe je die gebruikt om zowel goedgekeurde als niet-goedgekeurde HTTP-headers te verzenden. Je kunt direct doorgaan naar ' Extra headers toevoegen aan aangepaste tab-intents' voor de code.
Achtergrond
Goedgekeurde versus niet-goedgekeurde CORS-verzoekheaders
Cross-Origin Resource Sharing (CORS) stelt een webapplicatie van de ene oorsprong in staat om resources van een andere oorsprong op te vragen. De lijst met CORS-goedgekeurde headers wordt bijgehouden in de HTML-standaard . Voorbeelden van goedgekeurde headers worden weergegeven in de volgende tabel:
| Koptekst | Beschrijving |
|---|---|
| accept-taal | Adverteert in natuurlijke taal die de klant begrijpt. |
| inhouds-taal | beschrijft taalgebruik dat bedoeld is voor het huidige publiek. |
| inhoudstype | geeft het mediatype van de bron aan |
Tabel 2: Voorbeelden van goedgekeurde CORS-headers.
De goedgekeurde headers worden als veilig beschouwd omdat ze geen gevoelige gebruikersinformatie bevatten en het onwaarschijnlijk is dat ze de server ertoe aanzetten potentieel schadelijke handelingen uit te voeren.
Voorbeelden van niet-goedgekeurde kopteksten worden in de volgende tabel weergegeven:
| Koptekst | Beschrijving |
|---|---|
| token aan token | authenticeert de client bij een server |
| oorsprong | geeft de herkomst van het verzoek aan |
| koekje | Bevat cookies die door de server zijn ingesteld. |
Tabel 3: Voorbeelden van niet-goedgekeurde CORS-headers.
Het toevoegen van niet-goedgekeurde headers aan CORS-verzoeken wordt afgeraden door de HTML-standaard en servers gaan ervan uit dat cross-origin-verzoeken alleen goedgekeurde headers bevatten. Het verzenden van niet-goedgekeurde headers vanuit cross-origin-domeinen zou kwaadwillende apps van derden in staat stellen headers te creëren die misbruik maken van gebruikerscookies die Chrome (of een andere browser) opslaat en aan verzoeken toevoegt. Deze cookies zouden kwaadwillende servertransacties kunnen authenticeren die anders niet mogelijk zouden zijn.
CORS-goedgekeurde headers toevoegen aan verzoeken voor aangepaste tabbladen
Aangepaste tabbladen zijn een speciale manier om webpagina's te openen in een aangepast browsertabblad. Intents voor aangepaste tabbladen kunnen worden gemaakt met behulp van CustomTabsIntent.Builder() . Je kunt ook headers aan deze intents toevoegen met behulp van een Bundle met de Browser.EXTRA_HEADERS -vlag .
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"));
We kunnen altijd goedgekeurde headers toevoegen aan CORS-verzoeken voor aangepaste tabbladen. Chrome filtert echter standaard niet-goedgekeurde headers. Hoewel andere browsers zich mogelijk anders gedragen, moeten ontwikkelaars er rekening mee houden dat niet-goedgekeurde headers over het algemeen worden geblokkeerd.
De ondersteunde manier om niet-goedgekeurde headers in aangepaste tabbladen op te nemen, is door eerst de cross-origin-verbinding te verifiëren met behulp van een digitale toegangslink. In het volgende gedeelte wordt uitgelegd hoe u deze instelt en een intent voor aangepaste tabbladen start met de vereiste headers.
Extra kopteksten toevoegen aan aangepaste tab-intents
Stel links naar digitale activa in.
Om headers die niet op de lijst met goedgekeurde headers staan door te geven via Custom Tab-intents, is het nodig om een digitale asset-link tussen de Android- en webapplicatie in te stellen die verifieert dat de auteur eigenaar is van beide applicaties.
Volg de officiële handleiding om een digitale asset-link in te stellen. Gebruik voor de linkrelatie `delegate_permission/common.use_as_origin`, wat aangeeft dat beide apps tot dezelfde oorsprong behoren zodra de link is geverifieerd.
Maak een aangepaste tab-intentie met extra kopteksten.
Er zijn meerdere manieren om een Custom Tabs-intent te maken. Je kunt de builder gebruiken die beschikbaar is in androidX door de bibliotheek toe te voegen aan de build-afhankelijkheden:
implementation 'androidx.browser:browser:1.2.0'
Stel de intent samen en voeg extra headers toe:
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;
}
Stel een aangepaste tabbladverbinding in om de assetlink te valideren.
Een Custom Tabs-verbinding wordt gebruikt om een CustomTabsSession tot stand te brengen tussen de app en het Chrome-tabblad. We hebben de sessie nodig om te controleren of de app en de webapp van dezelfde oorsprong zijn. De verificatie slaagt alleen als de links naar de digitale assets correct zijn ingesteld.
Het wordt aangeraden om CustomTabsClient.warmup() aan te roepen. Hierdoor kan de browserapplicatie zich op de achtergrond voorbereiden en het openen van URL's versnellen.
// 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) { }
};
Stel een callback in die de intent start na validatie.
De CustomTabsCallback werd aan de sessie doorgegeven. We hebben de onRelationshipValidationResult() methode zo ingesteld dat de eerder aangemaakte CustomTabsIntent wordt gestart zodra de oorsprongsverificatie is geslaagd.
// 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));
}
};
Koppel de serviceverbinding voor aangepaste tabbladen
Door de service te binden, wordt deze gestart en wordt uiteindelijk de ` onCustomTabsServiceConnected() -methode van de verbinding aangeroepen. Vergeet niet de service op de juiste manier te ontbinden. Het binden en ontbinden gebeurt meestal in de onStart() - en onStop() -methoden van de activity-lifecycle.
// 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);
Demo-applicatiecode
Meer informatie over de Custom Tabs Service vindt u hier . Bekijk de android-browser-helper GitHub-repository voor een werkend voorbeeld van een app.
Samenvatting
Deze handleiding demonstreerde hoe je willekeurige headers kunt toevoegen aan CORS-verzoeken voor aangepaste tabbladen. Goedgekeurde headers kunnen aan elk CORS-verzoek voor aangepaste tabbladen worden toegevoegd. Niet-goedgekeurde headers worden over het algemeen als onveilig beschouwd in CORS-verzoeken en Chrome filtert ze standaard. Het toevoegen ervan is alleen toegestaan voor clients en servers van dezelfde oorsprong, geverifieerd door een link naar een digitaal bestand.