2016-09-22 20 views
5

Tanımlanmış bir AWS API Ağ Geçidine bağlanan bir AWS Lambda örneğim var. CORS'i etkinleştirir ve access-control-allow-origin'u http://example.com tanımına verirsek, http://example.com'dan Lambda örneğine erişebilirim. Ancak, https://example.com kullanırsam, işe yaramıyor.AWS API Ağ Geçidi - CORS "erişim-izin-izin-kaynağı" - çoklu girişler

AWS'de joker kullanmadan birden çok access-control-allow-origin değerlerini kullanarak nasıl tanımlayabilirim? *.example.com gibi bir şey kullanmayı denedim, ancak bu işe yaramıyor.

DÜZENLEME: '*' API ağ geçidindeki değerinim olarak kullanıyorum, ancak S3 grubumdaki CORS kurallarını ayarlarsam, bu güvenli olur mu? Kepçe kuralları için örnek:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>http://example.com</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
    <CORSRule> 
     <AllowedOrigin>https://example.com</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
    <CORSRule> 
     <AllowedOrigin>https://www.example.com</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 
+0

Aynı sorun burada. Durumumda, withCredentials() seçeneğini kullanmam gerektiğinden, joker karaktere izin verilmemesi. Apigw'un ele geçirmesine izin vermek yerine koç başlıklarını kendim halletmem gerekebilir. S3 için CORS kurallarını sağladıkları için çok aptalcalar. – Taichi

cevap

5

Ne yazık ki bugün bu mümkün değil. CORS özellikleri kısmi vahşi kartlara izin vermez ve şu anda API Ağ Geçidi sadece başlık için tek bir statik değere izin verir.

Bu değeri dinamik olarak gelen ana bilgisayar üstbilgisine göre döndürmek için OPTIONS yönteminizi aşırı yükleyebilirsiniz.

+0

Teşekkürler Bob. Biliyorum bu değer için '' '(herhangi bir şey gittiğinden sonra çalışır), ama düşük profilli bir site için herhangi bir soruna neden olacağını düşünüyor musunuz? – Wes

+0

@Wes, kabul etmek istediğiniz risk düzeyine bağlıdır. Sadece bir http vs https meselesiyse, muhtemelen bunları her zaman https'e yönlendirerek bunu çözebilirsiniz. [Firefox] (https://blog.mozilla.org/security/2015/04/30/deprecating-non-secure-http/) ve [Chrome] ile (https://blog.chromium.org/2016/09/hareketli-doğru-daha güvenli-web.html) kullanımdan kaldırılmaya doğru ilerliyor http, bu mantıklı ve çok zor olmamalı. –

8

Bu, birkaç Kökeni etkinleştirmek istiyorsanız CORS ile her zaman bir sıkıntı olmuştur.

diğer sistemlerde ortak çözüm (örn ifade/nginx vs) şudur:

  • tarayıcı tarafından gönderilen Origin başlığını incelemek Eğer maç
  • kökenleri
  • bir beyaz listeye karşılaştırılmak ,

Bu değil dönmek başka, Access-Control-Allow-Origin başlık olarak yer tutucu (varsayılan kökenli) gelen Origin dönmek AWS-Gateway'in otomatik kablolu CORS desteği ile sahte bir entegrasyon kullanıldığında, OPTIONS isteğini işlemek için kendi kodunuzu yazmanız mümkün olabilir. Bir lambda fonksiyonu olarak

const allowedOrigins = [ 
    "http://example.com", 
    "http://example.com:8080", 
    "https://example.com", 
    "https?://[a-z]*.?myapp.com", 
    "http://localhost:[0-9]*" 
]; 

exports.handler = (event, context) => { 
    const origin = event.headers.Origin || event.headers.origin; 
    var goodOrigin = false; 

    if (origin) { 
     allowedOrigins.forEach(allowedOrigin => { 
      if (!goodOrigin && origin.match(allowedOrigin)) { 
       goodOrigin = true; 
      } 
     }); 
    } 

    context.succeed({ 
     headers: { 
      "Access-Control-Allow-Headers": "Accept,Accept-Language,Content-Language,Content-Type,Authorization,x-correlation-id", 
      "Access-Control-Expose-Headers": "x-my-header-out", 
      "Access-Control-Allow-Methods": "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT", 
      "Access-Control-Allow-Origin": goodOrigin ? origin : allowedOrigins[0] 
     }, 
     statusCode: 204 
    }); 
}; 

kaydet bu Aşağıda

lambda vekil entegrasyonlarıyla yazılı örnek kodudur. Bunu API-Ağ Geçidi'nde ayarlamak için OPTIONS yöntemini ekleyin ve Integration Request için Use Lambda Proxy integration işaretli Lambda Function'u seçin. Tabii ki bunun dezavantajı, lambda fonksiyonları için ödeme yapıyor olmanız ve lambda işlevini çağırmanızın, sahte entegrasyon üzerinde muhtemelen 50ms'lik bir gecikme olacağıdır.

İlgili konular