認証が必要なAPIを実装する
今の実装だと、全てのユーザがAPIを実行できてしまいますので、データを上書きする機能を持つ"myFirstAPI.myModel.insert"メソッドだけは認証が必要にしてみましょう。
"YourFirstAPI"クラスの@Apiアノテーションに、次のようにclientidsパラメータを追加します。
@Api(name = "myFirstAPI", version = "v1",
clientIds = {com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID})
通常clientidsパラメータの値には、APIを利用するクライアントアプリケーションのClientID文字列の配列を設定します。しかし、今回はAPIを利用するクライアントアプリケーションはAPI Explorerだけですから、API Explorer用のClientIDを指定しています。
なお、自分のアプリケーション用のClientIDは、Developer Consoleで作成したプロジェクトから発行することができます。その手順は前回紹介していますので参考にしてください。
次に、insertメソッドにcom.google.appengine.api.users.Userクラスの引数を追加します。
そして、メソッド内でその値がnullかどうかをチェックし、nullだった場合にはOAuthRequestExceptionを投げるようにします。
@ApiMethod(name = "myModel.insert", path = "myModel/insert")
public MyModel insert(MyModel myModel, User user) throws OAuthRequestException {
if (user == null) { throw new OAuthRequestException("ログインしないとダメ!"); }
...
これらの修正を実装したらmvn appengine:devserverを再度実行し、ログインしていない状態で"myFirstAPI.myModel.inert"を実行してみてください。"401 Unauthorized"が返されて、実行に失敗するようになります。
なお、ログインしているかしていないかは、APIを実行する画面の右上の方にある「Authorize requests using OAuth 2.0」を見ればわかります。ここが「OFF+赤いアイコン」ならログインしていない状態、「ON+青いアイコン」ならログインしている状態です。ON/OFFボタンをクリックすると、ログイン状態を切り替えられます。
Cloud Endpointsでは、このようにして認証の有無をチェックできます。今回はクライアント側の実装を行いませんでしたが、クライアント側は通常のGoogle APIと全く同じように、OAuth2を使った認証によりAPIを利用できますから、実装も簡単です。
今回は、ユーザがログインしていない場合にOAuthRequestExceptionを投げることで"401 Unauthorized"をクライアント側に返しましたが、Cloud Endpointsライブラリには、それ以外のHTTPステータスを返す場合に使用する例外がいくつか定義されています。Exceptions and HTTPにそれらの一覧が記載されています。
なお、このページには401 Unauthorizedに対応するUnauthorizedExceptionが記載されていますが、公式リファレンスのUsing Auth with EndpointsではOAuthRequestExceptionを返すよう記述されているので、本記事ではそれに従いました。
まとめ
今回紹介したように、Cloud Endpointsの機能を使っていくつかのアノテーションを使用するだけで、自分のアプリケーションのAPIを簡単にAPI Exolorerに対応させることができます。API Explorerが使えると、クライアント側の開発者に「今動作しているAPIの仕様」を伝えるのも楽になります。クライアント側の開発者が他のGoogle APIの経験者であった場合は、APIの使用方法も伝わりやすいという効果もあります。
ただし、今のところGoogle App Engine向けのアプリケーションでしか使えないという制限がありますので、注意しましょう。



