window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster już istnieje') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Rails API i CORS. Szczypta świadomości - The Codest
The Codest
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Branże
    • Fintech i bankowość
    • E-commerce
    • Adtech
    • Healthtech
    • Produkcja
    • Logistyka
    • Motoryzacja
    • IOT
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
Strzałka w tył WSTECZ
2021-04-01
Software Development

Rails API i CORS. Szczypta świadomości

The Codest

Krzysztof Buszewicz

Senior Software Engineer

Dla doświadczonego programisty ten tekst może nie być wcale zaskakujący, ale myślę, że wiele artykułów, które czytałem na temat konfiguracji CORS w Railsach, mówiło coś w rodzaju: użyj rack-cors, zezwól dowolnemu hostowi na dostęp do API i (opcjonalnie): powinieneś rozważyć coś innego (niż zezwolenie na dowolny host) w produkcji.

Proponowane kod był zawsze blisko tego poniżej:

config/initializers/cors.rb

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

i, niestety, teksty te nie wyjaśniały nam, co właściwie należy robić w produkcji.

Jestem całkiem w porządku z kopiowaniem i wklejaniem (Czasami żartuję, że firmy mogłyby zatrudnić kopiującego Stack Overflow), jeśli chodzi o moment "pomyśl i dostosuj" między "kopiuj" i "wklej". Chciałbym więc nieco rozwinąć to, co tutaj robimy i jak to działa w prawdziwym życiu.

Mam nadzieję, że nie masz nic przeciwko temu, że zacznę od krótkiego wprowadzenia do teorii honoru, a następnie przejdę do przykładów Railsów.

Wprowadzenie

Zacznijmy od początku. Aby lepiej to wyjaśnić, podzieliłem to wprowadzenie na trzy części. W pierwszej przedstawię, czym jest origin - kluczowy termin dla tego, o czym tutaj rozmawiamy. Druga dotyczy SOP, to tylko krótki opis. Ostatnia część mówi o CORS siebie.

Co to jest pochodzenie?

Według MDN Web Docs:

- Pochodzenie treści internetowej jest definiowane przez schemat (protokół), host (domenę) i port adresu URL używanego do uzyskania do niej dostępu. Dwa obiekty mają to samo pochodzenie tylko wtedy, gdy schemat, host i port są zgodne (źródło)

Wydaje się to całkiem jasne, prawda? Na wszelki wypadek przeanalizujmy dwa przykłady z MDN.

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

Powyższe 2 mają to samo pochodzenie, ponieważ:

  • ich schematy (http) są takie same,
  • ich domeny (example.com) są takie same,
  • ich porty (domyślne) są takie same.
  1. http://www.example.com, http://myapp.example.com

Te 2 mają różne pochodzenie, ponieważ domeny (www.example.com, myapp.example.com) są różne.

Mam nadzieję, że jest to wystarczająco jasne. Jeśli nie, więcej przykładów można znaleźć w MDN Web Docs.

Co to jest SOP?

MDN Web Docs mówi (źródło):

- Polityka tego samego pochodzenia jest krytycznym mechanizmem bezpieczeństwa, który ogranicza sposób, w jaki dokument lub skrypt załadowany z jednego źródła może wchodzić w interakcję z zasobem z innego źródła. Pomaga izolować potencjalnie złośliwe dokumenty, ograniczając możliwe wektory ataku.

- Zazwyczaj dozwolone są zapisy między źródłami. Przykładami są linki, przekierowania i przesyłanie formularzy.

- Osadzanie między źródłami jest zazwyczaj dozwolone.

- Odczyty cross-origin są zazwyczaj niedozwolone, ale dostęp do odczytu jest często wyciekany przez osadzanie.
Użycie CORS aby umożliwić dostęp między źródłami

Cóż, jak widać, w definicjach SOP znajduje się wiele informacji na temat zachowań związanych z różnymi źródłami. W porządku. Wszystko, co powinniśmy teraz wiedzieć, to to, że to samo pochodzenie ma więcej przywilejów i możemy poluzować zasady dla różnych źródeł, używając CORS. I tutaj pojawia się następna sekcja.

Czym jest CORS?

Opierając się na słowach MDN:

  • Cross-Origin Resource Sharing (CORS) to mechanizm oparty na nagłówku HTTP, który pozwala serwerowi wskazać dowolne inne pochodzenie (domenę, schemat lub port) niż jego własne, z którego przeglądarka powinna zezwolić na ładowanie zasobów. CORS opiera się również na mechanizmie, za pomocą którego przeglądarki wykonują żądanie "preflight" do serwera hostującego zasób cross-origin, aby sprawdzić, czy serwer zezwoli na faktyczne żądanie. W tym preflight przeglądarka wysyła nagłówki, które wskazują metodę HTTP i nagłówki, które zostaną użyte w rzeczywistym żądaniu (źródło).

To wciąż za mało. To, co nie zostało tam wyraźnie powiedziane, to fakt, że najważniejszym nagłówkiem podczas korzystania z CORS jest Access-Control-Allow-Origin:

  • The Access-Control-Allow-Origin nagłówek odpowiedzi wskazuje, czy odpowiedź może być współdzielona z kodem żądania z danego źródła (źródło).

Cóż, to powinno być wszystko. W prawdziwym życiu, podczas konfigurowania CORSzazwyczaj konfigurujemy ACAO nagłówek pierwszy.

Prawdziwe życie

To tyle, jeśli chodzi o definicje. Wróćmy do Railsów i przykładów z życia wziętych.

Jak skonfigurować CORS w Railsach?

Zdecydowanie użyjemy rack-corów (tak jak nam powiedziano). Przypomnijmy sobie pierwszy fragment, który jest najczęściej podawany w innych artykułach:


config/initializers/cors.rb

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

Liczba opcji jest ogromna, a nawet nieskończona, ale rozważmy te dwie:

  • tworzymy API, które może być używane przez klientów przeglądarek innych firm,
  • mamy typową separację frontend/backend i chcemy umożliwić naszym zaufanym klientom dostęp do API.

Budowanie API dostępnego dla klientów zewnętrznych

Jeśli masz do czynienia z pierwszą opcją, prawdopodobnie możesz wybrać początki '*' - chcesz, aby inni zbudowali klienta na podstawie twojego API i nie wiesz, kim oni są, prawda?

Typowa separacja frontend/backend

Jeśli tworzysz to drugie rozwiązanie, prawdopodobnie nie chcesz, aby wszyscy wysyłali żądania typu cross-origin do Twojego API. Raczej chcesz:

  • zezwalają klientom produkcyjnym na dostęp do produkcyjnego API,
  • To samo dotyczy inscenizacji,
  • to samo dla localhost,
  • możesz zezwolić aplikacjom FE review na dostęp do staging.

Nadal będziemy używać rack-corów (tak jak nam kazano) - ale po naszemu.

Użyjmy 2 zmiennych ENV: ALLOWED_ORIGINS dla dosłownych definicji pochodzenia (gwiazdka lub rzeczywisty adres URL) i ALLOWED_ORIGIN_REGEXPS dla wzorów.

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

Co tu się dzieje?

  1. Jak widać, rozdzielamy wartości zdefiniowane w zmiennych ENV różnymi separatorami. Dzieje się tak, ponieważ średnik jest mniej prawdopodobny do pojawienia się we wzorcu definiującym adres URL.
  2. Dosłowne wartości są gotowe do użycia, ale musimy zmapować wzorce na rzeczywiste instancje Regexp.
  3. Następnie łączymy wszystko razem i zezwalamy tym hostom na dostęp do dowolnego zasobu za pomocą metod z białej listy, których używa nasz interfejs API.

Powinno to zapewnić wystarczającą elastyczność, aby zdefiniować odpowiednie wartości w środowiskach programistycznych, przejściowych i produkcyjnych.

Wnioski

Podsumujmy wszystkie powyższe w kluczowych punktach:

  • używać zmiennych ENV do konfiguracji CORS,
  • używać wyrażeń regularnych, aby umożliwić różnym źródłom dostęp do interfejsu API staging (np. w przypadku aplikacji do recenzowania),
  • Zawsze umieszczaj "pomyśl i dostosuj" między "kopiuj" i "wklej".

To by było na tyle. Miłego dnia! 🙂

Czytaj więcej:

Dlaczego (prawdopodobnie) powinieneś używać Typescript?

10 startupów z Nowego Jorku, o których warto wspomnieć w 2021 roku

Powiązane artykuły

Software Development

Tworzenie przyszłościowych aplikacji internetowych: spostrzeżenia zespołu ekspertów The Codest

Odkryj, w jaki sposób The Codest wyróżnia się w tworzeniu skalowalnych, interaktywnych aplikacji internetowych przy użyciu najnowocześniejszych technologii, zapewniając płynne doświadczenia użytkowników na wszystkich platformach. Dowiedz się, w jaki sposób nasza wiedza napędza transformację cyfrową i biznes...

THEECODEST
Software Development

10 najlepszych firm tworzących oprogramowanie na Łotwie

Dowiedz się więcej o najlepszych łotewskich firmach programistycznych i ich innowacyjnych rozwiązaniach w naszym najnowszym artykule. Odkryj, w jaki sposób ci liderzy technologiczni mogą pomóc w rozwoju Twojej firmy.

thecodest
Rozwiązania dla przedsiębiorstw i scaleupów

Podstawy tworzenia oprogramowania Java: Przewodnik po skutecznym outsourcingu

Zapoznaj się z tym niezbędnym przewodnikiem na temat skutecznego tworzenia oprogramowania Java outsourcing, aby zwiększyć wydajność, uzyskać dostęp do wiedzy specjalistycznej i osiągnąć sukces projektu z The Codest.

thecodest
Software Development

Kompletny przewodnik po outsourcingu w Polsce

Wzrost liczby outsourcing w Polsce jest napędzany przez postęp gospodarczy, edukacyjny i technologiczny, sprzyjający rozwojowi IT i przyjazny klimat dla biznesu.

TheCodest
Rozwiązania dla przedsiębiorstw i scaleupów

Kompletny przewodnik po narzędziach i technikach audytu IT

Audyty IT zapewniają bezpieczne, wydajne i zgodne z przepisami systemy. Dowiedz się więcej o ich znaczeniu, czytając cały artykuł.

The Codest
Jakub Jakubowicz CTO & Współzałożyciel

Subskrybuj naszą bazę wiedzy i bądź na bieżąco!

    O nas

    The Codest - Międzynarodowa firma programistyczna z centrami technologicznymi w Polsce.

    Wielka Brytania - siedziba główna

    • Office 303B, 182-184 High Street North E6 2JA
      Londyn, Anglia

    Polska - lokalne centra technologiczne

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

      The Codest

    • Strona główna
    • O nas
    • Nasze Usługi
    • Case Studies
    • Nasze Know How
    • Kariera
    • Słownik

      Nasze Usługi

    • Konsultacje IT
    • Software Development
    • Backend Development
    • Frontend Development
    • Zespoły IT
    • Backend Dev
    • Inżynierowie rozwiązań chmurowych
    • Inżynierowie danych
    • Inne
    • Inżynierowie QA

      Raporty

    • Fakty i mity na temat współpracy z zewnętrznym partnerem programistycznym
    • Z USA do Europy: Dlaczego amerykańskie startupy decydują się na relokację do Europy?
    • Porównanie centrów rozwoju Tech Offshore: Tech Offshore Europa (Polska), ASEAN (Filipiny), Eurazja (Turcja)
    • Jakie są największe wyzwania CTO i CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Warunki korzystania z witryny

    Copyright © 2025 by The Codest. Wszelkie prawa zastrzeżone.

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