2009-11-20 19 views
36

UIWebView aracılığıyla güvenli bir web sitesine erişmeye çalışıyorum. Safari yoluyla eriştiğimde, kimlik doğrulama sorgusu alıyorum, ancak uygulamadaki UIWebView'umda aynı görünmüyor. Nasıl görünmesini sağlayabilirim?UIWebView'de Kimlik Doğrulama Mücadelesi nasıl görüntülenir?

Herhangi bir işaretçi, örnek kod veya bağlantı çok yardımcı olacaktır. Çok teşekkürler.

cevap

35

Aslında çok kolay ... Eminim, auth challenge delegesi gösterildiğinde (veya URL'yi yüklemeden önce, isabet ettiğiniz URL'nin size bildireceğinden emin olmanız halinde) bir UIAlertView gösterebileceğine eminim auth giriş bilgisi için). Her neyse, hile kendi NSURLConnection oluşturmak ve auth delegesinin kullanılmış olup olmadığını kaydetmek için bazı mantık yapmak. y5h yanı söylediği gibi, `sonsuz döngü durur didReceiveResponse yöntemine 'EVET = _authed ekleyin

:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 
{ 
    NSLog(@"Did start loading: %@ auth:%d", [[request URL] absoluteString], _authed); 

    if (!_authed) { 
     _authed = NO; 
     /* pretty sure i'm leaking here, leave me alone... i just happen to leak sometimes */ 
     [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     return NO; 
    } 

    return YES; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 
{ 
    NSLog(@"got auth challange"); 

    if ([challenge previousFailureCount] == 0) { 
     _authed = YES; 
     /* SET YOUR credentials, i'm just hard coding them in, tweak as necessary */ 
     [[challenge sender] useCredential:[NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistencePermanent] forAuthenticationChallenge:challenge]; 
    } else { 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
{ 
    NSLog(@"received response via nsurlconnection"); 

    /** THIS IS WHERE YOU SET MAKE THE NEW REQUEST TO UIWebView, which will use the new saved auth info **/ 

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:]]; 

    [_webView loadRequest:urlRequest]; 
} 

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection; 
{ 
    return NO; 
} 
+2

POST'larla çalışmaz. Bunun basit bir değişikliği bile, POST'larla çalışmaz. –

+2

Bu, kimlik doğrulaması yapılmamış istekler için çalışmaz (_authed always == NO ve sonsuz döngü tetiklenir). Bu sorunu çözdüyseniz bile, bu hala işe yaramaz, çünkü her bir web sayfası için birden çok kez başlatılmalı, çünkü sonuçta web görünümünün web görünümünde görüntülenen tek içerik olmasıyla ilgili son URL isteğiyle sonuçlanır. – Zach

+1

didReceiveResponse '_authed = YES' değerini ekleyin. Bu, sunucu herhangi bir nedenle meydan okuma isteği göndermediğinde sonsuz döngüyü engeller. – Seunghoon

4

Bildiğiniz gibi, UIWebView sunucuyla iletişim kurma olanağı sağlamıyor. Bu sorunu şu şekilde çözdüm: Temsilci yönteminde UIWebView'ın bir başka bağlantı başlatması için temsilci yönteminin başlatılması gerekir. NSURLConnection ile başka bir bağlantı başlatıyorum ve halihazırda temsilci yönteminin gerçekleştirilmesi için didReceiveAuthenticationChallenge sunucudan işlem gerçekleştirdi. DiddeheceiveResponse yönteminde (meydan okuma geldiyse) aynı UIWebView'de aynı URL'yi tekrar yükleyin (meydan okuma zaten işlenmişti :). DidReceiveResponse'deki bağlantıyı iptal etmeyi unutmayın, aksi takdirde trafik iki katına çıkar.

+2

Yanıtı daha önce aldıysanız, bağlantıyı iptal etmek trafiğin iki katına çıkmasını nasıl engelliyor? – Travis

1

Eğer Zach Sahil'in cevap yorumlarında tanımladığı belirtileri yaşıyorsanız. auth başarılı olmasa bile, eğer bir kimlik doğrulama gerekliyse, kimlik doğrulaması gerçekten gerekliyse, sayfayı yüklemeye devam etmeyi denediğinden, bu durumun sanki kendiliğindenmiş gibi davranmanız gerekir. shouldStartLoadWithRequest ikinci semptom için

: (nedeniyle web sayfasında gömülü içeriğe) birden çok kez ateşler ve sadece yüklenen ve bütün web sayfası, bunu o son şey gösterecektir: içinde

shouldStartLoadWithRequest: yöntem, üst

if(webview.loading){ //if url requests come through while its loading, its probably embedded content 
    return YES; 
} 

düzenlemek için bu ekleyin: sonra sayfa tamamen yükler ve yükleri daha gömülü içerik sonrasında tek durum ive bugüne kadar

görülüyor ki facebook ile bozulursa bu yukarıdaki yöntem sorunları vardır

Bu, web sitesi yüklenmeye çalışırken URL'leri yayınlayacaktır. ilk istek sonrası her URL'nin içerik gömülü olduğunu kabul etmenin güvenli olup olmadığından emin değilim, ama benim amaçlarım için işe yaradı gibi görünüyor, belki de sizin için de olacak. Ayrıca

,

connection:canAuthenticateAgainstProtectionSpace: 
connection:didReciveAuthenticationChallenge: 
connection:didCancelAuthenticationChallenge: 

BULUNMADI edilir

- (void) connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 

çünkü kullanın ve benim için, sen de kimlik bilgilerinizi sağlayabilir

4

onlara kullanan https web siteleri ile kimlik doğrulaması olamazdı url. Sadece 'http: //' ve 'page url' arasında kullanıcı adı ve şifre ekleyin.

NSString *urlString = @"http://username:[email protected]/home"; 
[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]]; 
+0

Bu güvenlik ne kadar güvenli? –

+1

Aynı ağdaki bir kişi, isteği net olarak görebiliyordu. => SSL sertifikalı https kullanma bu sorunu çözecektir. Bunu Wireshark gibi bir sniffer ile kontrol edebilirsiniz. –

0

aşağıdaki bölmesini kullanarak başka bir yanıt önermek istiyorum: https://github.com/jivesoftware/JiveAuthenticatingHTTPProtocol

Bu parola sormak için bir UIAlertView nasıl kullanılacağını gösteren bir örnek içerir ve kolayca geri dönmek için adapte edilebilir Örneğin yerel bir DB'den kaydedilmiş bir şifre.

Sorumluluk reddi: Jive'ye hiçbir şekilde bağlı kalamam ya da hiç bulunmadım, bu sadece günler boyunca mücadele ettikten sonra bana yardımcı olan bir araç önerisi.

İlgili konular