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) 機能を使用してスクリプトを実行しようとすると、テーブルの 1 つで「キーが長すぎます」というエラーが発生しました。つまり、MySQL/InnoDB テーブルを使用しているときに見られる最大キー長の制限にぶつかりました。

この問題を回避するために、「charset=latin1」の「charset=utf8」のすべてのインスタンスを置き換えました。これは、utf8 は 1 文字あたり 3 バイトを必要とし、latin1 は 1 文字あたり 1 バイトであるためです。スクリプトは正常に実行され、すべてのテーブルが正しく作成されました。

私が見る限り、テーブルで使用されているすべてのフィールドは、マルチバイト国際文字のサポートを必要としません。問題が発生する唯一の方法は、アクセスする OAuth 接続サービスの 1 つがコンシューマ キーまたはシークレットで国際文字を使用している場合であり、これまでのところ、そのような状況に遭遇したことはまったくありません。

この回避策がいつでも私の裏側を噛むかどうか、またそれがどこにあるのか誰か教えてもらえますか? また、utf8 文字セットの使用を犠牲にすることなく「キーが長すぎる」問題を解決するためのより良い解決策がある場合は、それについて知りたいです。

4

1 に答える 1

1

技術的には、urlencoding の前にすべての文字列を utf8 でエンコードする必要があります。OAuth 1.0 仕様のセクション 5.1 を参照してください。すべてのパラメーター名と値は、[RFC3986] パーセント エンコーディング (%xx) メカニズムを使用してエスケープされます。予約されていない文字セット ([RFC3986] セクション 2.3) にない文字は、エンコードする必要があります。予約されていない文字セットの文字はエンコードしてはなりません (MUST NOT)。エンコーディングの 16 進文字は大文字でなければなりません。テキスト名と値は、[RFC3629] に従ってパーセント エンコードする前に、UTF-8 オクテットとしてエンコードする必要があります。

したがって、ASCII (ビット 7=0) でもない Latin-1 文字がある場合は、文字列をデータベースから取得した後、OAuth プロトコルで使用する前に、文字列を UTF-8 として再エンコードする必要があります。 .

于 2011-04-19T02:06:01.780 に答える