多个HTTP授权头?

多个HTTP授权头?,http,oauth,authorization,Http,Oauth,Authorization,是否可以在HTTP消息中包含多个授权头?具体地说,我想包括一个承载令牌类型(传递OAuth访问令牌)和一个基本类型(传递base64编码的用户名:密码) 我看这没有理由不可能,只是想和社区一起检查一下。不,这是不可能的。参见中的语法定义我有一个类似的问题。这似乎是一个相当普遍的问题 (). 最后,我将承载令牌的授权头更改为非标准头,如 X-Auth:承载mF_9.B5f-4.1JqM 这样,它只是另一个HTTP头,基本HTTP授权将通过。如果您正在开发自己的API,这应该没有问题 一些进一步的研

是否可以在HTTP消息中包含多个授权头?具体地说,我想包括一个承载令牌类型(传递OAuth访问令牌)和一个基本类型(传递base64编码的用户名:密码)


我看这没有理由不可能,只是想和社区一起检查一下。

不,这是不可能的。参见

中的语法定义我有一个类似的问题。这似乎是一个相当普遍的问题 (). 最后,我将承载令牌的授权头更改为非标准头,如

X-Auth:承载mF_9.B5f-4.1JqM

这样,它只是另一个HTTP头,基本HTTP授权将通过。如果您正在开发自己的API,这应该没有问题

一些进一步的研究

根据这些数据,这里有一些有趣的细节

用户代理必须 选择使用其中一个具有最强身份验证方案的挑战 了解并基于此向用户请求凭据 挑战

请注意,许多浏览器只能识别Basic,并且需要 这是第一个提出的认证方案。服务器只应 如果最低限度可以接受,则包括基本要求


****更新日期: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
这在第3.2.2节“现场顺序”中有定义:

发件人不得在邮件中生成具有相同字段名的多个标题字段,除非该标题字段的整个字段值定义为逗号分隔列表[即#(值)],或者标题字段是众所周知的异常(如下所述)

收件人可以将具有相同字段名的多个标题字段组合成一个“字段名:字段值”对,而不改变消息的语义,方法是将每个后续字段值按顺序附加到组合字段值,并用逗号分隔。因此,具有相同字段名称的标题字段的接收顺序对于组合字段值的解释非常重要;转发邮件时,代理不得更改这些字段值的顺序


我不知道所有的Web服务器是否接受这一点——在写作的时候,我正在和一个同事讨论它是否应该工作。

< P>可能有多个授权头,在接受多个授权的API中,我遇到了同样的问题。

下面是调用接受多个身份验证令牌的API的示例

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
});
标题。因此,只要它们是独一无二的,并且您/程序员知道谁是谁,就可以了

AuthorizationBearer: Bearer mF_9.B5f-4.1JqM
AuthorizationBasic: Basic YXNkZnNhZGZzYWRmOlZLdDVOMVhk
我的角度拦截器向节点API发送
Authorization111:Bearer xyz123
,API将令牌提取为

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

RFC2617现在已经不重要了。您需要检查RFC 7235。虽然我应该相信您,因为我知道您是谁,但您所说的与规范不符:“当创建它们的值时,用户代理应该通过选择其认为最安全的身份验证方案,并酌情从用户处获取凭据来实现此目的。”-具体来说,1)“应该”,2)token68排除“,”意味着逗号不会被解释为标记的一部分,3)规范中没有说明多重身份。无法提供标题,即两个标题CRLF分开。另请参见,当使用列表语法定义多个标题字段时,您只能使用多个标题字段;请参阅@JulianReschke我们可以在同一请求中设置包含基本身份验证的第一个授权头,并设置包含承载身份验证的第二个授权头吗?不,这将是无效语法。c.f。答案似乎是否定的——至少在Apache2.4中是否定的。我认为这应该是公认的答案。逗号非常适合我。基本认证和JWT.No。该部分仅适用于整个字段值定义为逗号分隔列表的标题,例如
Accept Encoding
header<代码>授权标头的字段值为。@Sam Critchley标头有一个凭据字段,凭据字段由两部分组成:验证方案和参数/参数列表。参数可以用逗号分隔,但是,不,整个凭证字段不是列表。(凭证的复数形式在这里并不重要——它是一个标量值。)这是一个错误的实现!请参阅RFC附录C:授权不是逗号分隔的列表。如果服务器接受它,它就不会按照RFC实现协议。问题是哪个API?
var token = header.headers["authorization111"].toString().split(' ')[1];