【问题标题】:What is correct OAuth percent encoding?什么是正确的 OAuth 百分比编码?
【发布时间】:2012-10-15 03:09:41
【问题描述】:

我正在努力实施 Oauth Api,我发现有一些事情我无法验证,如果有人能提供说明,我会很高兴。警告我可能会漫无目的,所以我会尝试用粗体标记我的问题。

根据 oauth 1.0 规范 https://www.rfc-editor.org/rfc/rfc5849,我相信 oauth 参数对签名进行百分比编码的方式与在线时不同。 3.6节https://www.rfc-editor.org/rfc/rfc5849#section-3.6 “它只用于构造签名基字符串和“授权”头域。”

RFC3986 https://www.rfc-editor.org/rfc/rfc3986 这似乎是正常请求中使用的百分比编码方案。但是我没有看到它给出任何类型的 'this' 映射到 'that' 所以我假设如果字符在保留列表中,则应该使用十六进制等效项。

' '(空格)在为签名编码时是 %20 的唯一区别吗? Oauth 规范引用了这一点,但老实说,我无法找到其他规格。如果有人能指出我提到的地方以及我可能如何误解它,那就太棒了。

其他空白字符应该是 %20 吗?规范中哪里提到了这一点?

传统的 UrlEncode 是否适用于表单正文和查询参数?

最后,我要验证一些示例输出。我试图展示 Oauth 签名编码字符和 Url 编码字符之间的区别。再一次,唯一的区别似乎是对 ' '、'*' 和 '~' 的处理

Char  Oauth  Url
*     %2A     *
~     ~     %7E
%     %25     %25
!     %21     %21
:     %3A     %3A
/     %2F     %2F
=     %3D     %3D
&     %26     %26
+     %2B     %2B
      %20     +
,     %2C     %2C
@     %40     %40
\r\n  %0D%0A  %0D%0A
\n    %0A     %0A
\r    %0D     %0D
"     %22     %22
?     %3F     %3F
(     %28     %28
)     %29     %29
|     %7C     %7C
[     %5B     %5B
]     %5D     %5D

【问题讨论】:

    标签: oauth urlencode encode


    【解决方案1】:

    也许 Twitter 开发者文档的这一部分可能会对您有所帮助:https://developer.twitter.com/en/docs/basics/authentication/guides/percent-encoding-parameters.html

    【讨论】:

    【解决方案2】:

    虽然这是一篇老帖子,但还是想表达我的理解。

    关于rfc3986#2.1中指定的百分比编码,理解为除了非保留字符之外的所有字符都将被转义。

    这意味着除了:

      unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
    

    其余字符将被编码。

    here 提供了 java 中的示例实现。寻找接受字符串作为参数的 percentEncode 方法。

    public static String percentEncode(String s)
    

    其他语言的其他代码示例可以在here找到。

    【讨论】:

      【解决方案3】:

      对于 JavaScript:

      /**
       * encodeURIComponent(str) Unescaped / Reserved characters:
       *
       * Alphabetic, Digit and -_.~!*'()
       *
       * oAuth Unescaped / Reserved characters:
       *
       * Alphabetic, Digit and -_.~
       *
       */
      
      // Encode with !*'()
      this.oAuthEncode = function (value) {
        value = encodeURIComponent(value)
        value = value.replace(/!/g, '%21') // !
        value = value.replace(/\*/g, '%2A') // *
        value = value.replace(/'/g, '%27') // '
        value = value.replace(/\)/g, '%29') // )
        value = value.replace(/\(/g, '%28') // (
        return value;
      };
      
      // Decode with !*'()
      this.oAuthDecode = function (value) {
        value = decodeURIComponent(value)
        value = value.replace(/%21/g, '!') // !
        value = value.replace(/%2A/g, '*') // *
        value = value.replace(/%27/g, '\'') // '
        value = value.replace(/%29/g, ')') // )
        value = value.replace(/%28/g, '(') // (
        return value;
      };
      

      【讨论】:

        猜你喜欢
        • 2017-04-13
        • 2017-11-03
        • 1970-01-01
        • 2018-11-24
        • 2019-05-18
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多