Restful起源及設計理念

API:

就是一些預先定義好的函數,目的是能夠讓應用程序或開發人員能具有訪問網絡資源的能力,而又無需關心訪問的源碼,或是裂解內部工作機制的細節。

Restful API規範

1、協議

renst api 與用戶的通信協議,總是使用HHTTP協議

2、域名

應該儘量將api部署在專用的域名之下
https://api.example.com

如果確定API很簡單,不會有進一步擴展,可以考慮放在主域名下。
https://example.com/api/

3、版本

應該將API的版本號放入URL
https://api.example.com/version/

另一種做法是將版本號放在HTTP頭信息中但不如放在URL方便和直觀

4、路徑

路徑又稱重點,表示API的具體網址。

在RESTful架構中每個網址代表一種資源,所以網址中不能有動詞,只能由名詞,而且所用的名詞往往與數據庫的表明對應。一般來說,數據庫中的表都是同種記錄的“集合”,所以API中的名詞也應該是複數。

example:
有一個API提供動物園(zoo)的信息,還包括各種動物和僱員信息,則它的路徑應該設計成下面這樣。
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

5、HTTP動詞

post(create) delete(delete) put(update) get(select)

6、過濾信息

如果記錄數量很多,APi應該提供參數,過濾返回結果。
?limit=10:指定返回記錄的數量
?offset=10:指定返回記錄的開始位置
?page=2&per_page=100:指定第幾頁,以及每頁的記錄數
?sortby=name&order=asc:指定返回結果按照那個屬性排序,以及排序順序
?animal_type_id=1:指定篩選條件

7、狀態碼

200
201

204

401

403

404

406

8、錯誤處理

{
error:“Invalid API key”
}

HTTP協議:

http的重要性:
web service Http+xml
rest大型架構 http+json/xml
各種api
採集、挖礦
Ajax

rest是Http驅動的,別切完全發揮HTTP的能力

HTTP是什麼:
一種web常見應用層的網絡協議,全程爲:超文本傳輸協議
作爲協議:http僅僅是將通信過程規範化,可客戶端與服務端能夠更好的理解對方想要表達的內容
HTTP是基於TCP傳輸層實現的,默認的TCP端口號:80

HTTP的特點
1、無狀態
2、多次HTTP請求
3、基於TCP協議

HTTP的組成:
HTTP協議分成請求和響應兩個部分,請求是指客戶端向服務器發送的消息,響應是指服務器收到消息後向客戶端返回的消息

URI(統一資源標識符)
http://user:[email protected]:8080/p/a/t/h?query=string#hash

http 協議名稱
user 用戶名(可選)
pass 對應密碼(可選)
host.com 主機域名地址(也可以是IP地址)
8080 端口號 默認 80
/p/a/t/h 資源路徑
query=string 參數傳遞
hash 錨點

HTTP請求與響應
請求:
1、請求行
2、請求頭信息
3、請求主體信息
2和3之間要有一個空行

請求格式
請求行 (方法 路徑 協議)
請求頭信息 (格式爲key=value)
空行
請求主體(可選)(發送的內容)

例子:
POST /index.php http/1.1
host: localhost
content-type:application/x-www-form-urlencoded
content-length:25

name=zhangsan

響應行 (協議 狀態碼 狀態文字)
響應頭信息(格式爲key=value)
空行
主體信息 (發送的內容/none)

RESTful(Representational State Transfer)

百度百科:

RESTFUL是一種網絡應用程序的設計風格和開發方式,基於HTTP,可以使用XML格式定義或JSON格式定義。RESTFUL適用於移動互聯網廠商作爲業務使能接口的場景,實現第三方OTT調用移動網絡資源的功能,動作類型爲新增、變更、刪除所調用資源。

RESTful架構是對MVC架構改進後所形成的一種架構,通過使用事先定義好的接口與不同的服務聯繫起來。在RESTful架構中,瀏覽器使用POST,DELETE,PUT和GET四種請求方式分別對指定的URL資源進行增刪改查操作。因此,RESTful是通過URI實現對資源的管理及訪問,具有擴展性強、結構清晰的特點。

RESTful架構將服務器分成前端服務器和後端服務器兩部分,前端服務器爲用戶提供無模型的視圖;後端服務器爲前端服務器提供接口。瀏覽器向前端服務器請求視圖,通過視圖中包含的AJAX函數發起接口請求獲取模型。

項目開發引入RESTful架構,利於團隊並行開發。在RESTful架構中,將多數HTTP請求轉移到前端服務器上,降低服務器的負荷,使視圖獲取後端模型失敗也能呈現。但RESTful架構卻不適用於所有的項目,當項目比較小時無需使用RESTful架構,項目變得更加複雜。

1、資源與URI和URL

a、資源,resources,網絡上的具體信息
b、URI:uniform resource identifiter 統一資源標識符,用來唯一的標識一個資源
c、URL:uniform resource locator,統一資源定位器,用來定位某個特定資源

2、表現層,representation

表現層:資源呈現出來的形式
a、純文本
b、html
c、json

3、狀態轉移,state transfer

a、HTTP協議是一個無狀態的協議
b、GET、POST、PUT、DELETE

REST架構設計6原則

a、Uniform Interface
b、Statelss
c、Cacheble
d、Client-Server
e、Layered System
f、Code on Demand

OAuth2.0的原理介紹-概述

參考:http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

  • OAuth(開放授權)是一個正式的互聯網標準協議
  • 允許第三方網站在用戶授權的前提下,訪問用戶在服務商哪裏存儲的各種信息。而這種授權無需將用戶提供用戶名和密碼提供給該第三方網站
  • OAuth允許用戶提供一個令牌給第三方網站,一個令牌對應一個特定的第三方網站,同時該令牌只能在特定的事件內訪問特定的資源 ![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191017111110877.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDgwNjQzOA==,size_16,color_FFFFFF,t_70)
  • A. 客戶端從資源擁有者那請求授權。授權請求可以直接發給資源擁有者,或間接的通過授權服務器這種中
    介,後者更可取。
    B. 客戶端收到一個授權許可,代表資源服務器提供的授權。(獲取授權碼)
    C. 客戶端使用它自己的私有證書及授權許可到授權服務器驗證。
    D. 如果驗證成功,則下發一個訪問令牌。(獲取access_token訪問令牌)
    E. 客戶端使用訪問令牌向資源服務器請求受保護資源。
    F. 資源服務器會驗證訪問令牌的有效性,如果成功則下發受保護資源。(獲取訪問的受保護資源)

    OAuth幾種授權模式

  • 授權碼模式----功能最完整、流程最嚴密的授權模式
  • 簡化模式-------不通過第三飯應用程序的服務器,直接在瀏覽器中向認證服務器申請令牌,跳過了”授權碼“這個步驟
  • 密碼模式-------需要用戶向客戶端提供自己的用戶名和密碼
  • 客戶端模式---客戶端以自己的名義,而不是以用戶的名義,向服務器提供商進行認證
  • 授權碼模式:
    在這裏插入圖片描述
    它的步驟如下:
    (A)用戶訪問客戶端,後者將前者導向認證服務器。
    (B)用戶選擇是否給予客戶端授權。
    (C)假設用戶給予授權,認證服務器將用戶導向客戶端事先指定的"重定向URI"(redirection URI),同時附上一個授權碼。
    (D)客戶端收到授權碼,附上早先的"重定向URI",向認證服務器申請令牌。這一步是在客戶端的後臺的服務器上完成的,對用戶不可見。
    (E)認證服務器覈對了授權碼和重定向URI,確認無誤後,向客戶端發送訪問令牌(access token)和更新令牌(refresh token)。

    下面是上面這些步驟所需要的參數。

    A步驟中,客戶端申請認證的URI,包含以下參數:

    response_type:表示授權類型,必選項,此處的值固定爲"code"
    client_id:表示客戶端的ID,必選項
    redirect_uri:表示重定向URI,可選項
    scope:表示申請的權限範圍,可選項
    state:表示客戶端的當前狀態,可以指定任意值,可選項.認證服務器會原封不動地返回這個值。(如果是你自己實現的oauth2.0服務端,可以不校驗這個參數,client端就可以不管這個參數)

    C步驟中,服務器迴應客戶端的URI,包含以下參數:

    code:表示授權碼,必選項。該碼的有效期應該很短,通常設爲10分鐘,客戶端只能使用該碼一次,否則會被授權服務器拒絕。該碼與客戶端ID和重定向URI,是一一對應關係。
    state:如果客戶端的請求中包含這個參數,認證服務器的迴應也必須一模一樣包含這個參數。

    D步驟中,客戶端向認證服務器申請令牌的HTTP請求,包含以下參數:

    grant_type:表示使用的授權模式,必選項,此處的值固定爲"authorization_code"。
    code:表示上一步獲得的授權碼,必選項。
    redirect_uri:表示重定向URI,必選項,且必須與A步驟中的該參數值保持一致。
    client_id:表示客戶端ID,必選項。
    client_secret:客戶端密鑰

    E步驟中,認證服務器發送的HTTP回覆,包含以下參數:

    access_token:表示訪問令牌,必選項。
    token_type:表示令牌類型,該值大小寫不敏感,必選項,可以是bearer類型或mac類型。
    expires_in:表示過期時間,單位爲秒。如果省略該參數,必須其他方式設置過期時間。
    refresh_token:表示更新令牌,用來獲取下一次的訪問令牌,可選項。
    scope:表示權限範圍,如果與客戶端申請的範圍一致,此項可省略。

    token的設計及加密方法

  • 無需覈對用戶名密碼的Token驗證機制------無法被僞造的Token
  • hmac(哈希運算消息認證碼)簡介
  • Token的基本設計原則:

  • Token不攜帶用戶敏感信息
  • 無需查詢數據庫,Token可以進行自我驗證
  • hamac簡介:
    作用:

  • 驗證消息是否被篡改 公式:
  • HMAC(K,M) = H (K⊕opad | H (K⊕ipad | M)) 使用python的hmac模塊直接計算 hmac.new("secret123456",value).digest()
  • 缺陷: 無法抵禦重放攻擊
  • 驗證Token的有效性:

  • 驗證驗證碼是否一致
  • 驗證碼是否過期
  • 驗證這個Token是否屬於被請求數據的用戶
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章