松崎 剛 Blog

This Blog's theme : エンタープライズ開発 (Server side)、Office サーバ開発

SkyDrive REST API を使った Web アプリケーション開発 (Sample Code)

SkyDrive REST API を使った Web アプリケーション開発 (Sample Code)

Rate This
  • Comments 0

[This article's sample code is 20111219_CloudStorageSample (GitHub).]

こんにちは。

以前の投稿 で、Windows Live SkyDrive を扱ったプログラミングについて軽く触れましたが、ご存じの方も多いかと思いますが、SkyDrive の開発環境として、新たに REST API が提供され、これを使用した Live SDK v5.0 も提供されています。(下記ドキュメントを参照。)
今回は、この REST API (新しい Live Connect APIs) について簡単に紹介したいと思います。

補足 : 従来は SkyDocsService.svc というプログラムから利用可能な (SkyDrive の) サービスが提供されていましたが、正式に開発者向けにリリースされているサービスではなく、���キュメントもほとんどありませんでした。今回は、下記の通り、ちゃんと公開されたサービスになっています。(なお、これに伴い、この SkyDocsService.svc は、どうも廃止されてしまったようです。。。)

[MSDN] SkyDrive Core Concept
http://msdn.microsoft.com/en-us/windowslive/hh561489

[MSDN] SkyDrive REST API の一覧 (フォルダー操作 / ファイル操作 関連)
http://msdn.microsoft.com/en-us/windowslive/hh561740

アプリケーション構築のおおまかな流れは以下の通りです。

  1. OAuth 2.0 による Windows Live の認証処理をおこないます。
  2. そして、受け取ったアクセス トークン (access token) を使って、Windows Live SkyDrive などの REST API を呼び出します。

今回は、Live SDK は使用せず、Windows Live SkyDrive の REST API を直接呼び出す方法について注意点などを記載します。

まず、Windows Live の OAuth 2.0 を使った認証とアクセス トークン (access token) の取得までの流れについては、以下に手順や考え方がまとまっていましたので、是非 参考にしてください。(下記に要点なども整理されていますので、ここでは、説明を省略します。)

[gihyo.jp] 使ってみよう! Windows Live SDK/API
http://gihyo.jp/dev/serial/01/wl-sdk/0045?page=1

補足 : この際、以下の 2 点に注意してください。
まず、上記で使用している CLIENT_ID などは、あらかじめ、下記から取得します。
https://manage.dev.live.com/Applications/Index
特に、Web アプリケーション開発の場合、認証時にリダイレクトをおこないますが、この際、リダイレクト先のドメインとして、ここで設定した [Redirect Domain] を使用しないとエラーになるので、デバッグ方法などに注意してください。(例えば、[Redirect Domain] に本番環境のアドレスを入れて、ASP.NET 開発サーバーの localhost などから使うことはできません。いったん Authentication Code などを取得してからローカル環境でデバッグをおこなうなど、工夫してください。)

また、もう 1 つの注意点として、以下で紹介するサンプルを動かすには、Scope として wl.skydrive_update を必ず含めてください。Scope は、SkyDrive の利用目的に応じて適切な値を設定する必要があり、ドキュメントの参照のみの場合は wl.skydrive で充分ですが、下記のように更新 (ファイル登録など) をおこなうには wl.skydrive_update を指定します。(なお、Scope を複数指定するには、wl.signin%20wl.skydrive_update のように指定します。)

補足 : OAuth 2 を使った認証処理をおこなうライブラリーとして、DotNetOpenAuth を使うこともできます。この方法については、こちらのブログ で解説されています。(ここでは、説明を割愛します。)

アクセス トークン (Access Token) が取得できたら、あとは、REST API を呼び出すだけです。

例えば、フォルダー一覧 (SkyDrive のフォルダー一覧) を取得する場合は、以下の通り呼び出します。(下記で、Access Token Value には、取得したアクセス トークンの値を設定してください。)

GET https://apis.live.net/v5.0/me/skydrive/files?access_token=Access Token Value HTTP/1.1

なお、結果は、下記の通り Json で返ってきますので、DataContractJsonSerializer、または WCF Web Api の JsonValue などを使用して、結果を取得してください。(下記の通り、返り値の型は決まっていますので、前者でも充分です。)

{
  data :
  [
    {
        "id": "folder.9c0af81b735e29ea.9C0AF81B735E29EA!113",
        "from":
        {
          "name": "剛 松崎",
          "id": "9c0af81b735e29ea"
        },
        "name": "写真",
        "description": null,
        "parent_id": "folder.9c0af81b735e29ea",
        "upload_location": "https://apis.live.net/v5.0/folder.9c0af81b735e29ea.9C0AF81B735E29EA!113/files/",
        "count": 0,
        "link": "https://skydrive.live.com/redir.aspx?cid\u003d9c0af81b735e29ea\u0026page\u003dview\u0026resid\u003d9C0AF81B735E29EA!113\u0026parid\u003d9C0AF81B735E29EA!112",
        "type": "folder",
        "shared_with":
        {
          "access": "Just me"
        },
        "created_time": "2008-11-04T05:39:24+0000",
        "updated_time": "2008-11-04T05:39:24+0000"
    },
    {
      ...

    },
    {
      ...

    }
  ]
}

また、以下は、フォルダーへファイルを登録 (アップロード) します。
下記で、folder.9c0af81b735e29ea.9C0AF81B735E29EA!114 はフォルダーの ID で、上記の結果から取得できます。(また、保存するファイルの種類に応じて Content-Type を設定してください。下記の例では、Word 文書をアップロードしています。)

POST https://apis.live.net/v5.0/folder.9c0af81b735e29ea.9C0AF81B735E29EA!114/files?access_token=Access Token Value HTTP/1.1

Content-Type: multipart/form-data; boundary=A300tsmatsuzdemox

--A300tsmatsuzdemox
Content-Disposition: form-data; name="file"; filename="test.docx"
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document

Word 文書のストリーム、または、そのエンコード文字列 . . .

--A300tsmatsuzdemox--

この SkyDrive の REST API を使用した Web アプリケーション (ASP.NET MVC) のサンプルを下記に作成しましたので、細かなプログラミング方法などについてはソース コードをご参照ください。C# のサンプル コードですが、.NET 以外の開発言語からでも、同様に実装できます。(Json の Parse の箇所は、開発言語にあわせて適した方法で実装してください。)

デモ サイト :
http://cloudstoragesample.cloudapp.net/

ソース コードの Download (GitHub) :
https://github.com/tsmatsuz/20111219_CloudStorageSample

このサンプル アプリケーションの使い方は、「Office & Office 365 Development Sample」 に追記しました。
このサンプルでは、OpenXML SDK で作成した Word 文書を SkyDrive に保存しています。(Json の処理では、DataContractJsonSerializer を使用しています。) Word 2007 以上を持っていないユーザーでも、SkyDrive の Office Web Apps で (ブラウザーを使って) 閲覧できます。

補足 : Access Token は、上記の通り URL の Query String に指定するため危険に思えますが、1 時間ほどで期限切れ (Expire) になります。このダウンロード サンプルでは省略していますが、期限切れの場合、再度、同じステップで Access Token を取得しなおしてください。(利用者が同一ブラウザーを使用している場合、Windows Live ID が設定する Cookie が残っているため、ユーザー ID / パスワードの入力画面は表示されず、accss_token を取得できます。)
また、利用者がブラウザーを閉じたあとでも、Refresh Token と呼ばれるものを使用して新しい Access Token を取得しなおすことで、処理を継続できます。(上記のダウンロード サンプルに、コメントとして記載しています。) Refresh Token を取得するには、最初の Authentication Code の取得の際 (ログインの際) に、scope として wl.offline_access を追加してください。また、Refresh Token を使用して Access Token を取得する際は、下記のデータを POST してください。
client_id=...&redirect_uri=...&client_secret=...&refresh_token=...&grant_type=refresh_token

 

Leave a Comment
  • Please add 1 and 8 and type the answer here:
  • Post