window.pipedriveLeadboosterConfig = { bas: 'leadbooster-chat.pipedrive.com', företagId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = fönster if (w.LeadBooster) { console.warn('LeadBooster finns redan') } annars { w.LeadBooster = { q: [], on: funktion (n, h) { this.q.push({ t: "o", n: n, h: h }) }, trigger: funktion (n) { this.q.push({ t: 't', n: n }) }, } } })() Rails API & CORS. Ett stänk av medvetenhet - The Codest
Codest
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Industrier
    • Fintech & bankverksamhet
    • E-commerce
    • Adtech
    • Hälsoteknik
    • Tillverkning
    • Logistik
    • Fordon
    • IOT
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
Pil tillbaka GÅ TILLBAKA
2021-04-01
Utveckling av programvara

Rails API & CORS. Ett stänk av medvetenhet

Codest

Krzysztof Buszewicz

Senior Software Engineer

För en erfaren utvecklare kanske den här texten inte alls är överraskande, men jag tror att många av de artiklar jag har läst om CORS-installationen i Rails sa något i stil med: använd rack-cors, låt alla värdar komma åt API:et och (eventuellt): du bör överväga något annat (än att tillåta alla värdar) i produktionen.

Den föreslagna kod var alltid nära den under:

config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
ursprung ''
resource '', headers: :any, methods: :any
slut
slut

och tyvärr förklarade dessa texter knappast för oss vad vi faktiskt skulle göra i produktionen.

Jag är ganska bra på att kopiera och klistra in (Jag skämtar ibland om att företag skulle kunna anställa en Stack Overflow copy-paster), så länge det finns ett "tänk och justera"-moment mellan "kopiera" och "klistra in". Så jag skulle vilja utveckla lite vad vi gör här och hur det fungerar i verkliga livet.

Jag hoppas att du inte har något emot att jag börjar med en kort introduktion till hedersteori och sedan går vidare till Rails-exemplen.

Inledning

Låt oss börja från början. För att förklara saker och ting bättre har jag delat upp introduktionen i tre delar. I den första delen beskrivs vad ett ursprung är - nyckelbegreppet för det vi diskuterar här. Den andra handlar om SOP, bara en kort beskrivning. Och den sista delen handlar om CORS själv.

Vad är ett ursprung?

Enligt MDN Web Docs:

- Webbinnehållets ursprung definieras av schemat (protokollet), värden (domänen) och porten för den URL som används för att komma åt det. Två objekt har samma ursprung endast när schema, host och port matchar varandra (källa)

Det verkar ganska tydligt, eller hur? Låt oss analysera två exempel från MDN, bara i fall att.

  1. http://example.com/app1/index.html, http://example.com/app2/index.html

De 2 ovanstående har samma ursprung eftersom:

  • deras system (http) är desamma,
  • deras domäner (example.com) är desamma,
  • deras portar (implicita) är desamma.
  1. http://www.example.com, http://myapp.example.com

Dessa 2 har olika ursprung eftersom domänerna (www.example.com, myapp.exempel.com) är olika.

Jag hoppas att det är tillräckligt tydligt. Om inte, kan du gå till MDN Web Docs för fler exempel.

Vad är SOP?

MDN Web Docs säger (källa):

- Policyn för samma ursprung är en viktig säkerhetsmekanism som begränsar hur ett dokument eller skript som laddas från ett ursprung kan interagera med en resurs från ett annat ursprung. Det hjälper till att isolera potentiellt skadliga dokument och minska möjliga attackvektorer.

- Skrivningar mellan olika ursprung är vanligtvis tillåtna. Exempel är länkar, omdirigeringar och formulärinlämningar.

- Cross-origin embedding är normalt tillåtet.

- Cross-origin reads är vanligtvis inte tillåtna, men läsåtkomst läcker ofta ut genom inbäddning.
Användning CORS för att tillåta åtkomst över ursprungsland

Som du kan se handlar definitionerna av SOP mycket om beteende mellan olika ursprung. Men det gör inget. Allt vi borde veta nu är att samma ursprung har fler privilegier och att vi kan lossa på reglerna för cross-origins genom att använda CORS. Och här kommer nästa avsnitt in.

Vad är CORS?

Baserat på MDN:s ord:

  • Cross-Origin Resource Sharing (CORS) är en HTTP-headerbaserad mekanism som gör det möjligt för en server att ange andra ursprung (domän, schema eller port) än det egna från vilket en webbläsare ska tillåta inläsning av resurser. CORS bygger också på en mekanism genom vilken webbläsare gör en "preflight"-förfrågan till den server som är värd för cross-origin-resursen, för att kontrollera att servern kommer att tillåta den faktiska förfrågan. I denna preflight skickar webbläsaren rubriker som anger den HTTP-metod och de rubriker som kommer att användas i den faktiska begäran (källa).

Det är fortfarande inte tillräckligt. Vad som inte uttryckligen sades där är att den viktigaste rubriken när du använder CORS är Access-kontroll-Allow-Origin:

  • Den Access-kontroll-Allow-Origin svarshuvudet anger om svaret kan delas med begärande kod från det angivna ursprunget (källa).

Ja, det borde vara allt. I verkliga livet, när du konfigurerar CORSkonfigurerar vi vanligtvis ACAO rubriken först.

Verkliga livet

Det var allt när det gäller definitioner. Låt oss återgå till Rails och exempel från verkligheten.

Hur konfigurerar jag CORS i Rails?

Vi kommer definitivt att använda rack-cors (som vi blev tillsagda att göra). Låt oss komma ihåg det första utdraget, det som oftast tillhandahålls i andra artiklar:


config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
ursprung ''
resource '', headers: :any, methods: :any
slut
slut

Antalet alternativ är stort eller till och med oändligt, men låt oss överväga dessa två:

  • bygger vi det API som får användas av webbläsarklienter från tredje part,
  • vi har en typisk frontend/backend-separation och vill tillåta våra betrodda kunder att komma åt API:et.

API för byggnader som nås av tredjepartskunder

Om du står inför det första alternativet kan du förmodligen välja ursprung "*" - du vill att andra ska bygga en klient på toppen av ditt API och inte veta vem de är, eller hur?

Typisk frontend/backend-separation

Om du utvecklar det senare vill du förmodligen inte att alla ska göra cross-origin-förfrågningar till ditt API. Det vill du snarare:

  • tillåta produktionsklienter att få tillgång till produktions-API,
  • samma sak för staging,
  • samma sak för localhost,
  • du kanske vill tillåta FE-granskningsappar att komma åt staging.

Vi kommer fortfarande att använda rack-cors (som vi blev tillsagda att göra) - men på vårt eget sätt.

Låt oss använda 2 ENV-variabler: TILLÅTNA_URSPRUNG för bokstavliga ursprungsdefinitioner (en asterisk eller en faktisk URL) och TILLÅTET_URSPRUNG_REGEXPS för mönstren.

config/initializers/cors.rb

frozenstringliteral: true

toregexp = ->(sträng) { Regexp.new(sträng) }
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)

resurs '*',
         methods: %i[get post put patch delete options head],
         rubriker: :vilken som helst

slut
slut

Vad är det som händer här?

  1. Som du kan se delar vi upp värdena som definieras i ENV-variablerna med olika separatorer. Det beror på att det är mindre sannolikt att ett semikolon förekommer i URL-definieringsmönstret.
  2. Bokstavliga värden är klara att användas, men vi måste mappa mönstren så att de blir faktiska Regexp-instanser.
  3. Sedan sammanfogar vi allt och låter dessa värdar komma åt alla resurser med vitlistade metoder som vårt API använder.

Detta bör ge dig tillräcklig flexibilitet för att definiera korrekta värden i dina utvecklings-, staging- och produktionsmiljöer.

Slutsatser

Låt oss sammanfatta allt ovanstående i viktiga punkter:

  • använda ENV-variabler för att konfigurera CORS,
  • använda reguljära uttryck för att tillåta olika ursprung att få åtkomst till staging API (t.ex. för granskningsappar),
  • alltid sätta "tänka och justera" mellan "kopiera" och "klistra in".

Så var det med det. Ha en trevlig dag! 🙂 🙂

Läs mer om detta:

Varför bör du (förmodligen) använda Typescript?

10 NYC Startups värda att nämna 2021

Relaterade artiklar

Utveckling av programvara

Bygg framtidssäkrade webbappar: Insikter från The Codest:s expertteam

Upptäck hur The Codest utmärker sig genom att skapa skalbara, interaktiva webbapplikationer med banbrytande teknik som ger sömlösa användarupplevelser på alla plattformar. Läs om hur vår expertis driver digital omvandling och affärsutveckling...

DEKODEST
Utveckling av programvara

Topp 10 Lettlandsbaserade mjukvaruutvecklingsföretag

Läs mer om Lettlands främsta mjukvaruutvecklingsföretag och deras innovativa lösningar i vår senaste artikel. Upptäck hur dessa teknikledare kan hjälpa till att lyfta ditt företag.

thecodest
Lösningar för företag och uppskalningsföretag

Java Software Development Essentials: En guide till framgångsrik outsourcing

Utforska denna viktiga guide om framgångsrik outsourcing av Java-programvaruutveckling för att förbättra effektiviteten, få tillgång till expertis och driva projektframgång med The Codest.

thecodest
Utveckling av programvara

Den ultimata guiden till outsourcing i Polen

Den kraftiga ökningen av outsourcing i Polen drivs av ekonomiska, utbildningsmässiga och tekniska framsteg, vilket främjar IT-tillväxt och ett företagsvänligt klimat.

TheCodest
Lösningar för företag och uppskalningsföretag

Den kompletta guiden till verktyg och tekniker för IT-revision

IT-revisioner säkerställer säkra, effektiva och kompatibla system. Läs mer om hur viktiga de är genom att läsa hela artikeln.

Codest
Jakub Jakubowicz CTO och medgrundare

Prenumerera på vår kunskapsbas och håll dig uppdaterad om expertisen från IT-sektorn.

    Om oss

    The Codest - Internationellt mjukvaruutvecklingsföretag med teknikhubbar i Polen.

    Förenade kungariket - Huvudkontor

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokala tekniknav

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polen

      Codest

    • Hem
    • Om oss
    • Tjänster
    • Fallstudier
    • Vet hur
    • Karriär
    • Ordbok

      Tjänster

    • Det rådgivande
    • Utveckling av programvara
    • Backend-utveckling
    • Frontend-utveckling
    • Staff Augmentation
    • Backend-utvecklare
    • Ingenjörer inom molntjänster
    • Dataingenjörer
    • Övriga
    • QA-ingenjörer

      Resurser

    • Fakta och myter om att samarbeta med en extern partner för mjukvaruutveckling
    • Från USA till Europa: Varför väljer amerikanska startup-företag att flytta till Europa?
    • Jämförelse av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinerna), Eurasien (Turkiet)
    • Vilka är de största utmaningarna för CTO:er och CIO:er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Användarvillkor för webbplatsen

    Copyright © 2025 av The Codest. Alla rättigheter reserverade.

    sv_SESwedish
    en_USEnglish de_DEGerman da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek sv_SESwedish