2013-07-25 24 views
10

Güvenli bir .net sunucusuyla iletişim kuran bir PhoneGap uygulama geliştiriyorum ayarlamak reddetti. Sorun şu ki, herhangi bir istekle herhangi bir Çerez boyunca geçemiyorum (W3C).Çerez Başlık: güvensiz başlığı "Cookie"

Bu yapıyorum budur (farz olduğunu "kullanıcı adı" ve "şifre" iş). Bu noktada

var token;  
$.ajax({ 
     url: "https://server.com/AuthService/api/account/login", 
     crossDomain: true, 
     type: 'post', 
     async: false, 
     data: { 
      username: "username", 
      password: "password" 
     } 
    }).done(function(response) { 
     token = response.securityToken; 
     success = true; 
    }); 

ben sonraki tüm isteklerini doğrulamak için kullanabileceğiniz bir kimlik doğrulama kodu var. Bu yüzden sunucuya başka bir istek yapmak belirteci ...

$.ajax({ 
    url: "https://server.com/Service/api/search?query=" + query, 
    headers: { Cookie: 'auth=' + token }, 
    crossDomain: true, 
    withCredentials: true, 
    type: 'POST', 
    async: false, 
    data: ' ' //because we don't want our request to be 0 bytes (the server is picky) 
}).done(function(data) { 
    result = data; 
}); 

Krom sadece diyor kullanarak: Reddedildi (W3C spec yapışan olan) güvensiz başlığı "Cookie" ayarlamak için. Uygulama, üstbilgi ayarlamamış ve bunun sonucu olarak 401'lerin yetkilendirme çerezi gönderilmemesi nedeniyle istenmemektedir. Kurabiye başlığını (veya tamamen bu konuda gitmek için başka bir yol) PhoneGap bu yıkmak ve etkisiz hale getirmenin bir yolu var mı:

Sorum şudur? Yetkilendirme üstbilgisi kullanmanın da bir seçenek olduğunu biliyorum, ancak sunucuya sınırlı erişimim var (bunu desteklemiyor) ve daha hızlı bir çözüm olmasını umuyordum.

Bonus sorusu: AuthService çağrısı, aygıtta bir httpOnly çerezi de ayarlamalıdır, ancak bunu yapmıyor (bunun bir çapraz etki alanı isteğidir). Bu varsayımı düzeltir miyim? Sunucu tarafında yanlış bir şey var mı?

Teşekkürler!

cevap

5

Kısa cevap hayır, Kurabiye başlığını ayarlamak olamaz. Bunun nedeni, Chrome'un Kullanıcı Aracınız olmasıdır, bu nedenle HTTP spesifikasyonu tarafından güvenlik etkilerine sahip olan başlıklarda değişiklik yapılmasına izin verilmemesi gerekir.

bir çözüm sunucusu XmlHttpRequest nesne üzerinde çerez ayarlamaya izin veren bir eylemi gerçekleştirmek için olacaktır. Bunu yapmaya çalıştığını söylüyorsun ama işe yaramıyor. Şüpheliyim çünkü ajax isteğinizle Kimlik Bilgilerini ayarlamanız gerekiyor. XhrFields özniteliğini aşağıdaki gibi ekleyin.

var token;  
$.ajax({ 
    url: "https://server.com/AuthService/api/account/login", 
    crossDomain: true, 
    xhrFields: {withCredentials: true}, 
    type: 'post', 
    async: false, 
    data: { 
     username: "username", 
     password: "password" 
    } 
}).done(function(response) { 
    token = response.securityToken; 
    success = true; 
}); 

Şimdi sürece onun CORS alan adlarına izin olarak yanıt sunucu bir joker göndermez olarak (Access-Control--Origin izin ver) kullanarak, çerez almalıdır. cevap için

+0

teşekkürler. İhtiyaçlarım için iyi çalışan bir Yetkilendirme üstbilgisini seçmeyi bitirdim! – evancohen

+0

Teşekkür ederim, 'Set-Cookie' ile' Secure' ve 'httponly' özniteliklerine yanıt başlığı ile mücadele ediyordum, ardından doğru' Cookie'yi takip isteklerine geri gönderiyordum. Aralarında bir "nginx" proxy kullanıyorum ve uygun "Access-Control" başlıklarını ayarlamak için Angular '$ http' ayarını yapmamı sağladı. – sampoh