我正在努力实施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
答案 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;
};