Silverlightのクロスドメイン制約
昨今、SilverlightやFlashなどでいろんなWebAPIに接続して、ちょっとしたガジェットを作ってみたいと
思っている方も結構いるのでは思います。
そこで、常に問題なるのがクロスドメイン制約の問題です。Silverlightでは接続する先のドメイン(サブドメインを含む)が
Silverlightアプリがホストされているサーバのドメインと一致してない場合、「SecurityException」が発生してしまいます。
これを回避するためには、ドメインのルートに「クロスドメインポリシーファイル」が置かれている必要があります。
Silverlightは独自の「clientaccesspolicy.xml」に加えて、Flash標準の「crossdomain.xml」にも対応しています。
「crossdomain.xml」に関してはそこそこいろいろなAPIが対応しています。
例えば、実際に試してはいないのですが、「Yahoo API」ではここに置かれています。
しかし、対応していないAPIもあります。メジャーなところで言うと「Google Data API」がそうです。
対応を求めるフォーラムも設置されていますが、今のところ動きはないようです。
Google App Engineを仲介してのクロスドメイン接続
そこで、私が試してみたのが、「Google App Engine」を介したAPIのアクセスです。「Google App Engine」は誰でもが無料で利用できる
クラウドサービスです。
まず、Silverlightアプリを「Google App Engine」にホストします。
(他の記事で、Silverlightアプリを「Google App Engine」にホストする方法を紹介していますので是非、そちらも読んでみてください。)
そして、Silverlightアプリからホストされている「Google App Engine」に接続するコードを書きます。これは
ダウンロード元のドメインに接続することになるので、クロスドメイン制約の問題はありません。
そして、「Google App Engine」から目的のWeb APIに接続するようにします。
つまり、「Silverlight」-「Google App Engine」-「Web API」という3階層のアーキテクチャにすることになります。
以下のコードは「Google App Engine」でYoutubeのおすすめエントリのFeedを取得するコードです。
[urlfetch]というクラスを利用すると「Google App Engine」からWeb上の他のサービスに接続して、
コンテンツを取得してくることが出来ます。
ポートはHTTP(80)とHTTPS(443)に限定されています。MethodはGET、POST、 PUT、 HEAD、DELETEが使用できます。
そして、何と!、今記事を書きながら、「Google App Engine」の
ドキュメントページを開くとJava版のEarly Lookが掲載されています!!
今まで、不慣れなPythonに苦戦してきた私としては、とても嬉しいです。
Google App Engineを介した場合の認証
Google Data APIのほとんどの機能は認証を必要としています。2階層アプリケーションの場合は、クライアントとWebAPIが
直接やり取りするので特に問題ないのですが、3階層モデルになると、一旦中間層(「Google App Engine」)が
ユーザの認証情報を受け取る必要が出てきます。Googleアカウントに関してはかなりいろいろなことが出来るため、
ユーザとしても、サービスを提供する側としても、このデリケートな情報を直接扱うことは是非避けたいところです。
それを回避する方法として、Google Data APIでは「OAuth(オース)」というプロトコルを実装しています。
次回の記事で詳しく書いてみたいと思います。
昨今、SilverlightやFlashなどでいろんなWebAPIに接続して、ちょっとしたガジェットを作ってみたいと
思っている方も結構いるのでは思います。
そこで、常に問題なるのがクロスドメイン制約の問題です。Silverlightでは接続する先のドメイン(サブドメインを含む)が
Silverlightアプリがホストされているサーバのドメインと一致してない場合、「SecurityException」が発生してしまいます。
これを回避するためには、ドメインのルートに「クロスドメインポリシーファイル」が置かれている必要があります。
Silverlightは独自の「clientaccesspolicy.xml」に加えて、Flash標準の「crossdomain.xml」にも対応しています。
「crossdomain.xml」に関してはそこそこいろいろなAPIが対応しています。
例えば、実際に試してはいないのですが、「Yahoo API」ではここに置かれています。
しかし、対応していないAPIもあります。メジャーなところで言うと「Google Data API」がそうです。
対応を求めるフォーラムも設置されていますが、今のところ動きはないようです。
Google App Engineを仲介してのクロスドメイン接続
そこで、私が試してみたのが、「Google App Engine」を介したAPIのアクセスです。「Google App Engine」は誰でもが無料で利用できる
クラウドサービスです。
まず、Silverlightアプリを「Google App Engine」にホストします。
(他の記事で、Silverlightアプリを「Google App Engine」にホストする方法を紹介していますので是非、そちらも読んでみてください。)
そして、Silverlightアプリからホストされている「Google App Engine」に接続するコードを書きます。これは
ダウンロード元のドメインに接続することになるので、クロスドメイン制約の問題はありません。
そして、「Google App Engine」から目的のWeb APIに接続するようにします。
つまり、「Silverlight」-「Google App Engine」-「Web API」という3階層のアーキテクチャにすることになります。
以下のコードは「Google App Engine」でYoutubeのおすすめエントリのFeedを取得するコードです。
from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app from google.appengine.api import urlfetch class GetYoutubeFeed(webapp.RequestHandler): def get(self): result = urlfetch.fetch('http://gdata.youtube.com/feeds/api/standardfeeds/recently_featured?start-index=1') self.response.out.write(result.content) application = webapp.WSGIApplication( [('/youtube_feed',GetYoutubeFeed)], debug=True)
[urlfetch]というクラスを利用すると「Google App Engine」からWeb上の他のサービスに接続して、
コンテンツを取得してくることが出来ます。
ポートはHTTP(80)とHTTPS(443)に限定されています。MethodはGET、POST、 PUT、 HEAD、DELETEが使用できます。
そして、何と!、今記事を書きながら、「Google App Engine」の
ドキュメントページを開くとJava版のEarly Lookが掲載されています!!
今まで、不慣れなPythonに苦戦してきた私としては、とても嬉しいです。
Google App Engineを介した場合の認証
Google Data APIのほとんどの機能は認証を必要としています。2階層アプリケーションの場合は、クライアントとWebAPIが
直接やり取りするので特に問題ないのですが、3階層モデルになると、一旦中間層(「Google App Engine」)が
ユーザの認証情報を受け取る必要が出てきます。Googleアカウントに関してはかなりいろいろなことが出来るため、
ユーザとしても、サービスを提供する側としても、このデリケートな情報を直接扱うことは是非避けたいところです。
それを回避する方法として、Google Data APIでは「OAuth(オース)」というプロトコルを実装しています。
次回の記事で詳しく書いてみたいと思います。
コメント
コメントの投稿
トラックバック
http://csfun.blog49.fc2.com/tb.php/44-310b2791