1

我正在共享服务器上设置 OAuth 支持。我要安装的服务器端 PHP OAuth 库是这个:

http://code.google.com/p/oauth-php/downloads/list

我正在关注此处的安装说明:

http://code.google.com/p/oauth-php/wiki/ConsumerHowTo

在注释中有使用安装包中的 SQL 脚本为您设置表和数据库的提示。当我尝试通过 phpMyAdmin 中的导入 (SQL) 功能执行脚本时,我在其中一张表上收到“密钥太长”错误。换句话说,我遇到了使用 MySQL/InnoDB 表时发现的最大键长度限制。

为了解决这个问题,我将所有“charset=utf8”实例替换为“charset=latin1”,因为 utf8 每个字符需要 3 个字节,而 latin1 每个字符需要 1 个字节。该脚本执行良好,所有表均已正确创建。

据我所知,表中使用的所有字段都不需要支持多字节国际字符。我看到问题发展的唯一方法是,如果我访问的 OAuth 连接服务之一在其消费者密钥或秘密中使用国际字符,到目前为止我还没有遇到过这种情况。

谁能告诉我这种解决方法是否会在任何时候以及在哪里咬我?此外,如果有人在不牺牲使用 utf8 字符集的情况下有更好的解决方案来解决“密钥太长”问题,我想知道它。

4

1 回答 1

1

从技术上讲,所有字符串必须首先进行 utf8 编码,然后才能进行 urlencoding。请参阅 OAuth 1.0 规范第 5.1 节:所有参数名称和值都使用 [RFC3986] 百分比编码 (%xx) 机制进行转义。非保留字符集([RFC3986] 第 2.3 节)中的字符必须进行编码。非保留字符集中的字符不得编码。编码中的十六进制字符必须大写。文本名称和值必须在按照 [RFC3629] 对它们进行百分比编码之前被编码为 UTF-8 八位字节。

因此,如果您有任何不是 ASCII 的 Latin-1 字符(位 7=0),那么您必须在从数据库中提取字符串之后以及在 OAuth 协议中使用它们之前将字符串重新编码为 UTF-8 .

于 2011-04-19T02:06:01.780 回答