Bearer Token (RFC 6750) 用於OAuth 2.0受權訪問資源,任何Bearer持有者均可以無差異地用它來訪問相關的資源,而無需證實持有加密key。一個Bearer表明受權範圍、有效期,以及其餘受權事項;一個Bearer在存儲和傳輸過程當中應當防止泄露,需實現Transport Layer Security (TLS);一個Bearer有效期不能過長,過時後可用Refresh Token申請更新。html
一. 資源請求前端
Bearer實現資源請求有三種方式:Authorization Header、Form-Encoded Body Parameter、URI Query Parameter,這三種方式優先級依次遞減web
GET /resource HTTP/1.1 Host: server.example.com Authorization: Bearer mF_9.B5f-4.1JqM
POST /resource HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded access_token=mF_9.B5f-4.1JqM
使用該方法發送Bearer須知足以下條件:算法
1.頭部必須包含"Content-Type: application/x-www-form-urlencoded" 2.entity-body必須遵循application/x-www-form-urlencoded編碼(RFC 6749) 3.若是entity-body除了access_token以外,還包含其餘參數,須以"&"分隔開 4.entity-body只包含ASCII字符 5.要使用request-body已經定義的請求方法,不能使用GET
若是客戶端沒法使用Authorization請求頭,才應該使用該方法發送Bearer編程
GET /resource?access_token=mF_9.B5f-4.1JqM HTTP/1.1 Host: server.example.com
Cache-Control: no-store
服務端應在響應中使用 Cache-Control: privatejson
二. WWW-Authenticate頭後端
在客戶端未發送有效Bearer的狀況下,即錯誤發生時,資源服務器鬚髮送WWW-Authenticate頭,下爲示例:瀏覽器
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example", error="invalid_token", error_description="The access token expired"
下面將就WWW-Authenticate字段的用法進行詳細描述(下列這些屬性/指令不該重複使用):安全
scope="openid profile email" scope="urn:example:channel=HBO&urn:example:rating=G,PG-13"
當錯誤發生時,資源服務器將發送的HTTP Status Code(一般是400, 401, 403, 或405)及Error Code以下:服務器
若是客戶端發送的資源請求缺少任何認證信息(如缺乏access token,或者使用 RFC 6750 所規定的三種資源請求方式以外的任何method),資源服務器不該該在響應中包含錯誤碼或者其餘錯誤信息,以下便可:
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example"
三. Bearer Token Response
下爲示例:
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token":"mF_9.B5f-4.1JqM", "token_type":"Bearer", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA" }
四. 安全威脅
另外cookie不能包含token,關於cookie的安全弱點,RFC 6265 中有以下描述:
A server that uses cookies to authenticate users can suffer security vulnerabilities because some user agents let remote parties issue HTTP requests from the user agent (e.g., via HTTP redirects or HTML forms). When issuing those requests, user agents attach cookies even if the remote party does not know the contents of the cookies, potentially letting the remote party exercise authority at an unwary server.
可見即便服務端實現了TLS,攻擊者依舊能夠利用cookie來獲取機密信息,若是cookie中包含機密信息的話;對此,不得已可將機密信息包含於URLs(前提是已實現了TLS),但儘可能使用更安全的辦法,由於瀏覽器歷史記錄、服務器日誌等可能泄露URLs機密信息。
五. Transport Layer Security (TLS)
TLS (SSL / TLS)源於NetScape設計的SSL(Secure Sockets Layer,1994 / SSL 1.0、1995 / SSL 2.0、1996 / SSL 3.0);1999年,IETF接替NetScape,發佈了SSL的升級版TLS 1.0,最新爲TLS 1.3(draft),TLS 用於在兩個通訊應用程序之間提供保密性和數據完整性。目前,應用最普遍的是TLS 1.0,接下來是SSL 3.0,主流瀏覽器都已經實現了TLS 1.2的支持。TLS 1.0一般被標示爲SSL 3.1,TLS 1.1爲SSL 3.2,TLS 1.2爲SSL 3.3。獲取更多信息可參考 TLS 1.2 / RFC 5246 。
TLS是一種位於傳輸層(TCP)和應用層之間的協議層,由記錄協議(Record Layer)和握手協議(Handshake Layer)兩層構成:
TLS算法套件由三個部分組成:瞭解更多可參考 http://www.rfcreader.com/#rfc5246_line3649
六. application/x-www-form-urlencoded Media Type
首先application/x-www-form-urlencoded這種編碼類型未考慮非US ASCII字符的狀況,所以待編碼的內容(包括名稱、值)可先經UTF-8編碼,而後再按字節序列進行字符轉義操做;而接收這種數據類型則需進行逆向處理。一般各類web編程語言已經提供原生URL編碼/URL解碼接口(可能不一樣語言版本的URL編碼/解碼會有差別),使用起來也極爲方便,所以這裏不作詳細介紹。
七. MAC Token
MAC Token與Bearer Token同樣,可做爲OAuth 2.0的一種Access Token類型,但Bearer Token纔是RFC建議的標準;MAC Token是在MAC Access Authentication中被定義的,採用Message Authentication Code(MAC)算法來提供完整性校驗。
MAC Access Authentication 是一種HTTP認證方案,具體內容可參考: HTTP Authentication: MAC Access Authentication draft-hammer-oauth-v2-mac-token-05 。