Flex アプリケーションを使用していますが、Java サーバー アプリケーションへの安全なログオン/ログオフに問題があります。開発環境 (Flex を実行し、Apache Tomcat と通信する FlashBuilder) では正常に動作しますが、同じ Tomcat にデプロイされたときにエクスポートされたフレックス アプリケーションを使用しようとすると失敗します。
Tomcat で Web アプリケーションとして実行される、Flex フロントエンドと Java バックエンドを備えた大規模で複雑なアプリケーションがあります。ログイン/ログアウト プロセスで HTTPS を使用して、ユーザー名とパスワードが暗号化され、特定のセキュリティの問題が発生しないようにする必要があります。
セキュリティで保護されていないログインが機能する方法は、login と呼ばれるメソッドへの BlazeDS RPC 呼び出しを介して行われます。メソッドへのパラメーターとしてのユーザーの資格情報。 (余談ですが、これはログインを実行するための推奨される方法ですか?)
セキュア ログインの動作は異なります。ユーザー ID とパスワードが提供された channelSet からトークンが作成され、AsyncResponder が成功または失敗関数を呼び出します。ログイン コードは、以下の更新 #2 に示されています。
Flash Builder でアプリケーションを Apache Tomcat (ver 7.0.29) に対して実行すると、安全なログインとログアウトが成功します。これは、標準実行モードかデバッグ モードかに関係なく機能します。
ただし、アプリケーションを作成してサーバーにデプロイすると、非常に一般的なエラーで失敗します。
Tomcat の HTTPS 側を正しくセットアップしたと確信しています (アプリケーションは開発環境で動作するため)。問題は、Flex アプリケーションが動作しfile:///...index.html
ているときに問題があると思いますが、Flex アプリケーションを実行しようとするとすぐhttp://localhost:8080/MyApp/
に失敗します。
私は何日もこれで髪を引っ張っています。誰でも提供できるポインタ、ドキュメントなどをいただければ幸いです。
services-config.xml、remoting-config.xml などのファイルは大きく、ここに関連する以上のものが含まれているため、この質問には含めないことにしましたが、要求に応じて提供できます。
更新: 1
私がリリースしたコードを見直した後、私はこの質問で誤りを犯しました。ログイン RPC メソッドは安全でないログイン試行に使用され、mx.messaging.ChannelSet を介したログインは安全なログインに使用されます。これを反映するように質問を更新しました。
更新: 2
返されるエラーはmx.rpc.events.FaultEvent
、次のフィールドを持つ です。
Fault String: Send failed
Fault Code: Client.Error.MessageSend
ログオン機能 (Flex 側) は次のとおりです。
public function login(username:String, password:String, loginFunction:Function = null, failureFunction:Function = null):void {
if (_usingSecuredConnection) {
this.loginSuccessFunction = loginFunction;
this.loginFailureFunction = failureFunction;
// Make sure that the user is not already logged in.
if (_channelSet.authenticated == true) {
AlertUtil.alertError("You are already logged in!");
return;
}
token = _channelSet.login(username, password);
token.addResponder(new AsyncResponder(loginResultEvent, loginFaultEvent));
} else {
// Defer to API
SecurityAPI.login(username, password, [onLoginResultNonSecured, loginFunction], [onLoginFailure, failureFunction]);
}
}
安全にログインしようとすると、上記のように、関数 loginFaultEvent が呼び出され、FaultEvent が呼び出されます。
アップデート 3
これは現在、クロスドメインの問題であると確信しています。http から https にアクセスしようとするのが問題です。しかし、Tomcat サーバーの ROOT webapp に非常に寛容なクロスドメイン ファイルだと思うものを入れましたが、役に立ちませんでした。私が間違っていることを知っている人はいますか?Tomcat7 の場所が間違っているのでしょうか、それともクロスドメイン ファイルに誤りがありますか? (注: 8443 は私の安全なポートです)
crossdomain.xml :
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all" />
<allow-access-from domain="*" secure="false" to-ports="8443"/>
<allow-http-request-headers-from domain="localhost" headers="*" secure="false"/>
</cross-domain-policy>
更新 4
この問題は解決しました。これはクロスドメインの問題であり、Tomcat サーバーの ROOT webapp ディレクトリにクロスドメイン ファイルを配置することで修正されました。そのクロスドメイン ファイルの内容は次のとおりです。
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" secure="false"/>
</cross-domain-policy>
私の Flex アプリケーションは、IE9 と Chrome を使用して HTTP と HTTPS を正常に通信できるようになりました。
ただし、Firefox ではまだ動作しません。
ありがとう、
フィル