BlazeDSで認証する。

日本語ではもちろんのこと、英語でググっても全然見つからなくて、仕方がないとDeveloper Guideを読んだにも関わらずわからなくて埋めてしまっていたことが解決したので大公開。
リファレンスを見るとそれっぽいメソッドやらイベントやらが見つかるんですが、どうやって使ったらいいのかがわからなかったんですよ。サンプルコードが見つからない。
で、結論からいうとChannelSet#login()とChannelSet#logout()を使うのが正解。
そして認証されているか否かはChannelSet#authenticatedを見ればよい。ただ、権限があるか(authorized)ってのはまた別のはなし。
これはChannelSetからは知ることができないみたい。で、どうしたかというと・・・
詳しくはこちらに貼り付けたコードをどうぞ。親切に答えてくれた皆さんに感謝!

Adobe Forums – How to *reset* credentials with Consumer?

Yoshiyuki MIKAMI – 09:33am Mar 5, 2008 Pacific



—-ここからはそこにたどり着くまでの経緯。
メッセージングをするにはConsumerとProducerを使いますが、こいつらがそれぞれMessageAgentを継承してsetCredentials()とlogout()なんていうそれらしいメソッドを持っていたってのが事の発端。

mx.messaging パッケージ – Adobe® Flex™ 3 リファレンスガイド

mx.messaging パッケージには、Data Services で使用するメッセージクラスが含まれています。
(どうも実装とドキュメントが一致していないんですがね・・・。)

Consumer#subscribe()やProducer#send()を呼ぶ前にCredentialsをセットしておくと、認証を要求されたときにこれを勝手に使ってくれるんですよ。実際になにかやろうとしたときに初めてこれが使われる。
つまり、セットした時点ではユーザとパスワードが合っているかどうかわからない。
そして、login()はないのにlogout()はそれぞれある。この時点でなにかがおかしい。
でも先に進みたいのでConsumer#subscribe()の時に起こる認証失敗や権限なしのイベントを捕まえてなんとかしてました。
(MessageFaultEventやらChannelFaultEventやら)

ここまでで、とりあえずログインとログアウトはできたなーと思っていたら別の問題が。
別のユーザに切り替えたいとか、同じユーザでもログアウト後に再ログインするっていうオペレーションはふつうに起こることですが、これができない。
具体的には、Consumer#logout()のあとにConsumer#setCredentials()を呼ぶとエラーになる。

Error: Credentials cannot be set while authenticating or logging out.
at mx.messaging::Channel/setCredentials()
at mx.messaging::ChannelSet/setCredentials()
at mx.messaging::MessageAgent/setCredentials()

それじゃあってことで、Consumer#logout()を呼ばずにConsumer#setCredentials()を呼んでもエラーになる。

Error: Credentials cannot be set when already authenticated. Logout must be performed before changing credentials.
at mx.messaging::Channel/setCredentials()
at mx.messaging::ChannelSet/setCredentials()
at mx.messaging::MessageAgent/setCredentials()

ね、まったく矛盾してるじゃないですか。詰んでるじゃないですか。

ここからが長かった。setCredentials()やlogout()はConsumerとProducerから呼んでいるのに、認証はそれらが通信に使っているChannel(Set)単位で行われているっていう仕様(ConsumerでログアウトするとProducerも自動的にログアウトする!)も手伝って、なにがなにやらわからなくなってました。
ソースをこねくり回してみたり、言及されているドキュメントを探しにLiveCycleの方まで足を伸ばしたり。
それを何日か繰り返して、くじけそうになったときに気がついたのが↑のフォーラムだったと。

歴史的経緯で云々ってのに引っかかると抜け出すのがつらいってのを改めて感じたのでした。

コメント

  1. nobu より:

    あなたはやっぱり凄いよ!!

  2. yoshuki より:

    ほめられた!ありがとう!

タイトルとURLをコピーしました