【问题标题】:Why should you base64 encode the Authorization header?为什么要对 Authorization 标头进行 base64 编码?
【发布时间】:2016-01-27 21:34:03
【问题描述】:

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

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

发送的header变成:

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 兼容字符了吗?

【问题讨论】:

标签: oauth oauth-2.0 base64 twitter-oauth bearer-token


【解决方案1】:

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

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

【讨论】:

  • 谢谢。你能想到数据不包含 HTTP 兼容字符的情况吗?
  • 用户名或密码包含任何非 ASCII 字符的任何情况,以及提到的任何令牌分隔符here。 (请参阅this 问题。)
  • 我相信已经使用了一个字符集,这是一种将文本表示为字节的方法。然后,如果您对这些字节进行 base 64 编码,这是一种将字节编码为文本的方法,该格式可以安全地跨协议传输。它只使用可能被它通过的不同协议误解为控制代码的文本字符。
【解决方案2】:

RFC7617(和旧的RFC2617)中描述了基本身份验证方案。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2011-01-10
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多