为什么要对 Authorization header 进行 base64 编码?

Why should you base64 encode the Authorization header?

Twitter 的 API 需要发送授权 header,它是 API 密钥与 API 密钥串联的 base64 编码。在节点中,我使用:

var base64 = new Buffer(apiKey + ':' + apiSecret).toString('base64');

发送的header变为:

Authorization: 'Basic ' + base64

base64 编码字符串 "apiKeyHere:apiSecretHere" 有什么意义?为什么不接受包含原始 api 凭据的授权 header?

此问题与 类似,但投票的答案并未完全回答我的问题。 Twitter 的 api 密钥和 api 密钥已经是 HTTP 兼容字符。它们看起来像这样(这些不是真的):

消费者密钥(API 密钥)8dme3utVQfOhlPk5BUG9XbFxR

消费者机密(API 机密)QFZXoC7MP72JZtGMBNpjLGI4Vl1xr1q9dyPLp3u7jGtkESpbLm

那为什么要用base64编码呢?此外,post 声明 "the intent of the encoding is to encode non-HTTP-compatible characters that may be in the user name or password into those that are HTTP-compatible." 用户名和密码是否已经是 HTTP 兼容字符?

RFC7617 (and the old RFC2617) 中描述了基本身份验证方案。

这是向服务器发送密码凭据的标准方法。 base64 编码用于对凭据进行编码,以允许发送非 HTTP 字符和多字节字符串。

尽管我在 w3 文档中找不到它,但我相信它只是将授权 header 的凭据编码为 base64 的协议,无论它有什么内容。在 Twitter 的情况下,它并没有像您所说的那样有太大区别,但在其他情况下,凭据可以包含这些字符。为了保持统一并防止错误地编码或不编码,所有凭证都应该编码。

另一个原因可能是,浏览器也以相同的方式对凭据进行编码。 Twitter 可能也想接受这一点。

默认情况下,Hypertext Transfer Protocol (HTTP)消息中的消息头字段参数不能携带ISO-8859-1字符集之外的字符。

如果用户名和密码包含不兼容的字符集,那么 HTTP 将无法传输这些文本。 为了防止这种情况,我们使用 base64 对用户名和密码进行编码,以确保我们通过 HTTP 发送 HTTP 兼容的字符。 有关详细信息,请参阅此 Basic_access_authentication

字符串应该是 base64 编码,不是为了安全,而是为了将不兼容 HTTP 的字符编码为可能在用户名或密码中的 HTTP 兼容字符。