多个HTTP授权标头?

时间:2015-03-26 15:31:27

标签: http oauth authorization

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

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

我认为没有理由这是不可能的,只是想与社区一起审核。

6 个答案:

答案 0 :(得分:32)

这应该是可能的,您只需在字段值之间添加逗号,例如:

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

这在RFC7230,第3.2.2节,字段顺序:

中定义
  

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

     

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

我不知道所有网络服务器是否接受这一点 - 在撰写本文时,我正在与同事讨论是否应该有效。

答案 1 :(得分:19)

不,这是不可能的。请参阅http://greenbytes.de/tech/webdav/rfc7235.html#header.authorization

中的语法定义

答案 2 :(得分:10)

我有一个类似的问题。这似乎是一个非常普遍的问题 (Link to question)。我最终将承载令牌的授权标题更改为非标准标题,如

  

X-Auth:Bearer mF_9.B5f-4.1JqM

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

进一步研究

基于RFC 2617这里有一些有趣的细节。

  

用户代理必须      选择使用最强的auth-scheme它的挑战之一      根据该用户理解并请求来自用户的凭证      挑战。

     

请注意,许多浏览器只会识别Basic并且需要         它是第一个提出的授权方案。服务器应该只         如果它是最低限度可接受的,请包括Basic。

答案 3 :(得分:0)

可能有多个授权标头,在集成接受多个授权的API时遇到了相同的问题。

这里是React js示例,用于调用接受多个auth令牌的API。

<script src="https://twgljs.org/dist/4.x/twgl-full.min.js"></script>
<canvas></canvas>

答案 4 :(得分:0)

标题fields are key/value pairs。因此,只要它们是独一无二的,并且您/程序员知道谁是谁,就可以了

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

我的 Angular 拦截器向 Node API 发送 Authorization111: Bearer xyz123,API 提取令牌为

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

答案 5 :(得分:0)

如果您在后端使用 python,那么您可以简单地在承载中传递 dict,然后在后端处理它之前执行 json.loads

这样你就可以在一个授权头中传递多个值

示例:通过 {"access_token" : access_token, "app_id" : 2}

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