認証が必要な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向けのアプリケーションでしか使えないという制限がありますので、注意しましょう。