出現(xiàn)HTTP: 401 的時候的解析思路

說在前面的話:

最近工作確實比較忙了一些, 畢竟是年初,很多事情都需要重新布置, 一年之計在于春嘛;
這幾天,新來了一些小伙伴, 在他們接下來的一些工作中, 也發(fā)現(xiàn)了一些比較有意思的bug, 有些bug確屬不應該,不過也有些bug比較有意思, 有時間了,我會慢慢的整理一些發(fā)上來和大家分享, 今天先分享一個: HTTP: 401

介紹: 什么是HTTP: 401

時常做應用開發(fā)的伙伴們,估計大家對這個數(shù)字并不陌生, 畢竟只要你的應用需要申請服務器數(shù)據(jù), 那么難免會遇到它, 當然我的新來的這批小伙伴們也比較幸運的遇到了它, 嗯, 確實比較幸運, 因為bug出現(xiàn),就是學習和進步的時候到了!
所以,我也就花了一些空余時間來為大家整理了一下;

常見的HTTP:401錯誤碼:

401.1 - Logon failed. -登陸失敗
401.2 - Logon failed due to server configuration.-基于服務器配置的登陸失敗
401.3 - Unauthorized due to ACL on resource.-資源訪問控制列表返回未授權
401.4 - Authorization failed by filter.-服務器filter返回未授權
401.5 - Authorization failed by ISAPI/CGI application.-服務器ISAPI/CGI返回未授權

對于401,我們可以用一句話描述它:那就是 HTTP 401 錯誤 - 未授權: (Unauthorized) [絕大多數(shù)情況下]

簡單的來說: 就是你的Web服務器認為戏羽,客戶端發(fā)送的 HTTP 數(shù)據(jù)流是正確的蜡歹,但進入網(wǎng)址 (URL) 資源 沪停, 需要用戶身份驗證 遮斥, 而相關信息 尚未被提供, 或 已提供但沒有通過授權測試录择。
這就是通常所知的“ HTTP 基本驗證 ”勺阐。
而需客戶端提供的驗證請求在 HTTP 協(xié)議中被定義為 WWW – 驗證標頭字段 (WWW-Authenticate header field) 绊谭。

那這個401錯誤碼 什么時候會產(chǎn)生呢?

HTTP 循環(huán)中的 401錯誤

任何客戶端 ( 比如瀏覽器,比如APP等等 ) 翻擒,都需要通過以下循環(huán)去向服務器請求數(shù)據(jù):

1.首先從你的站點的 IP 名稱 ( 即您站點的網(wǎng)址-URL, 不帶起始的 ‘http://') 獲得一個 IP 地址氓涣。這是由DNS來解析的;
2.接著, 打開一個 IP 套接字 (socket) 連接到該 IP 地址。
3.通過該套接字寫 HTTP 數(shù)據(jù)流陋气。
4.從您的Web服務器接受響應的 HTTP 數(shù)據(jù)流劳吠。該數(shù)據(jù)流包括狀態(tài)編碼, 其值取決于 HTTP 協(xié)議 巩趁。 解析該數(shù)據(jù)流得到 狀態(tài)編碼和其他有用信息痒玩。

而401錯誤在容易在以上所述的最后一步產(chǎn)生,即當客戶端收到 HTTP 狀態(tài)編碼并識別其為 ‘401‘ 時

例如我這里做了一個測試: 大家看代碼 ,(由于請求網(wǎng)絡服務器比較不好操作,所以,這個測試我用了自己電腦搭建的本地服務器;)
首先我給自己電腦的本地服務器(webDav)發(fā)送一個put請求, 準備上傳一張圖片到webDav服務器

NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/uploads/123.jpg"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    
request.HTTPMethod =@"put";

然后獲取一張本地的圖片,

 //本地文件    
NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"head2.png"withExtension:nil];  
[[[NSURLSession sharedSession] uploadTaskWithRequest:request fromFile:
   fileUrl completionHandler:^(NSData *_Nullabledata, NSURLResponse *_Nullableresponse, NSError *_Nullableerror) {
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];    
}] resume];

接著開始執(zhí)行:

這里就會出現(xiàn)問題:
輸出結果:

輸出結果

通過輸出結果,可以明顯的看得到 服務器返回的是401, 因為我們沒有授權, 那么怎樣授權呢?

解決 401 錯誤 – 情景一 : 有防御性的安全策略

通常情況下
每個Web服務器都有自己的方式管理用戶驗證咖摹。通常由該網(wǎng)站的網(wǎng)絡安全員(例如严拒,系統(tǒng)管理員)決定哪些用戶被允許訪問該網(wǎng)址逆粹。 該人員使用 Web 服務器軟件來建立這些用戶的用戶名及其密碼。 因此草讶, 如果您需要訪問某個網(wǎng)址(或您忘記了自己的用戶名和密碼), 只有該網(wǎng)站的網(wǎng)絡安全員可以幫助您炉菲。任何安全問題需直接提交給他們堕战。

如果你認為該網(wǎng)站上的網(wǎng)頁 應該 是對任何互聯(lián)網(wǎng)用戶開放的, 那么 401 信息就表明了一個更深層問題拍霜。 首先嘱丢,您可以通過一個瀏覽器檢查您的網(wǎng)址。 該瀏覽器應該運行在一臺您以前從未使用過祠饺, 也不包含任何有關您的信息的計算機上越驻, 同時, 您還應避免使用您以前用過的身份驗證(密碼等)。 理想情況是伐谈, 這一切應該通過一個完全不同于任何您用過的互聯(lián)網(wǎng)連接(例如由不同的互聯(lián)網(wǎng)服務供應商- ISP 提供的撥號連接)烂完。 簡而言之,您要模擬一個完全陌生的人通過網(wǎng)上沖浪訪問您的網(wǎng)頁的情況诵棵。

如果這種通過瀏覽器的檢查表明沒有授權問題抠蚣,則可能是您的 Web 服務器 ( 或周邊系統(tǒng) ) 被設置為不允許某種 HTTP 傳輸模式。 換句話說就是履澳, 來自一個知名瀏覽器的 HTTP 通訊是允許的嘶窄, 但來自其他系統(tǒng)的自動通訊則被拒絕, 并生成 401 錯誤代碼距贷。這是一種異常情況柄冲, 但是也許表明您的 Web 服務器周圍 采取了非常具有防御性的安全策略。

比如: iOS9.0之后,就統(tǒng)一規(guī)定,對于http請求,只有經(jīng)過蘋果認可的證書且是https:// 的,才可以直接通過訪問,如果還是http:// 或者,不是蘋果認可的證書的https,都是不可以直接訪問的, 所以,通常情況下,解決這類問題,我們會事先在info.plist文件中做一些配置, 也就是我們常說的ATS配置: 我們可以把下面這幾行配置添加到info.plist文件中, 首先用源代碼方式打開info.plist文件, 然后拷貝下面的幾行代碼: 如下:

  <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

解決 401 錯誤 – 情景二: 密碼,賬戶名錯誤

情景二: 需要提供密碼和賬號
當服務器需要驗證您的帳戶時忠蝗,您可以有選擇性地提供兩項信息

  1. 網(wǎng)站用戶名,
  2. 網(wǎng)站密碼现横。
    當然只有當您的站點使用 HTTP 基本驗證時您才應該提供這些信息。 如果您不提供這些信息阁最,服務器是通不過的,您也會得到 401 錯誤戒祠。

就如最上面的put請求的代碼, 在服務器端,其實我是設定了需要密碼和賬號才能通過的,
所以,這種情況下,我們就需要提供賬號和密碼給服務器了,
當然,實際開發(fā)中,密碼和賬號是需要嚴格加密的,都是需要和服務器人員溝通一套非常保密的加密的方法的, 整個過程是比較復雜的,
不過由于我這里只是做一個演示, 那么就不需要特別復雜了, 就簡單一點,說明一個思路即可:
這里,我就手動來拼接一個賬號和密碼, 密碼加密就用最簡單的base64編碼;

假設我們的賬號是admin,密碼也是123456, 那么我們怎樣來設定密碼呢?
首先我們需要定義方法,來拼接密碼,并轉化為base64編碼;

//定義一個方法: 獲取授權的字符串
- (NSString *)getAuth:(NSString *)name pwd:(NSString *)pwd {
    //拼字符串  admin:123456
    NSString *tmpStr = [NSString stringWithFormat:@"%@:%@",name,pwd];
    //base64編碼
    tmpStr = [self base64Encode:tmpStr];

    return [NSString stringWithFormat:@"Basic %@",tmpStr];
}

//base64編碼
- (NSString *)base64Encode:(NSString *)str  {
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    return [data base64EncodedStringWithOptions:0];
}

然后我們在發(fā)送put請求的時候, 就同時提供授權

//上傳文件
- (void)uploadTask {
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/uploads/123.jpg"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"put";
    //設置賬號和密碼
    //Authorization: Basic YWRtaW46MTIzNDU2
    // admin:123456
    [request setValue:[self getAuth:@"admin" pwd:@"123456"] forHTTPHeaderField:@"Authorization"];
    
    //本地文件
    NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"head2.png" withExtension:nil];  
    [[[NSURLSession sharedSession] uploadTaskWithRequest:request fromFile:fileUrl completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        
        NSLog(@"--%@",str);
        
    }] resume];
}

執(zhí)行結果:

執(zhí)行結果:

通過結果,我們可以看出, 已經(jīng)上傳成功了, 也就是說,我們順利的解決了401問題,

總結解決bug的思路:

如果遇到401問題, 我們解決的思路,可以這樣來考慮:

  1. 優(yōu)先考慮是否是需要驗證,也就是是否需要授權賬號和密碼信息;
  2. 如果是開放的服務器資源, 需要考慮的是是否有防御性的安全策略;

一般情況下,都屬于這兩種原因,

以上屬于我整理的,如有不足之處,望大家斧正! 感謝!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市速种,隨后出現(xiàn)的幾起案子姜盈,更是在濱河造成了極大的恐慌,老刑警劉巖配阵,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馏颂,死亡現(xiàn)場離奇詭異,居然都是意外死亡棋傍,警方通過查閱死者的電腦和手機救拉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舍沙,“玉大人近上,你說我怎么就攤上這事》髡。” “怎么了壹无?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長感帅。 經(jīng)常有香客問我斗锭,道長,這世上最難降的妖魔是什么失球? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任岖是,我火速辦了婚禮帮毁,結果婚禮上,老公的妹妹穿的比我還像新娘豺撑。我一直安慰自己烈疚,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布聪轿。 她就那樣靜靜地躺著爷肝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陆错。 梳的紋絲不亂的頭發(fā)上灯抛,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音音瓷,去河邊找鬼对嚼。 笑死,一個胖子當著我的面吹牛绳慎,可吹牛的內容都是我干的纵竖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼杏愤,長吁一口氣:“原來是場噩夢啊……” “哼磨确!你這毒婦竟也來了?” 一聲冷哼從身側響起声邦,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摆舟,沒想到半個月后亥曹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡恨诱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年媳瞪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片照宝。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛇受,死狀恐怖,靈堂內的尸體忽然破棺而出厕鹃,到底是詐尸還是另有隱情兢仰,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布剂碴,位于F島的核電站把将,受9級特大地震影響,放射性物質發(fā)生泄漏忆矛。R本人自食惡果不足惜察蹲,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洽议,春花似錦宗收、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至儿捧,卻和暖如春荚坞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菲盾。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工颓影, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懒鉴。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓诡挂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親临谱。 傳聞我的和親對象是個殘疾皇子璃俗,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容

  • 一、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,348評論 6 152
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理悉默,服務發(fā)現(xiàn)城豁,斷路器,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • Http協(xié)議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)抄课,內容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,222評論 3 82
  • 前言:最近發(fā)現(xiàn)自己在網(wǎng)絡相關這一塊基礎很是欠缺唱星,所以準備花時間了解一下,本文主要是講http協(xié)議的一些基礎跟磨,和一些...
    justCode_閱讀 2,094評論 0 23
  • 工作流程 一次HTTP操作稱為一個事務间聊,其工作過程可分為四步: 1)首先客戶機與服務器需要建立連接。只要單擊某個超...
    保川閱讀 4,600評論 2 14