ラベル FileReference の投稿を表示しています。 すべての投稿を表示
ラベル FileReference の投稿を表示しています。 すべての投稿を表示

2009年10月8日木曜日

GAE+Flex+ファイルアップロード+認証

GAE上でFlexを使用してファイルアップロードを行っているのですが
どうもうまくいかない状態でした。
まぁオススメはできませんが回避策を一応書いておきます。

FireReference.uploadはセキュリティ系の問題なのか
クッキーを送信できません。
ここのにupload()のURLRequestHeaderのところに記述があります。

GAEでは認証アプリ内ではクッキーを使用して認証を確認しているようで
JSESSIONIDとACSIDを送信することが不可能なようです。

なのでGAE上でFileReferenceを利用してアップロードをすると
アップロード時に認証エラーでアップロードができないようです。

そこで、私の場合はアップロードのURLを認証から外して独自認証することで切り抜けました。
Flexが送信するRequestに引数をjsessionidを指定しておいて
認証のかかってないURLの処理上でSessionからIDを取得して同一かを判定して切り抜けました。

まぁセキュリティ上は微妙でしょうけど、
一応認証を受けてないと使えないようにはしました。



で、、、ここで気をつけなければいけないのは
FileReferenceで渡すURLRequest.dataをObjectではなく、
URLVariablesにすることです。
そうしないとRequestでmultipartにならず、
multipartで値を受け取れないからです。(slim3)

2008年11月23日日曜日

FileReferenceのセッション継続

Flexでのアップロード、ダウンロードを行う場合
「FileReference」を使用しますが、
WebServiceなどを通じて接続されたセッション情報を継続できません。
下記行わなくてもIEでは操作できましたが、
FirefoxやCromeでは不可能でした。おそらくCookieの関係でしょうね。


私の場合はTomcat→Strutsを使用してサービスを構築していますので
ActionForm値を使用してアップロードを行います。
Session継続を行っても新しいFormのインスタンスを生成してしまいます。
なので初回インスタンスを生成した時にRequestから


request.getSession().getId()


の値を取得して、Flexに返します。
FlexではセッションIDを何らかの形で保存しておきます。
でFileReferenceを使用する際に使用するURLRequestが使うURLに
jsessionidとして設定してあげます。


var request:URLRequest = new URLRequest();
request.url = uploadUrl + ";jsessionid=" + sessionId;
reference.upload(request);


すると同一のセッションで値をやりとりすることが可能です。
能書きから行くとおそらくログイン情報の共有等もこれでできるでしょう。

セキュリティ的にこれでよいのかは不問の方向で!