Flutter vs. Dart
De meeste mensen halen Flutter en Dart door elkaar alsof ze hetzelfde zijn, vooral omdat Dart en Flutter nauw samenwerken in crossplatformontwikkeling. Beide zijn essentieel voor het bouwen van android...
Voor een ervaren ontwikkelaar is deze tekst misschien helemaal niet verrassend, maar ik denk dat veel artikelen die ik heb gelezen over de CORS setup in Rails iets zeiden in de trant van: gebruik rack-cors, sta elke host toe om toegang te krijgen tot de API, en (optioneel): je zou iets anders moeten overwegen (dan het toestaan van elke host) in productie.
De voorgestelde code was altijd dicht bij die eronder:
config/initialisatoren/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
toestaan do
oorsprong ''
bron '', headers: :any, methods: :any
einde
einde
en helaas waren deze teksten nauwelijks uit te leggen aan us wat je eigenlijk in de productie moet doen.
Ik ben best OK met copy-pasten (Ik maak wel eens een grapje dat bedrijven een Stack Overflow copy-paster zouden kunnen inhuren), voor zover er een "denk na en pas aan" moment is tussen "kopiëren" en "plakken". Dus ik wil graag een beetje uitweiden over wat we hier doen en hoe het in het echte leven werkt.
Ik hoop dat je het niet erg vindt dat ik begin met een korte introductie in de eretheorie en dan verder ga met de Rails voorbeelden.
Laten we bij het begin beginnen. Om de dingen beter uit te leggen, heb ik de inleiding opgesplitst in drie delen. In het eerste deel wordt uitgelegd wat een oorsprong is - de sleutelterm voor wat we hier bespreken. Het tweede deel gaat over SOP, gewoon een korte beschrijving. En het laatste deel gaat over de CORS zelf.
Volgens de MDN Web Documenten:
- De oorsprong van webinhoud wordt bepaald door het schema (protocol), de host (domein) en de poort van de URL die wordt gebruikt om toegang te krijgen. Twee objecten hebben alleen dezelfde oorsprong als het schema, de host en de poort overeenkomen (bron)
Dat lijkt vrij duidelijk, nietwaar? Laten we voor de zekerheid twee voorbeelden van MDN analyseren.
http://example.com/app1/index.html, http://example.com/app2/index.htmlDe 2 hierboven hebben dezelfde oorsprong omdat:
http://www.example.com, http://myapp.example.comDeze 2 hebben een verschillende oorsprong omdat de domeinen (www.example.com, myapp.example.com) zijn verschillend.
Ik hoop dat het duidelijk genoeg is. Zo niet, ga dan naar de MDN Web Docs voor meer voorbeelden.
MDN Web Docs zeggen (bron):
- Het same-origin beleid is een kritisch beveiligingsmechanisme dat beperkt hoe een document of script geladen van de ene oorsprong kan interageren met een bron van een andere oorsprong. Het helpt bij het isoleren van mogelijk schadelijke documenten, waardoor mogelijke aanvalsvectoren worden beperkt.
- Cross-origin writes zijn meestal toegestaan. Voorbeelden zijn links, omleidingen en formulierverzendingen.
- Cross-origin embedding is meestal toegestaan.
- Cross-origin reads zijn meestal niet toegestaan, maar leestoegang wordt vaak gelekt door embedding.
Gebruik CORS om cross-origin toegang toe te staan
Nou, zoals je kunt zien, staat er veel over herkomstoverschrijdend gedrag in de definities van SOP. Dat is niet erg. Alles wat we nu moeten weten is dat dezelfde oorsprong meer privileges heeft en dat we de regels voor cross-origins kunnen versoepelen door CORS te gebruiken. En hier komt de volgende sectie.
Afgaande op de woorden van MDN:
Dat is nog steeds niet genoeg. Wat daar niet expliciet is gezegd, is dat de belangrijkste header bij het gebruik van CORS is Toegangsbeheer-oorsprong toestaan:
Toegangsbeheer-oorsprong toestaan response header geeft aan of het antwoord kan worden gedeeld met aanvragende code van de opgegeven oorsprong (bron).Nou, dat zou het moeten zijn. In het echte leven, bij het configureren van CORSconfigureren we meestal de ACAO kop eerst.
Tot zover de definities. Laten we teruggaan naar Rails en voorbeelden uit de praktijk.
We zullen zeker rack-cors gebruiken (zoals ons is verteld). Laten we het eerste fragment in herinnering brengen, het fragment dat het vaakst wordt gegeven in andere artikelen:
config/initialisatoren/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
toestaan do
oorsprong ''
bron '', headers: :any, methods: :any
einde
einde
Het aantal opties is enorm of zelfs oneindig, maar laten we deze twee eens bekijken:
Als je voor de eerste optie staat, kun je waarschijnlijk gaan voor oorsprong *' - je wilt dat anderen een client bouwen bovenop jouw API en je weet niet wie ze zijn, toch?
Als je het laatste ontwikkelt, wil je waarschijnlijk niet dat iedereen cross-origin requests doet naar je API. Dat wil je liever wel:
We zullen nog steeds rek-cors gebruiken (zoals ons is verteld) - maar op onze manier.
Laten we 2 ENV-variabelen gebruiken: TOEGESTANE_OORSPRONG voor letterlijke oorsprongsdefinities (een sterretje of een echte URL) en TOEGESTANE_OORSPRONG_REGEXPS voor de patronen.
config/initialisatoren/cors.rb
bevrorenstringliteral: waar
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
toestaan do
origins(*hosts)
bron '*',
methods: %i[get post put patch delete options head],
headers: :any
einde
einde
Dit zou je genoeg flexibiliteit moeten geven om de juiste waarden te definiëren in je ontwikkel-, staging- en productieomgevingen.
Laten we al het bovenstaande samenvatten in kernpunten:
CORS,Dat was het. Nog een fijne dag! 🙂
Lees meer: