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

问题描述 投票:7回答:4

Twitter的API要求发送Authorization标头,该标头是与API密钥连接的API密钥的base64编码。在Node中,我使用:

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

发送的标头变为:

Authorization: 'Basic ' + base64

base64编码字符串“apiKeyHere:apiSecretHere”有什么意义?为什么不接受包含原始api凭证的Authorization标头?

这个问题类似于What is the purpose of base 64 encoding and why it used in HTTP Basic Authentication?但投票的答案并没有完全回答我的问题。 Twitter的api密钥和api密钥已经是HTTP兼容的字符。他们看起来像这样(这些不是真的):

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

消费者秘密(API Secret)QFZXoC7MP72JZtGMBNpjLGI4Vl1xr1q9dyPLp3u7jGtkESpbLm

那么为什么base64会编码呢?此外,该帖子指出“编码的目的是将可能在用户名或密码中的非HTTP兼容字符编码为与HTTP兼容的字符。”用户名和密码不是HTTP兼容字符吗?

oauth oauth-2.0 base64 twitter-oauth bearer-token
4个回答
6
投票

虽然我在w3文档中找不到它,但我相信只要协议将Authorization标头的凭证编码为base64,无论它有什么内容。就Twitter而言,它并没有太大的区别,但在其他情况下,凭据可以包含这些字符。为了保持统一并防止是否应对其进行编码,应对所有凭证进行编码。

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


2
投票

基本认证方案在RFC7617(和旧的RFC2617)中描述。

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


1
投票

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

如果用户名和密码包含不兼容的字符集,则HTTP将无法携带这些文本。为了防止这种情况,我们用base64编码用户名和密码,以确保我们通过HTTP发送HTTP兼容的char。有关更多信息,请参阅此Basic_access_authentication


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.