簡體   English   中英

多個 HTTP 授權標頭?

[英]Multiple HTTP Authorization headers?

是否可以在 HTTP 消息中包含多個授權標頭? 具體來說,我想包括一種不記名令牌類型(傳遞 OAuth 訪問令牌)和一種基本類型(傳遞 base64 編碼的用戶名:密碼)。

GET /presence/alice HTTP/1.1 
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM
Authorization: Basic YXNkZnNhZGZzYWRmOlZLdDVOMVhk

我沒有理由認為這是不可能的,只是想與社區一起審查以確保。

**** 2021 年 2 月更新 *** 請閱讀對此回復的評論。 他們的一般結論似乎是一些 Web 服務器接受多個授權方案,但它違反了 RFC 7230/7235 ****

這應該是可能的,您只需要在字段值之間添加一個逗號,例如:

GET /presence/alice HTTP/1.1 
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM, Basic YXNkZnNhZGZzYWRmOlZLdDVOMVhk

這在RFC7230 的第 3.2.2 節,字段順序中定義:

發送方不得在消息中生成多個具有相同字段名稱的頭字段,除非該頭字段的整個字段值被定義為逗號分隔列表 [即,#(values)] 或頭字段是一個井-已知異常(如下所述)。

接收者可以將多個具有相同字段名稱的頭字段組合成一個“字段名稱:字段值”對,而不會改變消息的語義,通過將每個后續字段值按順序附加到組合字段值中,由逗號。 因此,接收具有相同字段名稱的頭字段的順序對於組合字段值的解釋很重要; 轉發消息時,代理不得更改這些字段值的順序。

我不知道是否所有網絡服務器都接受這一點 - 在撰寫本文時,我正與一位同事爭論它是否應該工作。

不,這不可能。 請參閱http://greenbytes.de/tech/webdav/rfc7235.html#header.authorization 中的語法定義

我有一個類似的問題。 這似乎是一個很常見的問題( 鏈接到問題)。 我最終將不記名令牌的授權標頭更改為非標准的,例如

X-Auth:Bearer mF_9.B5f-4.1JqM

這樣它只是另一個 HTTP 標頭,基本的 http 授權將通過。 如果您正在開發自己的 API,這應該沒問題。

一些進一步的研究

基於RFC 2617,這里有一些有趣的細節。

用戶代理必須選擇使用它所理解的最強身份驗證方案的挑戰之一,並根據該挑戰向用戶請求憑據。

請注意,許多瀏覽器將只識別 Basic,並要求它是第一個呈現的身份驗證方案。 如果基本可接受,服務器應僅包含 Basic。

標頭字段是鍵/值對 所以只要它們是獨一無二的並且你/程序員知道誰是誰,這很好

AuthorizationBearer: Bearer mF_9.B5f-4.1JqM
AuthorizationBasic: Basic YXNkZnNhZGZzYWRmOlZLdDVOMVhk

我的 Angular 攔截器將Authorization111: Bearer xyz123發送到 Node API,API 將令牌提取為

var token = header.headers["authorization111"].toString().split(' ')[1];

如果您在后端使用 python,那么您可以簡單地在承載中傳遞 dict 並在后端處理它之前執行 json.loads

通過這種方式,您可以在一個授權標頭中傳遞多個值

示例:傳遞{"access_token" : access_token, "app_id" : 2}

后端json.loads("{"access_token" : access_token, "app_id" : 2}")

可能有多個授權標頭,我在集成接受多個授權的 API 時遇到了同樣的問題。

這是調用接受多個身份驗證令牌的 API 的 React js 示例。

axios.get(Constants.API+Constants.GET_USER,  {  headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
"Authorization": Constants.AUTH_Element + ',' + Constants.AUTH_ORG + ','+ 
Constants.AUTH_USER
}})
.then(function (response) {
    // handle success
    console.log(response);
})
.catch(function (error) {
    // handle error
    console.log(error);
})
.finally(function () {
    // always executed
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM