什么是正确的OAuth百分比编码?

时间:2012-10-25 00:46:41

标签: oauth urlencode encode

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

根据oauth 1.0规范http://tools.ietf.org/html/rfc5849,我认为oauth params对签名进行百分比编码的方式与在线时不同。 第3.6节http://tools.ietf.org/html/rfc5849#section-3.6 “它仅用于构造签名基本字符串和”授权“标题字段。”

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

编码签名时''(空格)是%20的唯一区别是什么? Oauth规范引用了这个,但我不能老实地找到在哪里定义其他规格。如果有人能指出我提到的地方以及我可能误解了它,那将是非常棒的。

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

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

最后,我有一些示例输出,我希望验证。我试图显示Oauth Signature Encoded字符和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

3 个答案:

答案 0 :(得分:1)

虽然这是一篇旧文章,但我想表达我的理解。

关于rfc3986#2.1中指定的百分比编码,理解是要转义除非保留字符以外的所有字符。

这意味着除了:

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

其余字符将被编码。

提供了Java中的示例实现here。查找接受String作为参数的percentEncode方法。

public static String percentEncode(String s)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

适用于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;
};