Authentication

驗證,告訴伺服器登入者是其所聲稱的使用者,以遊戲登入舉例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
+------------------------+        
| 遊戲客戶端啟動 |
+-----------+------------+
|
| 向遊戲伺服器發送認證請求
|
+-----------v------------+
| 遊戲伺服器進行認證 |
+-----------+------------+
|
| 驗證玩家帳號和密碼是否正確、權限(有無鎖帳號)
|
+-----------v------------+
| 確認帳號和密碼正確 |
+-----------+------------+
|
| 允許進入遊戲伺服器
|
+-----------v------------+
| 排隊進入遊戲 |
+------------------------+

Authorization

當玩家通過驗證進入遊戲伺服器後,伺服器會根據玩家的帳戶資料進行授權,假設想要2023的年槍,紫炫流光,就得向伺服器獲得授權,買解碼器、黑市,才能解鎖新武器。

簡單舉例

1
2
購買武器 -> 檢查是否有足夠點數 -> 扣款授權 -> 武器授權 -> 成功購買 

每個玩家客戶端都有全部種類的武器,來自於每次的更新檔,是為了提升遊戲體驗,總不能撿到新槍再下載吧,因此授權只是向伺服器請求,解鎖不能使用的武器。

Https Authentication(Basic)

一種HTTP驗證機制,Base64將用戶名和密碼進行編碼,然後在HTTP請求中以Authorization標頭的形式傳送。簡單來說,當使用者輸入用戶名和密碼時,這些數據將被編碼並包含在HTTP請求中,伺服器收到請求後會解碼這些數據並進行身份驗證。

jigsaw demo

jigsaw.w3.org測試網址

1
2
ac:guest
pw:guest
  • 伺服器檢查在Header裡的Authorization欄位,規格應為 Authorization: Basic <value>
  • 此時因為沒有Authorization並沒有資料,server按照約定會回傳401 status code並在Header上加上 WWW-Authenticate: Basic realm="<value>"
  • client當發現得到以上的回應後,會出現一個給予使用者輸入用戶名稱及密碼的地方
  • client將用戶名稱跟密碼做成base64(username:password)
  • client將資料放到Header: Authorization: base64(username:password)

先生你誰?-身分驗證Authentication (Basic, token, JWT)

把header的authentication取出base64解碼可以看到正好是輸入的帳密

1
base64(username:password)

Digest:

摘要訪問認證是一種協議規定的Web伺服器用來同網頁瀏覽器進行認證信息協商的方法。它在密碼發出前,先對其應用哈希函數,相對於HTTP基本認證發送明文而言,更安全。
https://zh.wikipedia.org/zh-tw/HTTP%E6%91%98%E8%A6%81%E8%AE%A4%E8%AF%81

  • 客戶端向服務器發送請求。
  • 服務器回復401和WWW-Authenticate,nonce(服務器生成的隨機字符串,防止重放攻擊)。
    1
    2
    3
    4
    www-authenticate: 
    Digest realm="test",
    domain="/HTTP/Digest",
    nonce="e67010901fb034b2e0e0c9e0c1f451d8"
  • 客戶端使用用戶名、領域和密碼計算出HA1值,使用請求方式和請求URI計算出HA2值。
  • 客戶端使用HA1、nonce和HA2計算出響應值,加到“Authorization”的header。
    1
    2
    3
    HA1 = MD5(username:realm:password)
    HA2 = MD5(method:digestURI)
    response = MD5(HA1:nonce:HA2)
  • 服務器使用相同的計算方式驗證。如果正確,服務器會返回請求的資源,否則,返回401未授權或其他錯誤狀態碼,客戶端必須重新進行身份驗證。