精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前后端分離開發(fā),HTTP API 認證授權(quán)術(shù)

安全
這個世界還是比較復(fù)雜的,除了用戶訪問,還有用戶委托的第三方的應(yīng)用,還有企業(yè)和企業(yè)間的調(diào)用,這里,我想把業(yè)內(nèi)常用的一些 API認證技術(shù)相對系統(tǒng)地總結(jié)歸納一下,這樣可以讓大家更為全面的了解這些技術(shù)。

 我們知道,HTTP 是無狀態(tài)的,所以,當(dāng)我們需要獲得用戶是否在登錄的狀態(tài)時,我們需要檢查用戶的登錄狀態(tài),一般來說,用戶的登錄成功后,服務(wù)器會發(fā)一個登錄憑證(又被叫作 Token),就像你去訪問某個公司,在前臺被認證過合法后,這個公司的前臺會給你的一個訪客卡一樣,之后,你在這個公司內(nèi)去到哪都用這個訪客卡來開門,而不再校驗?zāi)闶悄囊粋€人。在計算機的世界里,這個登錄憑證的相關(guān)數(shù)據(jù)會放在兩種地方,一個地方在用戶端,以 Cookie 的方式(一般不會放在瀏覽器的 Local Storage,因為這很容易出現(xiàn)登錄憑證被 XSS 攻擊),另一個地方是放在服務(wù)器端,又叫 Session 的方式(SessonID 存于 Cookie)。

[[285595]]

但是,這個世界還是比較復(fù)雜的,除了用戶訪問,還有用戶委托的第三方的應(yīng)用,還有企業(yè)和企業(yè)間的調(diào)用,這里,我想把業(yè)內(nèi)常用的一些 API認證技術(shù)相對系統(tǒng)地總結(jié)歸納一下,這樣可以讓大家更為全面的了解這些技術(shù)。注意,這是一篇長文!

本篇文章會覆蓋如下技術(shù):

  • HTTP Basic
  • Digest Access
  • App Secret Key + HMAC
  • JWT – JSON Web Tokens
  • OAuth 1.0 – 3 legged & 2 legged
  • OAuth 2.0 – Authentication Code & Client Credential

HTTP Basic

HTTP Basic 是一個非常傳統(tǒng)的 API 認證技術(shù),也是一個比較簡單的技術(shù)。這個技術(shù)也就是使用 username 和 password 來進行登錄。整個過程被定義在了 RFC 2617 中,也被描述在了 Wikipedia: Basic Access Authentication 詞條中,同時也可以參看 MDN HTTP Authentication

其技術(shù)原理如下:

  1. 把 username和 password 做成 username:password 的樣子(用冒號分隔)
  2. 進行 Base64 編碼。Base64("username:password") 得到一個字符串(如:把 haoel:coolshell 進行 base64 后可以得到 aGFvZW86Y29vbHNoZWxsCg )
  3. 把 aGFvZW86Y29vbHNoZWxsCg 放到 HTTP 頭中 Authorization 字段中,形成 Authorization: Basic aGFvZW86Y29vbHNoZWxsCg,然后發(fā)送到服務(wù)端。
  4. 服務(wù)端如果沒有在頭里看到認證字段,則返回 401 錯,以及一個個 WWW-Authenticate: Basic Realm='HelloWorld' 之類的頭要求客戶端進行認證。之后如果沒有認證通過,則返回一個 401 錯。如果服務(wù)端認證通過,那么會返回 200。

我們可以看到,使用 Base64 的目的無非就是為了把一些特殊的字符給搞掉,這樣就可以放在 HTTP 協(xié)議里傳輸了。而這種方式的問題最大的問題就是把用戶名和口令放在網(wǎng)絡(luò)上傳,所以,一般要配合 TLS/SSL 的安全加密方式來使用。我們可以看到 JIRA Cloud 的 API 認證支持HTTP Basic 這樣的方式。

但我們還是要知道,這種把用戶名和密碼同時放在公網(wǎng)上傳輸?shù)姆绞接悬c不太好,因為 Base64 不是加密協(xié)議,而是編碼協(xié)議,所以就算是有 HTTPS 作為安全保護,給人的感覺還是不放心。

Digest Access

中文稱“HTTP 摘要認證”,最初被定義在了 RFC 2069 文檔中(后來被 RFC 2617 引入了一系列安全增強的選項;“保護質(zhì)量”(qop)、隨機數(shù)計數(shù)器由客戶端增加、以及客戶生成的隨機數(shù))。

其基本思路是,請求方把用戶名口令和域做一個 MD5 – MD5(username:realm:password) 然后傳給服務(wù)器,這樣就不會在網(wǎng)上傳用戶名和口令了,但是,因為用戶名和口令基本不會變,所以,這個 MD5 的字符串也是比較固定的,因此,這個認證過程在其中加入了兩個事,一個是 nonce 另一個是 qop

  • 首先,調(diào)用方發(fā)起一個普通的 HTTP 請求。比如:GET /coolshell/admin/ HTTP/1.1 服務(wù)端自然不能認證能過,服務(wù)端返回 401 錯誤,并且在 HTTP 頭里的 WWW-Authenticate 包含如下信息:
  1. WWW-Authenticate: Digest realm="testrealm@host.com"
  2.                        qop="auth,auth-int"
  3.                        nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093"
  4.                        opaque="5ccc069c403ebaf9f0171e9517f40e41" 
  • 其中的 nonce 為服務(wù)器端生成的隨機數(shù),然后,客戶端做 HASH1=MD5(MD5(username:realm:password):nonce:cnonce) ,其中的 cnonce 為客戶端生成的隨機數(shù),這樣就可以使得整個 MD5 的結(jié)果是不一樣的。
  • 如果 qop 中包含了 auth ,那么還得做 HASH2=MD5(method:digestURI) 其中的 method 就是HTTP的請求方法(GET/POST…),digestURI 是請求的URL。
  • 如果 qop 中包含了 auth-init ,那么,得做 HASH2=MD5(method:digestURI:MD5(entityBody)) 其中的 entityBody 就是HTTP請求的整個數(shù)據(jù)體。
  • 然后,得到 response = MD5(HASH1:nonce:nonceCount:cnonce:qop:HASH2) 如果沒有 qop 則 response = MD5(HA1:nonce:HA2)
  • 最后,我們的客戶端對服務(wù)端發(fā)起如下請求—— 注意HTTP頭的 Authorization: Digest ...
  1. GET /dir/index.html HTTP/1.0 
  2. Host: localhost 
  3. Authorization: Digest username="Mufasa"
  4.                      realm="testrealm@host.com"
  5.                      nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093"
  6.                      uri="%2Fcoolshell%2Fadmin"
  7.                      qop=auth, 
  8.                      nc=00000001, 
  9.                      cnonce="0a4f113b"
  10.                      response="6629fae49393a05397450978507c4ef1"
  11.                      opaque="5ccc069c403ebaf9f0171e9517f40e41" 

維基百科上的 Wikipedia: Digest access authentication 詞條非常詳細地描述了這個細節(jié)。

摘要認證這個方式會比之前的方式要好一些,因為沒有在網(wǎng)上傳遞用戶的密碼,而只是把密碼的 MD5 傳送過去,相對會比較安全,而且,其并不需要是否 TLS/SSL 的安全鏈接。但是,別看這個算法這么復(fù)雜,最后你可以發(fā)現(xiàn),整個過程其實關(guān)鍵是用戶的 password,這個 password 如果不夠得雜,其實是可以被暴力破解的,而且,整個過程是非常容易受到中間人攻擊——比如一個中間人告訴客戶端需要的 Basic 的認證方式 或是 老舊簽名認證方式(RFC2069)。

App Secret Key + HMAC

先說 HMAC 技術(shù),這個東西來自于 MAC – Message Authentication Code,是一種用于給消息簽名的技術(shù),也就是說,我們怕消息在傳遞的過程中被人修改,所以,我們需要用對消息進行一個 MAC 算法,得到一個摘要字串,然后,接收方得到消息后,進行同樣的計算,然后比較這個 MAC 字符串,如果一致,則表明沒有被修改過(整個過程參看下圖)。而 HMAC – Hash-based Authenticsation Code,指的是利用 Hash 技術(shù)完成這一工作,比如:SHA-256算法。

 

我們再來說 App ID,這個東西跟驗證沒有關(guān)系,只是用來區(qū)分,是誰來調(diào)用 API 的,就像我們每個人的身份證一樣,只是用來標(biāo)注不同的人,不是用來做身份認證的。與前面的不同之處是,這里,我們需要用 App ID 來映射一個用于加密的密鑰,這樣一來,我們就可以在服務(wù)器端進行相關(guān)的管理,我們可以生成若干個密鑰對(AppID, AppSecret),并可以有更細粒度的操作權(quán)限管理。

  1. 把 AppID 和 HMAC 用于 API 認證,目前來說,玩得最好最專業(yè)的應(yīng)該是 AWS 了,我們可以通過 S3 的 API 請求簽名文檔看到 AWS 是怎么玩的。整個過程還是非常復(fù)雜的,可以通過下面的圖片流程看個大概。基本上來說,分成如下幾個步驟:
  2. 把 HTTP 的請求(方法、URI、查詢字串、頭、簽名頭,body)打個包叫 CanonicalRequest,作個 SHA-256 的簽名,然后再做一個 base16 的編碼
  3. 把上面的這個簽名和簽名算法 AWS4-HMAC-SHA256、時間戳、Scop,再打一個包,叫 StringToSign。
  4. 準(zhǔn)備簽名,用 AWSSecretAccessKey 來對日期簽一個 DataKey,再用 DataKey 對要操作的 Region 簽一個 DataRegionKey ,再對相關(guān)的服務(wù)簽一個 DataRegionServiceKey ,最后得到 SigningKey.
  5. 用第三步的 SigningKey 來對第二步的 StringToSign 簽名。

 

最后,發(fā)出 HTTP Request 時,在 HTTP 頭的 Authorization 字段中放入如下的信息:

  1. Authorization: AWS4-HMAC-SHA256 
  2.                Credential=AKIDEXAMPLE/20150830/us-east-1/iam/aws4_request, 
  3.                SignedHeaders=content-type;host;x-amz-date
  4.                Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7 

其中的 AKIDEXAMPLE 是 AWS Access Key ID, 也就是所謂的 AppID,服務(wù)器端會根據(jù)這個 AppID 來查相關(guān)的 Secret Access Key,然后再驗證簽名。如果,你對這個過程有點沒看懂的話,你可以讀一讀這篇文章——《Amazon S3 Rest API with curl》這篇文章里有好些代碼,代碼應(yīng)該是最有細節(jié)也是最準(zhǔn)確的了。

這種認證的方式好處在于,AppID 和 AppSecretKey,是由服務(wù)器的系統(tǒng)開出的,所以,是可以被管理的,AWS 的 IAM 就是相關(guān)的管理,其管理了用戶、權(quán)限和其對應(yīng)的 AppID 和AppSecretKey。但是不好的地方在于,這個東西沒有標(biāo)準(zhǔn) ,所以,各家的實現(xiàn)很不一致。比如:Acquia 的 HMAC,微信的簽名算法 (這里,我們需要說明一下,微信的 API 沒有遵循HTTP 協(xié)議的標(biāo)準(zhǔn),把認證信息放在 HTTP 頭的 Authorization 里,而是放在 body 里)

JWT – JSON Web Tokens

JWT 是一個比較標(biāo)準(zhǔn)的認證解決方案,這個技術(shù)在 Java 圈里應(yīng)該用的是非常普遍的。JWT 簽名也是一種 MAC(Message Authentication Code)的方法。JWT 的簽名流程一般是下面這個樣子:

用戶使用用戶名和口令到認證服務(wù)器上請求認證。

認證服務(wù)器驗證用戶名和口令后,以服務(wù)器端生成 JWT Token,這個 token 的生成過程如下:

  • 認證服務(wù)器還會生成一個 Secret Key(密鑰)
  • 對JWT Header和 JWT Payload 分別求 Base64。在 Payload 可能包括了用戶的抽象 ID 和的過期時間。
  • 用密鑰對 JWT 簽名 HMAC-SHA256(SecertKey, Base64UrlEncode(JWT-Header)+'.'+Base64UrlEncode(JWT-Payload));

然后把 base64(header).base64(payload).signature 作為 JWT token 返回客戶端。

客戶端使用 JWT Token 向應(yīng)用服務(wù)器發(fā)送相關(guān)的請求。這個 JWT Token 就像一個臨時用戶權(quán)證一樣。

當(dāng)應(yīng)用服務(wù)器收到請求后:

  1. 應(yīng)用服務(wù)會檢查 JWT Token,確認簽名是正確的。
  2. 然而,因為只有認證服務(wù)器有這個用戶的 Secret Key(密鑰),所以,應(yīng)用服務(wù)器得把 JWT Token 傳給認證服務(wù)器。
  3. 認證服務(wù)器通過 JWT Payload 解出用戶的抽象 ID,然后通過抽象 ID 查到登錄時生成的 Secret Key,然后再來檢查一下簽名。
  4. 認證服務(wù)器檢查通過后,應(yīng)用服務(wù)就可以認為這是合法請求了。

我們可以看以,上面的這個過程,是在認證服務(wù)器上為用戶動態(tài)生成 Secret Key 的,應(yīng)用服務(wù)在驗簽的時候,需要到認證服務(wù)器上去簽,這個過程增加了一些網(wǎng)絡(luò)調(diào)用,所以,JWT 除了支持 HMAC-SHA256 的算法外,還支持 RSA 的非對稱加密的算法。

使用 RSA 非對稱算法,在認證服務(wù)器這邊放一個私鑰,在應(yīng)用服務(wù)器那邊放一個公鑰,認證服務(wù)器使用私鑰加密,應(yīng)用服務(wù)器使用公鑰解密,這樣一來,就不需要應(yīng)用服務(wù)器向認證服務(wù)器請求了,但是,RSA 是一個很慢的算法,所以,雖然你省了網(wǎng)絡(luò)調(diào)用,但是卻費了 CPU,尤其是Header 和 Payload 比較長的時候。所以,一種比較好的玩法是,如果我們把 header 和 payload 簡單地做 SHA256,這會很快,然后,我們用 RSA 加密這個 SHA256 出來的字符串,這樣一來,RSA 算法就比較快了,而我們也做到了使用 RSA 簽名的目的。

最后,我們只需要使用一個機制在認證服務(wù)器和應(yīng)用服務(wù)器之間定期地換一下公鑰私鑰對就好了。

這里強烈建議全文閱讀 Anglar 大學(xué)的 《JSW:The Complete Guide to JSON Web Tokens》

OAuth 1.0

OAuth 也是一個 API 認證的協(xié)議,這個協(xié)議最初在 2006 年由 Twitter 的工程師在開發(fā) OpenID 實現(xiàn)的時候和社交書簽網(wǎng)站 Ma.gnolia 時發(fā)現(xiàn),沒有一種好的委托授權(quán)協(xié)議,后來在 2007 年成立了一個 OAuth 小組,知道這個消息后,Google 員工也加入進來,并完善有善了這個協(xié)議,在 2007 年底發(fā)布草案,過一年后,在 2008 年將 OAuth 放進了 IETF 作進一步的標(biāo)準(zhǔn)化工作,最后在 2010 年 4 月,正式發(fā)布 OAuth 1.0,即:RFC 5849 (這個 RFC 比起 TCP 的那些來說讀起來還是很輕松的),不過,如果你想了解其前身的草案,可以讀一下 OAuth Core 1.0 Revision A ,我在下面做個大概的描述。

根據(jù)RFC 5849,可以看到 OAuth 的出現(xiàn),目的是為了,用戶為了想使用一個第三方的網(wǎng)絡(luò)打印服務(wù)來打印他在某網(wǎng)站上的照片,但是,用戶不想把自己的用戶名和口令交給那個第三方的網(wǎng)絡(luò)打印服務(wù),但又想讓那個第三方的網(wǎng)絡(luò)打印服務(wù)來訪問自己的照片,為了解決這個授權(quán)的問題, OAuth 這個協(xié)議就出來了。

這個協(xié)議有三個角色:

  • User(照片所有者-用戶)
  • Consumer(第三方照片打印服務(wù))
  • Service Provider(照片存儲服務(wù))

這個協(xié)義有三個階段:

  • Consumer 獲取 Request Token
  • Service Provider 認證用戶并授權(quán) Consumer
  • Consumer 獲取 Access Token 調(diào)用 API 訪問用戶的照片

整個授權(quán)過程是這樣的:

  1. Consumer(第三方照片打印服務(wù))需要先上 Service Provider 獲得開發(fā)的 Consumer Key 和 Consumer Secret
  2. 當(dāng) User 訪問 Consumer 時,Consumer 向 Service Provide 發(fā)起請求請求Request Token (需要對HTTP請求簽名)
  3. Service Provide 驗明 Consumer 是注冊過的第三方服務(wù)商后,返回 Request Token(oauth_token)和 Request Token Secret (oauth_token_secret)
  4. Consumer 收到 Request Token 后,使用 HTTP GET 請求把 User 切到 Service Provide 的認證頁上(其中帶上Request Token),讓用戶輸入他的用戶和口令。
  5. Service Provider 認證 User 成功后,跳回 Consumer,并返回 Request Token (oauth_token)和 Verification Code(oauth_verifier)
  6. 接下來就是簽名請求,用 Request Token 和 Verification Code 換取 Access Token (oauth_token)和 Access Token Secret (oauth_token_secret)
  7. 最后使用 Access Token 訪問用戶授權(quán)訪問的資源。

下圖附上一個 Yahoo! 的流程圖可以看到整個過程的相關(guān)細節(jié)。

 

因為上面這個流程有三方:User,Consumer 和 Service Provide,所以,又叫 3-legged flow,三腳流程。OAuth 1.0 也有不需要用戶參與的,只有 Consumer 和 Service Provider 的, 也就是 2-legged flow 兩腳流程,其中省掉了用戶認證的事。整個過程如下所示:

  1. Consumer(第三方照片打印服務(wù))需要先上 Service Provider 獲得開發(fā)的 Consumer Key 和 Consumer Secret
  2. Consumer 向 Service Provide 發(fā)起請求請求 Request Token (需要對 HTTP 請求簽名)
  3. Service Provide 驗明 Consumer 是注冊過的第三方服務(wù)商后,返回 Request Token(oauth_token)和 Request Token Secret (oauth_token_secret)
  4. Consumer 收到 Request Token 后,直接換取 Access Token (oauth_token)和 Access Token Secret (oauth_token_secret)
  5. 最后使用 Access Token 訪問用戶授權(quán)訪問的資源。

最后,再來說一說 OAuth 中的簽名。

  • 我們可以看到,有兩個密鑰,一個是 Consumer 注冊 Service Provider 時由 Provider 頒發(fā)的 Consumer Secret,另一個是 Token Secret。
  • 簽名密鑰就是由這兩具密鑰拼接而成的,其中用 & 作連接符。假設(shè) Consumer Secret 為 j49sk3j29djd 而 Token Secret 為 dh893hdasih9 那個,簽名密鑰為:j49sk3j29djd&dh893hdasih9
  • 在請求 Request/Access Token 的時候需要對整個 HTTP 請求進行簽名(使用 HMAC-SHA1 和 HMAC-RSA1 簽名算法),請求頭中需要包括一些 OAuth 需要的字段,如:
    • Consumer Key :也就是所謂的 AppID
    • Token:Request Token 或 Access Token
    • Signature Method :簽名算法比如:HMAC-SHA1
    • Timestamp:過期時間
    • Nonce:隨機字符串
    • Call Back:回調(diào) URL

下圖是整個簽名的示意圖:

 

圖片還是比較直觀的,我就不多解釋了。

OAuth 2.0

在前面,我們可以看到,從 Digest Access, 到 AppID+HMAC,再到 JWT,再到 OAuth 1.0,這些個 API 認證都是要向 Client發(fā)一個密鑰(或是用密碼)然后用 HASH 或是 RSA 來簽 HTTP 的請求,這其中有個主要的原因是,以前的 HTTP 是明文傳輸,所以,在傳輸過程中很容易被篡改,于是才搞出來一套的安全簽名機制,所以,這些個認證的玩法是可以在 HTTP 明文協(xié)議下玩的。

這種使用簽名方式大家可以看到是比較復(fù)雜的,所以,對于開發(fā)者來說,也是很不友好的,在組織簽名的那些 HTTP 報文的時候,各種,URLEncode 和 Base64,還要對 Query 的參數(shù)進行排序,然后有的方法還要層層簽名,非常容易出錯,另外,這種認證的安全粒度比較粗,授權(quán)也比較單一,對于有終端用戶參與的移動端來說也有點不夠。所以,在 2012 年的時候,OAuth 2.0 的 RFC 6749 正式放出。

OAuth 2.0 依賴于 TLS/SSL 的鏈路加密技術(shù)(HTTPS),完全放棄了簽名的方式,認證服務(wù)器再也不返回什么 token secret 的密鑰了,所以,OAuth 2.0 是完全不同于 1.0 的,也是不兼容的。目前,F(xiàn)acebook 的 Graph API 只支持 OAuth 2.0協(xié)議,Google 和 Microsoft Azure 也支持Auth 2.0,國內(nèi)的微信和支付寶也支持使用 OAuth 2.0。

下面,我們來重點看一下 OAuth 2.0 的兩個主要的 Flow:

  • 一個是 Authorization Code Flow, 這個是 3 legged 的
  • 一個是 Client Credential Flow,這個是 2 legged 的。

Authorization Code Flow

Authorization Code 是最常使用的 OAuth 2.0 的授權(quán)許可類型,它適用于用戶給第三方應(yīng)用授權(quán)訪問自己信息的場景。這個 Flow 也是 OAuth 2.0 四個 Flow 中我個人覺得最完整的一個 Flow,其流程圖如下所示。

 

下面是對這個流程的一個細節(jié)上的解釋:

1)當(dāng)用戶(Resource Owner)訪問第三方應(yīng)用(Client)的時候,第三方應(yīng)用會把用戶帶到認證服務(wù)器(Authorization Server)上去,主要請求的是 /authorize API,其中的請求方式如下所示。

  1. https://login.authorization-server.com/authorize? 
  2.         client_id=6731de76-14a6-49ae-97bc-6eba6914391e 
  3.         &response_type=code 
  4.         &redirect_uri=http%3A%2F%2Fexample-client.com%2Fcallback%2F 
  5.         &scope=read 
  6.         &state=xcoiv98CoolShell3kch 

其中:

  • client_id 為第三方應(yīng)用的 App ID
  • response_type=code 為告訴認證服務(wù)器,我要走 Authorization Code Flow。
  • redirect_uri 意思是我跳轉(zhuǎn)回第三方應(yīng)用的 URL
  • scope 意是相關(guān)的權(quán)限
  • state 是一個隨機的字符串,主要用于防 CSRF 攻擊。

2)當(dāng) Authorization Server 收到這個 URL 請求后,其會通過 client_id 來檢查 redirect_uri 和 scope 是否合法,如果合法,則彈出一個頁面,讓用戶授權(quán)(如果用戶沒有登錄,則先讓用戶登錄,登錄完成后,出現(xiàn)授權(quán)訪問頁面)。

3)當(dāng)用戶授權(quán)同意訪問以后,Authorization Server 會跳轉(zhuǎn)回 Client ,并以其中加入一個 Authorization Code。如下所示:

  1. https://example-client.com/callback? 
  2.         code=Yzk5ZDczMzRlNDEwYlrEqdFSBzjqfTG 
  3.         &state=xcoiv98CoolShell3kch 

我們可以看到,

  • 請流動的鏈接是第 1)步中的 redirect_uri
  • 其中的 state 的值也和第 1)步的 state一樣。

4)接下來,Client 就可以使用 Authorization Code 獲得 Access Token。其需要向 Authorization Server 發(fā)出如下請求。

  1. POST /oauth/token HTTP/1.1 
  2. Host: authorization-server.com 
  3.   
  4. code=Yzk5ZDczMzRlNDEwYlrEqdFSBzjqfTG 
  5. &grant_type=code 
  6. &redirect_uri=https%3A%2F%2Fexample-client.com%2Fcallback%2F 
  7. &client_id=6731de76-14a6-49ae-97bc-6eba6914391e 
  8. &client_secret=JqQX2PNo9bpM0uEihUPzyrh 

5)如果沒什么問題,Authorization 會返回如下信息。

  1.   "access_token""iJKV1QiLCJhbGciOiJSUzI1NiI"
  2.   "refresh_token""1KaPlrEqdFSBzjqfTGAMxZGU"
  3.   "token_type""bearer"
  4.   "expires": 3600, 
  5.   "id_token""eyJ0eXAiOiJKV1QiLCJhbGciO.eyJhdWQiOiIyZDRkM..." 

其中,

  • access_token 就是訪問請求令牌了
  • refresh_token 用于刷新 access_token
  • id_token 是 JWT 的 token,其中一般會包含用戶的 OpenID

6)接下來就是用 Access Token 請求用戶的資源了。

  1. GET /v1/user/pictures 
  2. Host: https://example.resource.com 
  3.  
  4. Authorization: Bearer iJKV1QiLCJhbGciOiJSUzI1NiI 

Client Credential Flow

Client Credential 是一個簡化版的 API 認證,主要是用于認證服務(wù)器到服務(wù)器的調(diào)用,也就是沒有用戶參與的的認證流程。下面是相關(guān)的流程圖。

 

這個過程非常簡單,本質(zhì)上就是 Client 用自己的 client_id 和 client_secret 向Authorization Server 要一個 Access Token,然后使用 Access Token 訪問相關(guān)的資源。

請求示例

  1. POST /token HTTP/1.1 
  2. Host: server.example.com 
  3. Content-Type: application/x-www-form-urlencoded 
  4.  
  5. grant_type=client_credentials 
  6. &client_id=czZCaGRSa3F0Mzpn 
  7. &client_secret=7Fjfp0ZBr1KtDRbnfVdmIw 

返回示例

  1.   "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3"
  2.   "token_type":"bearer"
  3.   "expires_in":3600, 
  4.   "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk"
  5.   "scope":"create" 

這里,容我多扯一句,微信公從平臺的開發(fā)文檔中,使用了 OAuth 2.0 的 Client Credentials 的方式(參看文檔“微信公眾號獲取 access token”),我截了個圖如下所謂。我們可以看到,微信公眾號使用的是 GET 方式的請求,把 AppID 和 AppSecret 放在了 URL中,雖然這也符合 OAuth 2.0,但是并不好,因為大多數(shù)網(wǎng)關(guān)代理會把整個 URI 請求記到日志中。我們只要腦補一下騰訊的網(wǎng)關(guān)的 Access Log,里面的日志一定會有很多的各個用戶的AppID 和 AppSecret……

 


 

 

小結(jié)

講了這么多,我們來小結(jié)一下(下面的小結(jié)可能會有點散)

兩個概念和三個術(shù)語

  • 區(qū)分兩個概念:Authentication(認證) 和 Authorization (授權(quán)),前者是證明請求者是身份,就像身份證一樣,后者是為了獲得權(quán)限。身份是區(qū)別于別人的證明,而權(quán)限是證明自己的特權(quán)。Authentication 為了證明操作的這個人就是他本人,需要提供密碼、短信驗證碼,甚至人臉識別。Authorization 則是不需要在所有的請求都需要驗人,是在經(jīng)過 Authorization 后得到一個 Token,這就是 Authorization。就像護照和簽證一樣。
  • 區(qū)分三個概念:編碼 Base64Encode、簽名 HMAC、加密 RSA。編碼是為了更的傳輸,等同于明文,簽名是為了信息不能被篡改,加密是為了不讓別人看到是什么信息。

明白一些初衷

  • 使用復(fù)雜地 HMAC 哈希簽名方式主要是應(yīng)對當(dāng)年沒有 TLS/SSL 加密鏈路的情況。
  • JWT 把 uid 放在 Token 中目的是為了去掉狀態(tài),但不能讓用戶修改,所以需要簽名。
  • OAuth 1.0 區(qū)分了兩個事,一個是第三方的 Client,一個是真正的用戶,其先拿 Request Token,再換 Access Token 的方法主要是為了把第三方應(yīng)用和用戶區(qū)分開來。
  • 用戶的 Password 是用戶自己設(shè)置的,復(fù)雜度不可控,服務(wù)端頒發(fā)的 Serect 會很復(fù)雜,但主要目的是為了容易管理,可以隨時注銷掉。
  • OAuth 協(xié)議有比所有認證協(xié)議有更為靈活完善的配置,如果使用 AppID/AppSecret 簽名的方式,又需要做到可以有不同的權(quán)限和可以隨時注銷,那么你得開發(fā)一個像 AWS 的 IAM 這樣的賬號和密鑰對管理的系統(tǒng)。

相關(guān)的注意事項

  • 無論是哪種方式,我們都應(yīng)該遵循 HTTP 的規(guī)范,把認證信息放在 Authorization HTTP 頭中。
  • 不要使用 GET 的方式在 URL 中放入 secret 之類的東西,因為很多 proxy 或 gateway 的軟件會把整個 URL 記在 Access Log 文件中。
  • 密鑰 Secret 相當(dāng)于 Password,但他是用來加密的,最好不要在網(wǎng)絡(luò)上傳輸,如果要傳輸,最好使用 TLS/SSL 的安全鏈路。
  • HMAC 中無論是 MD5 還是 SHA1/SHA2,其計算都是非常快的,RSA 的非對稱加密是比較耗 CPU 的,尤其是要加密的字符串很長的時候。
  • 最好不要在程序中 hard code 你的 Secret,因為在 github 上有很多黑客的軟件在監(jiān)視各種 Secret,千萬小心!這類的東西應(yīng)該放在你的配置系統(tǒng)或是部署系統(tǒng)中,在程序啟動時設(shè)置在配置文件或是環(huán)境變量中。
  • 使用 AppID/AppSecret,還是使用 OAuth1.0a,還是 OAuth2.0,還是使用 JWT,我個人建議使用 TLS/SSL 下的 OAuth 2.0。
  • 密鑰是需要被管理的,管理就是可以新增可以撤銷,可以設(shè)置賬戶和相關(guān)的權(quán)限。最好密鑰是可以被自動更換的。
  • 認證授權(quán)服務(wù)器(Authorization Server)和應(yīng)用服務(wù)器(App Server)最好分開。

 

責(zé)任編輯:武曉燕 來源: 江南一點雨
相關(guān)推薦

2023-09-01 14:27:10

前段后端開發(fā)

2022-09-06 10:26:38

前后端分離Vue跨域

2022-04-06 07:50:57

JWT后端Spring

2020-09-25 11:50:12

前后端分離架構(gòu)Web

2023-11-30 12:13:29

開發(fā)分離工具

2019-06-12 19:00:14

前后端分離AppJava

2023-02-08 16:29:58

前后端開發(fā)

2020-04-20 14:50:02

前端技巧優(yōu)化

2021-09-18 09:45:33

前端接口架構(gòu)

2023-09-21 10:44:41

Web服務(wù)Swagger前端

2014-04-18 14:43:07

前后端分離NodeJS

2019-07-09 05:44:35

前后端分離架構(gòu)接口規(guī)范

2021-10-20 18:21:18

項目技術(shù)開發(fā)

2017-02-15 10:18:32

架構(gòu)前后端分離

2018-10-23 14:24:10

2019-12-04 08:44:59

前后端分離開發(fā)

2017-11-15 07:01:33

互聯(lián)網(wǎng)分層架構(gòu)前后端

2015-07-01 15:32:39

前端前后端分離

2016-08-22 13:31:05

前端架構(gòu)前后端分離

2015-04-21 11:18:20

Web系統(tǒng)開發(fā)構(gòu)架前后端
點贊
收藏

51CTO技術(shù)棧公眾號

久艹视频在线观看| 免费不卡av网站| 成人在线二区| 久久av资源站| 国内精品模特av私拍在线观看| 日本三级日本三级日本三级极| 成人片免费看| 亚洲日本va午夜在线影院| 国产日韩精品一区观看| 特级西西444www高清大视频| 欧美日韩国产亚洲一区| 亚洲精品中文字幕女同| 激情成人在线观看| 狼人综合视频| 亚洲欧美另类久久久精品 | 青青草原av在线播放| 日本高清在线观看wwwww色| 成人app下载| 国产美女久久久| 亚洲欧美自拍视频| 午夜视频精品| 亚洲最新在线视频| 久久性爱视频网站| 国产一区二区三区| 在线亚洲人成电影网站色www| 成人一级生活片| 婷婷激情在线| 99热精品国产| www.成人av.com| 国产精品自产拍| 日韩激情av在线| 2018中文字幕一区二区三区| 欧美日韩免费一区二区| 成人嫩草影院| 亚洲欧美国产另类| 日韩免费高清一区二区| 亚洲国产aⅴ精品一区二区| 在线观看日韩国产| 国模杨依粉嫩蝴蝶150p| a在线视频v视频| 一区二区三区成人| 韩国黄色一级大片| 2019中文字幕在线视频| 国产欧美日韩亚州综合| 欧美久久在线| 欧洲天堂在线观看| 2021中文字幕一区亚洲| 精品一区二区三区国产| 少妇人妻偷人精品一区二区| 国产jizzjizz一区二区| 97久久人人超碰caoprom欧美| 99视频国产精品免费观看a| 久久国产精品99久久久久久老狼| 国产成人欧美在线观看| 男人的天堂av网站| 日日夜夜免费精品视频| 国产精品久久久久久婷婷天堂| 日韩免费av网站| 爽好多水快深点欧美视频| 日本精品视频在线播放| 亚洲男人天堂网址| 日本午夜一本久久久综合| 国产精品九九久久久久久久| 中文字幕乱码视频| 蜜桃视频在线一区| 成人精品久久久| 精品国产一级片| 国产成人欧美日韩在线电影| 不卡一区二区三区视频| 熟妇人妻中文av无码| 91麻豆视频网站| 日韩欧美在线电影| 精品国产白色丝袜高跟鞋| 亚洲欧美欧美一区二区三区| 欧美精品卡一卡二| 自由日本语热亚洲人| 91黄色免费看| 亚洲娇小娇小娇小| 精品成人18| 亚洲激情视频在线| a级大片在线观看| 午夜欧美在线| 久久久人成影片一区二区三区观看| 日韩三级一区二区三区| 久久这里有精品15一区二区三区| 国产日韩欧美日韩大片| 亚洲高清视频在线播放| 91免费看片在线观看| 亚洲高清资源综合久久精品| 性欧美videoshd高清| 天涯成人国产亚洲精品一区av| 免费看a级黄色片| www.久久久.com| 亚洲乱码国产乱码精品精| 日韩av片在线免费观看| 影音先锋日韩资源| 国产精品99久久久久久久久| www.狠狠干| 久久这里只有精品视频网| 在线亚洲美日韩| 国产高清视频色在线www| 91国在线观看| 熟妇高潮一区二区| 日韩在线欧美| 奇门遁甲1982国语版免费观看高清 | 国产精品青青在线观看爽香蕉| 99久久久国产精品无码网爆 | 国产传媒在线看| 欧美视频二区| 国产精品美腿一区在线看| 欧美一级免费片| 亚洲视频图片小说| 一级黄色香蕉视频| 亚洲一区 二区| 少妇高潮久久77777| 一级片中文字幕| 国产成人自拍在线| 亚洲国产日韩美| 涩涩视频在线| 亚洲电影天堂av| 麻豆明星ai换脸视频| 日日夜夜免费精品| 久久精品日产第一区二区三区| 国产写真视频在线观看| 欧美三级日韩三级国产三级| 少妇饥渴放荡91麻豆| 欧美精选一区| 91九色对白| 日本不卡在线| 欧美视频日韩视频在线观看| 久久久久国产精品区片区无码| 欧美一区91| 91精品国产综合久久香蕉最新版| 国产中文在线| 色综合天天性综合| 五级黄高潮片90分钟视频| 亚洲人成久久| 国产精品久久亚洲7777| 亚洲wwwww| 日韩一区二区三区观看| 免费成人深夜蜜桃视频| 蜜桃av一区二区三区| 色婷婷精品国产一区二区三区| 在线观看福利电影| 亚洲精品午夜精品| 国产熟妇一区二区三区四区| 91蜜桃视频在线| 欧美成人黑人猛交| 精品国产一区二区三区小蝌蚪| 欧美在线视频在线播放完整版免费观看| 欧洲成人一区二区三区| 亚洲va天堂va国产va久| 欧美xxxxx精品| 99在线|亚洲一区二区| 国产一区二区三区四区hd| 第一福利在线视频| 精品无人区太爽高潮在线播放| 中国一级免费毛片| 久久婷婷国产综合国色天香| 国产福利视频在线播放| 成久久久网站| 91精品在线观看视频| 午夜伦理大片视频在线观看| 日韩精品一区国产麻豆| 国产真实乱人偷精品视频| fc2成人免费人成在线观看播放| 欧美男女爱爱视频| 偷窥自拍亚洲色图精选| 国产成人精品电影| 日韩在线观看www| 91精品国产色综合久久| 久久久久久久久久综合| 97se亚洲国产综合自在线| av免费网站观看| 亚洲精品a级片| 国产一区二区三区高清| 日本成人伦理电影| 日韩中文字幕精品| 亚洲国产综合网| 色婷婷精品久久二区二区蜜臂av| 欧美一区二区三区粗大| 国产精品原创巨作av| 日日碰狠狠添天天爽超碰97| 欧美一区电影| 99久久久久国产精品免费| 在线免费看h| 日韩亚洲欧美成人| 日本久久一级片| 欧美四级电影在线观看| 免费一级全黄少妇性色生活片| 久久噜噜亚洲综合| 久久艹这里只有精品| 亚洲一区免费| 黄色网络在线观看| 久久99国内| 97欧洲一区二区精品免费| 粉嫩一区二区三区| 欧美极品少妇xxxxⅹ裸体艺术| 国产高清一区在线观看| 精品日韩99亚洲| 久久午夜鲁丝片| 亚洲妇女屁股眼交7| 国产7777777| 99久久综合狠狠综合久久| 99中文字幕在线| 天堂影院一区二区| 国产成a人亚洲精v品在线观看| 久久av影视| 国产精品久久九九| 日本国产亚洲| 国产91在线播放| 草草在线视频| 欧美另类在线观看| 午夜精品一区| 亚洲美女av黄| 天天操天天舔天天干| 欧美一级电影网站| 亚洲手机在线观看| 色综合天天视频在线观看| 日本三级中文字幕| 亚洲美女在线国产| 成年人免费视频播放| 国产欧美在线观看一区| 日韩av一二区| 成a人片国产精品| 三级网站免费看| 久久福利视频一区二区| 欧美性猛交久久久乱大交小说| 99亚洲一区二区| 999在线观看视频| 国产综合精品| 日韩精品一区二区免费| 欧美另类综合| 欧美三级午夜理伦三级老人| 999久久久91| 亚洲啪啪av| 日韩av大片| 亚洲精品成人久久久998| 欧美精品第一区| 欧美午夜精品久久久久免费视| 欧美午夜寂寞| 久久青青草原一区二区| 亚洲精华一区二区三区| 久久精品日产第一区二区三区精品版| 国产伦乱精品| 精品国产一区二区三区麻豆小说| 国产精品流白浆在线观看| 国产高清一区视频| 黄色免费大全亚洲| 九色一区二区| 五月国产精品| 青青成人在线| 欧美国产一级| 永久免费网站视频在线观看| 午夜视频一区| 337p粉嫩大胆噜噜噜鲁| 久久国产直播| 牛夜精品久久久久久久| 九色综合国产一区二区三区| 亚洲一区二区偷拍| 成人免费观看男女羞羞视频| 西西大胆午夜视频| 久久久高清一区二区三区| av女人的天堂| 中文字幕日韩av资源站| 久久久久久久久久久久久久免费看| 亚洲成人资源网| 精品免费囯产一区二区三区 | 亚洲天堂网2018| 国产精品一二三区在线| 污污污www精品国产网站| 久久综合色播五月| 特级西西人体高清大胆| 亚洲精品一卡二卡| 成年人免费看毛片| 91九色最新地址| 国产成人精品白浆久久69| 欧美电影免费提供在线观看| 日漫免费在线观看网站| 中文国产成人精品久久一| 中文字幕有码在线观看| 欧美在线视频观看| 亚洲国产精选| 久久久久久久久久久久久久一区| 日韩电影免费在线观看| 大荫蒂性生交片| 日韩国产欧美在线播放| 超碰人人cao| 久久久91精品国产一区二区精品| 欧美一区二区三区爽爽爽| 精品久久久久久亚洲国产300| 日韩乱码一区二区三区| 精品久久99ma| 触手亚洲一区二区三区| 欧美黑人一级爽快片淫片高清| 性欧美18一19sex性欧美| 亚洲自拍偷拍第一页| 亚洲欧美日本伦理| 51xx午夜影福利| 日韩精品亚洲专区| 亚洲一级Av无码毛片久久精品| 国产亚洲va综合人人澡精品| 免费日韩在线视频| 欧美日韩国产精品自在自线| 天堂国产一区二区三区| xxxx性欧美| 性欧美1819sex性高清| 国产成人一区二区三区免费看| 国产精品99视频| 麻豆av免费在线| 成人av资源在线| 婷婷久久综合网| 欧美午夜寂寞影院| 日韩三级电影网| 韩剧1988免费观看全集| 老司机亚洲精品一区二区| 日韩视频专区| 午夜影院日韩| 天堂www中文在线资源| 亚洲三级在线观看| 伊人久久亚洲综合| 亚洲天堂成人在线| 蜜桃麻豆av在线| 国产99在线播放| 欧美日韩国产探花| 亚洲天堂一区二区在线观看| 国产精品天美传媒沈樵| 欧美日韩一级黄色片| 亚洲娇小xxxx欧美娇小| 俺来俺也去www色在线观看| 亚洲综合在线小说| 国产精品久久久久无码av| a在线观看免费视频| 中文子幕无线码一区tr| 老熟妇一区二区三区啪啪| 亚洲男人天堂古典| jk漫画禁漫成人入口| 免费观看国产成人| 国产日韩综合| 人妖粗暴刺激videos呻吟| 亚洲一区二区三区小说| www久久久久久| 欧美贵妇videos办公室| 91麻豆精品国产91久久久久推荐资源| 超碰10000| 国产精品一品视频| 欧美日韩免费做爰视频| 欧美zozo另类异族| 91福利在线免费| 精品中文字幕一区| 亚洲欧美视频| 非洲一级黄色片| 欧美日韩成人综合在线一区二区| 在线免费观看黄| 91香蕉电影院| 欧美婷婷在线| www.日本高清| 色婷婷亚洲婷婷| 欧美另类极品| 91亚洲精品丁香在线观看| 欧美黄色aaaa| www.88av| 91国内精品野花午夜精品| 欧美jizz18性欧美| av在线不卡观看| 99视频在线精品国自产拍免费观看| 日本xxx在线播放| 欧美在线观看视频一区二区三区| 麻豆传媒在线观看| 国产精品对白刺激久久久| 亚洲欧美日韩综合国产aⅴ| 女人十八毛片嫩草av| 日韩一区二区精品在线观看| xxxx成人| 天天综合狠狠精品| 国产传媒欧美日韩成人| 日韩av黄色片| 尤物tv国产一区| 日韩亚洲精品在线观看| 国内性生活视频| 国产精品久久久久婷婷| 亚洲va久久久噜噜噜无码久久| 欧美中文在线字幕| 99久久婷婷| 国产激情视频网站| 欧美日本一道本在线视频| 电影k8一区二区三区久久| 日产中文字幕在线精品一区| 国产精品911| 亚洲影院在线播放| 欧美成人三级视频网站| 欧美做受69| 污视频在线观看免费网站| 色综合天天综合网天天狠天天| 中中文字幕av在线| 欧美一区国产一区| 国产成人免费视频网站 | 久久久久久久极品内射| 亚洲图中文字幕| 久久国产精品色av免费看|