ソフトコミュ開発ブログ

SoftCommu は Javaアプリ、Androidアプリの開発を行うディベロッパーです。人材教育もやっています。企業の新人研修の講師からスカイプでのオンライン家庭教師まで!技術書の執筆や翻訳もしています。
2017.08.24 Thursday
マイクロソフトの API仕様変更に伴う 「OneDrive API活用術」のサンプルコードの修正のお知らせ

マイクロソフトの OneDrive を操作するための REST API の仕様に一部変更がありました。

 

そのため、拙著OneDrive API活用術―Javaでクラウドアプリを開発する!に付属のサンプルコードを動作させるために修正が必要になりましたので、このブログ上にて変更方法等をお知らせさせていただきます。

 

なお、このサンプルコードに関する変更のお知らせは、出版元であるカットシステムのホームページ上でも告知させていただきます。

 

今回のマイクロソフトのREST API 仕様の変更点は主に下記の二点となります。

 

(1) アクセストークンを取得する REST API呼び出しの際、GETメソッドではなく、POSTメソッドを使用するようになった。

(2) アクセストークンを取得する REST API呼び出しの際、クライアントシークレットを送信する必要がなくなった。

 

上記の二点の仕様変更に伴い、サンプルコードのファイルの内、OneDrive.java を一部修正する必要が生じました。修正する必要のあるメソッドは下記の二つです。

 

requestAccessTokenByCode()メソッド

requestAccessTokenByRefreshToken()メソッド

 

上記の二つのメソッドの修正後のコードは下記の通りです。

 

↓OneDrive.java requestAccessTokenByCode() メソッド

 

↓OneDrive.java requestAccessTokenByRefreshToken() メソッド

 

上記メソッドの修正を反映させたサンプルコード全体は、「OneDrive API活用術」の出版社であるカットシステムのホームページからダウンロードが可能です。

 

マイクロソフトのアプリ登録用ページの仕様にも変更がありました。

 

https://account.live.com/developers/applications

 

以前は上記ページで Live SDKアプリケーション」を登録できるようになっていました。しかし、現在では主に「集中型アプリケーション」と呼ばれるアプリだけを登録する仕様になっているようです。

 

ややこしいのは、以前に「Live SDKアプリケーション」を登録したことのあるマイクロソフトアカウントでこのサイトにサインインした場合は、下記のような画面表示になっており、現状でも「Live SDKアプリケーション」と「集中型アプリケーション」の両方が扱えるようになっていることです。

 

 

 

しかし、これまで一度も「Live SDKアプリケーション」を登録したことのないマイクロソフトアカウントで同じページにサインインすると上記の画面は下記のような画面に置き換わります。

 

 

上記画面では、画面内に「集中型アプリケーション」という表現自体は一切表示されていません。しかし、ここで「アプリの追加」ボタンを押したときに登録できるのは「集中型アプリケーション」です。この画面からは、従来の「Live SDKアプリケーション」を登録する手段はありません。

 

どうやら、マイクロソフトは、サインインしたユーザーによって、このアプリ登録サイトの表示を変えることにより、一部ユーザーの環境では従来通りの「Live SDKアプリケーション」を引き続き扱えるようにして互換性を維持しつつ、新規ユーザーには、新しい仕様である「集中型アプリケーション」を使用してもらうよう誘導しているようです。

 

実は、従来の「Live SDKアプリケーション」として取得したアプリケーションIDとクライアントシークレットを使用する場合、「OneDrive API活用術」の出版当初に付属していたオリジナルのサンプルコードのままでも正常に動作していました。

 

しかし、「集中型アプリケーション」として取得したアプリケーションIDを使用する場合、「OneDrive API活用術」に付属していたオリジナルのサンプルコードのままですとアクセストークンの取得時に OneDriveサーバーからレスポンスコード 400が返ってくるようになってしまいました。この際、OneDriveサーバーからのレスポンスには下記のエラーメッセージが JSON形式で埋め込まれています。

 

{"error":"invalid_request","error_description":"The provided request must be sent using the HTTP 'POST' method."}

 

上記のメッセージを見ると、POSTメソッドを使って REST API を呼び出す必要があることが示唆されています。

 

では、アクセストークンを取得する際のメソッドを単純に GETからPOSTに置き換えてみましょう。そうすると、やはりレスポンスコード400が返ってきますが、エラーメッセージは下記のように変化します。

 

{"error":"invalid_request","error_description":"The provided request must have content-type 'application/x-www-form-urlencoded'."}

 

なるほど。Content Type を application/x-www-form-urlencoded にする必要があるというわけですね。では、そのようにコードを修正してみましょう。

 

HttpPost request = new HttpPost(url);

request.setHeader("Content-Type", "application/x-www-form-urlencoded");

 

上記のようにコードを修正してから実行するとやはりレスポンスコード400が返ってきます。エラーメッセージは下記の通りです。

 

{"error":"invalid_client","error_description":"The provided request must include a 'client_id' input parameter."}

 

なるほど。POSTメソッドのボディ内に client_id パラメータを指定することが必要なわけですね!

 

というわけで、上記の問題をすべて解決したのが、冒頭に示したrequestAccessTokenByCode()メソッドとrequestAccessTokenByRefreshToken() メソッドのソースコードということになります。

 

マイクロソフトのページで、新しくアプリを登録する場合、下図のような画面が表示されますが、Mobile and Desktop AppWindows Desktop (.NET) を選んでください。

 

 

上記のWindows Desktop (.NET) のアイコンをクリックすると、ページが切り替わり、ウィザード形式で設定が進んでいくのですが、すべてのページにおいて特に設定すべき内容もありませんし、記録しておくべき情報も無いので、どんどん次のページへと進んでいきましょう。最終的に画面に「アプリケーションID」が表示されれば設定は完了です。すべての設定が完了した後の画面は下記のようになります。

 

 

上記の画面では、「アプリケーションシークレット」の下に「新しいパスワードを生成」とか「新しいキーの組を生成」とか「公開キーのアップロード」といったボタンがありますが、「OneDrive API活用術」のサンプルコードを実行するためにこれらのボタンを操作する必要は一切ありません。この画面では、アプリケーションIDさえ取得できれば、それでOKです。

 

以前のようにアクセストークンを取得する際にクライアントシークレットを指定する必要はなくなりました。そのため、「OneDrive API活用術」のサンプルコードでは、JavaOneDrive.java 内で定義していた CLIENT_SECRET という static変数 に空文字列を代入していただければと思います。下記のようになります。

 

private static final String CLIENT_SECRET = "";

 

長くなりましたが、上記のとおりサンプルコードを変更していただければ「OneDrive API活用術」のサンプルプログラムは問題なく動作するようになります。これまでサンプルコードがうまく動作せずにご迷惑おかけした読者の皆様、大変申し訳ございませんでした。

 

今回の記事を準備するに際して、「OneDrive API活用術」の読者のお一人である川口直也さんから寄せられた情報を参考にさせていただきました。

 

川口直也さんは、「OneDrive API活用術」の出版元であるカットシステムにご連絡をくださり、私も直接お話させていただきました。OneDrive のアセストークンを取得するマイクロソフトのREST APIの仕様変更の詳細や REST API の呼び出しのJavaコードの具体例をお送りくださったことに本当に感謝いたします。

 

実は、Amazonの書評の中でマイクロソフトの仕様変更やアクセストークンを取得するためにGETメソッドからPOSTメソッドにコードを書き換える必要があることに関するコメントがあることは、筆者でもある私も気づいておりました。ただ、私自身はうかつにもマイクロソフトの仕様変更前に取得してあった従来の Live SDK のアプリIDを使用して動作確認してしまっていたのです。その場合、旧コードのままでもサンプルプログラムは問題なく動作します。そのため、なぜ Amazonの書評でそのようなコメントが入っているのか理解できていなかったのです。

 

しかし、川口直也さんからのご指摘で、マイクロソフトのアプリ登録ページで新たに取得したアプリケーションIDを使った場合には、元のサンプルコードのままでは動作しなくなっていることに気づきました。アクセストークンの取得時にクライアントシークレットの指定が必要なくなったことに関しても川口さんからのご指摘で気づいた次第です。いろいろご親切に教えていただいた川口直也さんに心から感謝いたします。

 

川口直也さんは下記のWEBサイトを運営しておられます。バラエティ豊かなツールやサービスを開発しておられますね!

 

http://www.loxsols.com

 

以上、マイクロソフトの仕様変更に伴う 「OneDrive API活用術」のサンプルコードの変更内容のお知らせでした。

 

 

| SoftCommu | - | 09:56 | comments(0) | - |
1234567
891011121314
15161718192021
22232425262728
293031    
<< October 2017 >>
+ 人気の記事
1位: ズバリ、ラムダ式 (Lambda)とは何か? それを使うと何がうれしいのか?

2位: Android エミュレータが起動しない場合の復旧手順

3位: Android Studio で "SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable" と表示される問題の原因と対応策

4位: Android 7.0 から Intent の getSerializableExtra() が使えなくなってしまいました!

5位: エミュレータの Google Play Services のバージョンが古いために Google Maps などを使用したアプリが動作しない場合の対応策

6位: Proguard を使用してリリース用APKを出力しようとした際にエラーになるケースの対応策

7位: OneDrive でオフィス文書が同期できなくなるケースの対応策

8位: Java で Firebase を使う方法のまとめ。

9位: Arduino の開発環境に ZIP形式のライブラリをインストールできない場合の対処方法

10位: Bitbucketから、指定した時点でのファイルをすべてまとめて zip でダウンロードする方法

11位: Android Studio で2台のパソコンを行き来しながら開発作業をする方法

12位: AWS (Amazon Web Service) で動作している WEBアプリを SSL対応(HTTPS対応)にする

13位: AWS (Amazon Web Service) の公式ドキュメントで 「HTTPS を終了する」とはどういう意味か?

14位: エクリプスでテキストエディタの背景色を黒っぽくしたらデバッグ中にどの行にいるのかわからなくなった場合の対応策

15位: 任意のレジストラで取得したドメインのSSL認証を AWS で無料で取得し、Elastic Beanstalk の WEBアプリを https で公開するまでの手順まとめ

16位: マイクロソフトの API仕様変更に伴う 「OneDrive API活用術」のサンプルコードの修正のお知らせ

+ ARCHIVES
+ CATEGORIES
+ MOBILE
qrcode
(C) 2016 SoftCommu All Rights Reserved.