Flutter vs. Dart
Většina lidí si Flutter a Dart plete, jako by to bylo totéž, zejména proto, že Dart a Flutter úzce spolupracují při vývoji napříč platformami. Oba jsou nezbytné pro vytváření androidových...
Pro zkušeného vývojáře nemusí být tento text vůbec překvapivý, ale myslím, že spousta článků, které jsem četl o nastavení CORS v Rails, říkala něco jako: použijte rack-cors, povolte libovolnému hostiteli přístup k API a (případně): v produkci byste měli zvážit něco jiného (než povolení libovolnému hostiteli).
Navrhované kód byla vždy blízko té, která se nacházela pod ním:
config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins ''
resource '', headers: :any, methods: :any
end
end
a bohužel, tyto texty byly sotva vysvětlující pro nás co vlastně dělat ve výrobě.
Kopírování a vkládání mi docela jde (Občas si dělám legraci, že by si firmy mohly najmout copy-pastera ze Stack Overflow.), pokud jde o okamžik "přemýšlení a přizpůsobení" mezi "kopírovat" a "vložit". Rád bych tedy trochu rozvedl, co zde děláme a jak to funguje v reálném životě.
Doufám, že vám nevadí, že začnu krátkým úvodem do teorie cti a pak přejdu k příkladům Rails.
Začněme od začátku. Pro lepší vysvětlení jsem úvod rozdělil na tři části. V první části nastíním, co je to původ - klíčový pojem pro to, o čem se zde bavíme. Druhá část je o SOP, jen stručný popis. A poslední část hovoří o CORS sama o sobě.
Podle MDN Web Dokumenty:
- Původ webového obsahu je definován schématem (protokolem), hostitelem (doménou) a portem adresy URL použité k přístupu k němu. Dva objekty mají stejný původ pouze tehdy, pokud se shodují schéma, hostitel a port (zdroj)
To je snad jasné, ne? Pro jistotu si rozebereme dva příklady z MDN.
http://example.com/app1/index.html, http://example.com/app2/index.html2 výše uvedené mají stejný původ, protože:
http://www.example.com, http://myapp.example.comTyto 2 domény mají odlišný původ, protože domény (www.example.com, myapp.example.com) se liší.
Doufám, že je to dostatečně jasné. Pokud ne, přejděte na webové dokumenty MDN, kde najdete další příklady.
Webové dokumenty MDN říkají (zdroj):
- Zásada stejného původu je důležitý bezpečnostní mechanismus, který omezuje způsob, jakým může dokument nebo skript načtený z jednoho zdroje interagovat se zdrojem z jiného zdroje. Pomáhá izolovat potenciálně škodlivé dokumenty a omezuje možné vektory útoku.
- Zápisy napříč původem jsou obvykle povoleny. Příkladem jsou odkazy, přesměrování a odesílání formulářů.
- Vkládání napříč původem je obvykle povoleno.
- Křížové čtení je obvykle zakázáno, ale přístup ke čtení často uniká vložením.
Použijte CORS umožnit křížový přístup
Jak vidíte, v definicích SOP se hodně hovoří o chování napříč původem. To je v pořádku. Nyní bychom měli vědět jen to, že stejný původ má více oprávnění a že můžeme pravidla pro křížové původy uvolnit pomocí CORS. A zde přichází na řadu další část.
Na základě slov MDN:
To stále nestačí. Nebylo tam výslovně řečeno, že nejdůležitější hlavička při použití CORS je Access-Control-Allow-Origin:
Access-Control-Allow-Origin hlavička odpovědi udává, zda může být odpověď sdílena s kódem žádajícím o odpověď z daného původu (zdroj).To by mělo být vše. V reálném životě při konfiguraci CORS, obvykle konfigurujeme ACAO nejprve záhlaví.
To je vše, pokud jde o definice. Vraťme se zpět k Rails a příkladům z reálného života.
Určitě budeme používat stojanové korby (jak nám bylo řečeno). Připomeňme si první úryvek, který je nejčastěji uváděn v jiných článcích:
config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins ''
resource '', headers: :any, methods: :any
end
end
Možností je nepřeberné množství, ale podívejme se na tyto dvě:
Pokud máte před sebou první možnost, pravděpodobně byste mohli zvolit následující. původ '*' - chcete, aby ostatní vytvořili klienta na základě vašeho rozhraní API, a nevíte, kdo to je, že?
Pokud vyvíjíte druhý typ rozhraní, pravděpodobně nechcete, aby všichni zadávali požadavky na vaše rozhraní API s různým původem. Spíše chcete:
Stále budeme používat stojanové korby (jak nám bylo řečeno) - ale po našem.
Použijme 2 proměnné ENV: ALLOWED_ORIGINS pro doslovné definice původu (hvězdička nebo skutečná adresa URL) a ALLOWED_ORIGIN_REGEXPS pro vzory.
config/initializers/cors.rb
frozenstringliteral: true
toregexp = ->(string) { Regexp.new(string) }
hosts = [
*ENV.fetch('ALLOWEDORIGINS').split(','),
*ENV.fetch('ALLOWEDORIGINREGEXPS').split(';').map(&to_regexp)
]
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins(*hosts)
resource '*',
methods: %i[get post put patch delete options head],
headers: :any
end
end
To by vám mělo poskytnout dostatečnou flexibilitu pro definování správných hodnot ve vývojovém, stagingovém a produkčním prostředí.
Shrňme si vše výše uvedené do klíčových bodů:
CORS,To je vše. Hezký den! 🙂
Přečtěte si více: