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秘密)QFZXoC7MP72JZtGMBNpjLGI4Vl1xr1q9dyPLp3u7jGtkESpbLm
那么为什么base64会编码呢?此外,该帖子声明"编码的目的是将可能在用户名或密码中的非HTTP兼容字符编码为与HTTP兼容的字符。"用户名和密码不是HTTP兼容字符吗?
答案 0 :(得分:6)
虽然我无法在w3文档中找到它,但我相信只要协议将Authorization标头的凭据编码为base64,无论它有什么内容。在Twitter的情况下,它并没有像你说的那样有很大的不同,但在其他情况下,凭据可以包含这些字符。为了保持统一并防止是否应对其进行编码,应对所有凭证进行编码。
另一个原因可能是,浏览器也以相同的方式编码凭证。 Twitter可能也想接受这一点。
答案 1 :(得分:2)
答案 2 :(得分:0)
默认情况下,Hypertext Transfer Protocol (HTTP)
消息中的消息头字段参数不能包含 ISO-8859-1 字符集之外的字符。
如果用户名和密码包含不兼容的字符集,则HTTP不能携带这些文本。 为了防止这种情况,我们使用base64对用户名和密码进行编码,以确保我们通过 HTTP 发送HTTP兼容字符。 有关更多信息,请参见此Basic_access_authentication
答案 3 :(得分:0)
该字符串应使用base64编码,不是出于安全考虑,而是将非HTTP兼容字符编码为可能在用户名或密码中的HTTP兼容字符。