7

我正在实施一个 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
4

3 回答 3

1

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

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

这意味着除了:

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

其余字符将被编码。

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

public static String percentEncode(String s)

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

于 2015-04-05T18:26:24.810 回答
1

对于 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-06-21T12:06:45.933 回答
-1

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

于 2013-05-02T13:12:05.327 回答