2

base64 で認証ヘッダーをデコードする grails コントローラーがあります。これを CURL を使用して PHP スクリプトから送信しました。

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "testindia01@test.com:india123");

私のgrailsコンソールのログには次のように表示されます:

Authorization raw: Basic dGVzdGluZGlhMDFAdGVzdC5jb206aW5kaWExMjM=, isBase64: true
Authorization decoded: ´"q—ïÕ—•πë•Ñ¿≈—ïÕ–πçΩ¥È•πë•Ñƒ»Ã

上記のケースでは、Commons Base64 クラスを使用していますが、Groovy 組み込みの decodeBase64 を使用しても同じ結果が得られます。

Authorization raw が入ってくるのは正しいです。これをコピーして PHP の ecode にプッシュすると、適切にデコードされます。

echo base64_decode('dGVzdGluZGlhMDFAdGVzdC5jb206aW5kaWExMjM=');

文字列をコントローラーに直接コピーすると、たとえば

def decode = new String(Base64.encodeBase64("dGVzdGluZGlhMDFAdGVzdC5jb206aW5kaWExMjM="))

次に、これも正しくデコードします。

リクエスト経由でヘッダーを取得します

def auth = request.getHeader("Authorization")

私はそれが有効なbase64文字列であることをテストします

Base64.isBase64(auth)

失敗するのはデコードだけです。デコード時にエンコーディングを変更してみました。

デフデコード = 新しい文字列 (auth.decodeBase64(), "UTF-8")

ISO-8859-1 や Windows-1252 などの他のエンコーディングと同様に、毎回異なる不正な文字列が返されます。

また、CURL リクエストで Accept-Encoding を手動で設定しようとしました。

私はアイデアがありません:(

4

1 に答える 1

1

これは、getHeader の戻り値の一部として「Basic」が含まれているためです。これを剥がすとうまくいきます。Base64.isBase64 は、文字が base64 アルファベットであることのみをチェックするため、「Basic」である必要があります。

于 2013-01-08T15:46:26.823 に答える