iOS開發(fā)ASIHTTPRequest身份驗證
本文為大家介紹了iOS開發(fā)ASIHTTPRequest身份驗證的內(nèi)容,其中包括為URL指定要使用的用戶名和密碼,為request指定要使用的用戶名和密碼,將憑據(jù)存儲到keychain,將憑據(jù)存儲到session中,NTLM授權(quán),使用代理來提供憑據(jù),使用內(nèi)建的授權(quán)對話框(目前只對iOS有效),在服務(wù)器請求憑據(jù)前向服務(wù)器發(fā)送憑據(jù)等等內(nèi)容。
ASIHTTPRequest是簡單易用的,它封裝了CFNetwork API。使得與Web服務(wù)器通信變得更簡單。它是用Objective-C編寫的,可以在MAC OS X和iPhone應用中使用。
你可以查閱下圖ASIHTTPRequest授權(quán)流程圖來了解ASIHTTPRequest如何找到授權(quán)憑據(jù),并將授權(quán)憑據(jù)應用到request上。
為URL指定要使用的用戶名和密碼
- NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
為request指定要使用的用戶名和密碼
- NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setUsername:@"username"];
- [request setPassword:@"password"];
將憑據(jù)存儲到keychain
如果打開了keychainPersistence,所有提供的可用的用戶名和密碼將被存儲到keychain中,以后的request將會重用這些用戶名密碼,即使你關(guān)閉程序后重新打開也不影響。
- NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setUseKeychainPersistence:YES];
- [request setUsername:@"username"];
- [request setPassword:@"password"];
如果你使用keychain但是想要自己管理它,你可以在ASIHTTPRequest.h文件里找到相關(guān)的類方法。
將憑據(jù)存儲到session中
如果打開了useSessionPersistence(默認即是如此),ASIHTTPRequest會把憑據(jù)存儲到內(nèi)存中,后來的request將會重用這些憑據(jù)。
- NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setUsername:@"username"];
- [request setPassword:@"password"];
- [request setUseSessionPersistence:YES]; //這一項是默認的,所以并不必要
- //將會重用我們的 username 和 password
- request = [ASIHTTPRequest requestWithURL:url];
NTLM授權(quán)
要使用NTLM授權(quán)的Windows服務(wù)器,你還需要指定你要進行授權(quán)域。
- NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setUsername:@"username"];
- [request setPassword:@"password"];
- [request setDomain:@"my-domain"];
使用代理來提供憑據(jù)
你不一定非要提前指定授權(quán)憑據(jù),你還可以讓每個request在無法從session或keychain中找到憑據(jù)時向它們的代理請求憑據(jù)。如果你要連接到一個你并不清楚授權(quán)類型的服務(wù)器時,這是很有用的。
你的delegate必須實現(xiàn)authenticationNeededForRequest:方法,當request等待憑據(jù)時,ASIHTTPRequest將會暫停這個request。如果你持有你需要的憑據(jù),那么先為request設(shè)定憑據(jù),然后調(diào)用[request retryUsingSuppliedCredentials]即可。如果你想取消授權(quán),調(diào)用[request cancelAuthentication],此時,這個request也會被取消。
從1.0.8版開始,一次只能有一個request的delegate收到authenticationNeededForRequest: 或者 proxyAuthenticationNeededForRequest:。當delegate處理第一個request時,其他需要授權(quán)的request將會被暫停。如果提供了一個憑據(jù),當前進程中所有其他的request將會假定這個憑據(jù)對這個URL有效,并嘗試重用這個憑據(jù)。如果delegate取消了授權(quán),并且隊列的shouldCancelAllRequestsOnFailure值為YES,所有其他的request都將被取消(它們也不會嘗試請求憑據(jù))。
當進行同步請求時,你不可以使用代理模式來授權(quán)。
在較老的版本中,這么做會導致程序假死,從1.0.8開始,即使你這么做了,代理函數(shù)也不會被調(diào)用。
使用內(nèi)建的授權(quán)對話框(目前只對iOS有效)
這個特性歸功于1.0.8版本的新類ASIAuthenticationDialog 。這個特性主要是用于授權(quán)代理(后面會介紹到),但是它也可以用來向用戶取得授權(quán)憑據(jù)。
為了更好的用戶體驗,大多數(shù)(連接單一服務(wù)的)app必須為request的delegate實現(xiàn)authenticationNeededForRequest:方法,或者避免同時使用代理式授權(quán)。
most apps that connect to a single service should implement authenticationNeededForRequest: in their request delegates, or avoid the use of delegation-style authentication altogether.
但是,會有一些情況下,為普通的授權(quán)使用ASIHTTPRequest的標準授權(quán)對話框更好:
- 你不想創(chuàng)建你自己的登錄表單
- 你可能需要從外部資源獲取數(shù)據(jù),但是你不清楚你需不需要進行授權(quán)
對于這些情況,為request設(shè)置shouldPresentAuthenticationDialog為YES,此時,如果你的代理沒有實現(xiàn)
authenticationNeededForRequest:方法,那么用戶將會看到這個對話框。
一次同時只有一個對話框可以顯示出來,所以當一個對話框顯示時,所有其他需要授權(quán)的request將會暫停。如果提供了一個憑據(jù),當前進程中所有其他的request將會假定這個憑據(jù)對這個URL有效,并嘗試重用這個憑據(jù)。如果delegate取消了授權(quán),并且隊列的shouldCancelAllRequestsOnFailure值為YES,所有其他的request都將被取消(它們也不會嘗試請求憑據(jù))。
對于同步請求的request,授權(quán)對話框不會顯示出來。
這個對話框部分模仿了iPhone上Safari使用的授權(quán)對話框,它包含以下內(nèi)容:
- 一段信息來說明這些憑據(jù)是用于websever(而非一個proxy)
- 你將要連接到服務(wù)器的主機名或者IP
- 授權(quán)域(如果提供的話)
- 填寫用戶名和密碼的區(qū)域
- 當連接到NTLM授權(quán)模式的服務(wù)器時,還會包含一個填寫domain的區(qū)域
- 一個說明信息,指明憑據(jù)是否將會被以明文方式發(fā)送(例如:“只有當使用基于非SSL的基本授權(quán)模式時才會以明文方式發(fā)送”)
如果你想改變它的外觀,你必須繼承ASIHTTPRequest,并重寫showAuthenticationDialog來顯示你自己的對話框或ASIAuthenticationDialog子類。
在服務(wù)器請求憑據(jù)前向服務(wù)器發(fā)送憑據(jù)
IMPORTANT
從1.8.1開始,使用基本授權(quán)模式的request時,這個特性的行為改變了。你可能需要修改你的代碼。
在第一次生成request時,ASIHTTPRequest可以先向服務(wù)器發(fā)送憑據(jù)(如果有的話),而不是等服務(wù)器要求提供憑據(jù)時才提供憑據(jù)。這個特性可以提高使用授權(quán)的程序的執(zhí)行效率,因為這個特性避免了多余的request。
對于基本授權(quán)模式,要觸發(fā)這個行為,你必須手動設(shè)置request的authenticationScheme為kCFHTTPAuthenticationSchemeBasic:
- [request setAuthenticationScheme:(NSString *)kCFHTTPAuthenticationSchemeBasic];
對于其他授權(quán)方案,憑據(jù)也可以在服務(wù)器要求之前被發(fā)送,但是僅當有另一個request成功授權(quán)之后才行。
在以下情況下,你也許想要禁用這個特性:
- 你的程序可能會一次使用一系列憑據(jù)來與服務(wù)器對話
- 安全性對于你的程序來說非常重要。使用這個特性是相對不安全的,因為你不能在憑據(jù)被發(fā)送前驗證你是否連接到了正確的服務(wù)器。
要禁用這個特性,這樣做:
- [request setShouldPresentCredentialsBeforeChallenge:NO];