http authorization 基本認證

風靈使發表於2018-11-14

http協議是無狀態的, 瀏覽器和web伺服器之間可以通過cookie來身份識別。 桌面應用程式(比如新浪桌面客戶端, skydrive客戶端)跟Web伺服器之間是如何身份識別呢?

什麼是HTTP基本認證

桌面應用程式也通過HTTP協議跟Web伺服器互動, 桌面應用程式一般不會使用cookie, 而是把 "使用者名稱+冒號+密碼"用BASE64演算法加密後的字串放在http request 中的header Authorization中傳送給服務端, 這種方式叫HTTP基本認證(Basic Authentication)

當瀏覽器訪問使用基本認證的網站的時候, 瀏覽器會提示你輸入使用者名稱和密碼,如下圖
在這裡插入圖片描述

假如使用者名稱密碼錯誤的話, 伺服器會返回401 如下圖
在這裡插入圖片描述

HTTP基本認證的過程

第一步: 客戶端傳送http request 給伺服器,

第二步: 因為request中沒有包含Authorization header, 伺服器會返回一個401 Unauthozied給客戶端,並且在Responseheader "WWW-Authenticate" 中新增資訊。

第三步:客戶端把使用者名稱和密碼用BASE64加密後,放在Authorization header中傳送給伺服器, 認證成功。

第四步:伺服器將Authorization header中的使用者名稱密碼取出,進行驗證, 如果驗證通過,將根據請求,傳送資源給客戶端

使用Fiddler Inspectors 下的Auth 選項卡,可以很方便的看到使用者名稱和密碼:

HTTP基本認證的優點

HTTP基本認證,簡單明瞭。Rest API 就是經常使用基本認證的。

每次都要進行認證

http協議是無狀態的, 同一個客戶端對 伺服器的每個請求都要求認證。

HTTP基本認證和HTTPS

把 “使用者名稱+冒號+密碼” 用BASE64加密後的string雖然用肉眼看不出來, 但用程式很容易解密,上圖可以看到Fiddler就直接給解密了。 所以這樣的http request在網路上,如果用HTTP傳輸是很不安全的。 一般都是會用HTTPS傳輸,HTTPS是加密的,所以比較安全。

HTTP OAuth認證

OAuth對於Http來說,就是放在Authorization header中的不是使用者名稱密碼, 而是一個token。
微軟的Skydrive 就是使用這樣的方式, 如下圖:

其他認證

除了基本認證(Basic Authentication), 還有摘要認證digest authentication, WSSE(WS-Security)認證

客戶端的使用

客戶端如果要跟“使用基本認證的網站”互動。 非常很簡單,把使用者名稱密碼加在Authorization header中就可以了。

string url = "https://testsite";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
NetworkCredential nc = new NetworkCredential("username", "password");
req.Credentials = nc;

Linux下的curl

curl -u username:password https://testsite/

//js的用法

//把登入的資訊放在這個裡面
$.cookie(kp.key_c_uid, 1, {expires: 1});
$.cookie(kp.key_c_auth, "Basic " + btoa(1+":"+"oyH1Vwk4vPXgub6UkxAr3wvmfD18"));

//調介面的時候在方法前設定header資訊
beforeSend: function (xhr) {
    if (authorization) {
        xhr.setRequestHeader("Authorization", authorization);
    }
},

var authorization = $.cookie(kp.key_c_auth);

相關文章