oauth access token 和oauth access secret可以有多少个字符,允许的字符是多少?我需要将它们存储在数据库中。
7 回答
我不确定是否有任何明确的限制。该规范没有任何. 也就是说,OAuth 令牌通常作为 url 参数传递,因此具有一些相同的限制。即需要正确编码等。
OAuth 不指定令牌的格式或内容。我们只是使用加密的名称-值对作为令牌。您可以在令牌中使用任何字符,但如果令牌是 URL 安全的,则处理起来会容易得多。我们通过使用 URL 安全的 Base64 对密文进行编码来实现这一点。
正如大多数人已经指出的那样。OAuth 规范没有给你确切的方向,但他们确实说......
引用自:https ://datatracker.ietf.org/doc/html/draft-hammer-oauth-10#section-4.9
“服务器应该小心分配足够长且足够随机的共享密钥,以至少在共享密钥有效的时间内抵抗此类攻击。”
“当然,我们敦促服务器谨慎行事,并合理使用最长的秘密。”
另一方面,您应该考虑浏览器的最大 URL 长度:
如果您阅读规范,它会说,
授权服务器向注册的客户端发出客户端
标识符——代表
客户端提供的注册信息的唯一字符串。客户端标识符不是
秘密;它暴露给资源所有者,并且不能
单独用于客户端身份验证。客户端标识符
对于授权服务器是唯一的。
本规范未定义客户端标识符字符串大小。
客户应避免对标识符大小做出假设。授权服务器应该记录
它发布的任何标识符的大小。
其次,访问令牌应作为标头发送,而不是作为 URL 参数发送。
授权:承载<令牌>。
OAuth 令牌在概念上是任意大小的字节序列,而不是字符。在 URL 中,它使用标准 URL 转义机制进行编码:
unreserved = ALPHA, DIGIT, '-', '.', '_', '~'
所有没有保留的东西都被 % 编码。
我不确定您是否只是谈论传递的 oauth_token 参数。通常,还需要存储和传输其他参数,例如 oauth_token_secret、oauth_signature 等。其中一些具有不同的数据类型,例如,oauth_timestamp 是一个整数,表示自 1970 年以来的秒数(以十进制 ASCII 数字编码)。
OAuth 令牌的有效字符受到 HTTP 标头值限制的限制,因为 OAuth 令牌经常在 HTTP 标头“授权”中发送。
HTTP 标头的有效字符由https://www.rfc-editor.org/rfc/rfc7230#section-3.2.6指定。或者,您可以检查一些流行的 HTTP 客户端库的 HTTP 标头验证代码,例如参见OkHttp 框架的Headers.checkNameAndValue()实用程序:https ://github.com/square/okhttp/blob/master/okhttp/src/main/ java/okhttp3/Headers.java
这还不是全部。我不会包含 HTTP 标头分隔符(; 和许多其他)和空白符号(' ' 和 '\t')和双引号(“)(请参阅https://www.rfc-editor.org/rfc/rfc7230# section-3.2.6),因为它需要在 HTTP 标头中使用之前转义 OAuth 令牌。人类在 curl 测试请求中经常使用令牌,因此好的令牌生成器不会添加此类字符。但是您应该检查哪些字符可能在做出任何假设之前,生成您的服务正在使用的 Oauth 令牌生成器。
具体来说,即使 Oauth 规范没有说明任何内容,如果您使用的是 java 和 mysql,那么它将是 16 个字符,因为我们通常使用 UUID 生成令牌并将其作为 BINARY(16) 存储在数据库中。我知道这些细节,因为我最近使用 OAuth 进行了开发。