Node.jsのAPIフレームワーク「LoopBack」を試してみる

Node.js のAPIフレームワークである「LoopBack」を試してみました。

はじめに

Google Sign-In を組み込もうとしていて、バックエンドサーバーは当初、Spring Boot で実装しようとしていましたが、学習コストが高そうなのでやめました。

Authenticate with a backend server」によると、Google Sign-In のライブラリー(正確には Google API Client library)が使えるプログラミング言語は現状、Java、Node.js、PHPPython しかないようです。

Java以外では、個人的にPHPはあまり好きでないのと、Pythonフレームワークが少なそうなので、Node.js にすることにしました。

Node.js のフレームワークはいくつかあり、最初は、名前だけ知っていた Express にしようかと思い調べ始めましたが、Express 上に作られた LoopBack というフレームワークがあることを知り、ざっと情報を調べてみたところ、なかなか良さそうだったので使ってみることにしました。

Ref. LoopBack - Compare with other frameworks

環境

  • Node.js 6.11.1
  • LoopBack 3.9.0
  • macOS 10.12.3

LoopBackのインストール

まずLoopBackのコマンドラインツールをインストールします:

npm install -g loopback-cli

Ref. Installation | LoopBack Documentation

サンプルアプリを生成

v3からは lb コマンドで行います:

$ lb
? アプリケーションの名前は何ですか? lbnotes
? プロジェクトを格納するディレクトリーの名前を入力してください: lbnotes
   create lbnotes/
     info 作業ディレクトリーを lbnotes に変更します

? どのバージョンの LoopBack を使用しますか? 3.x (current)
? どのようなタイプのアプリケーションにしますか? notes (A project containing a basic working example,
 including a memory database)
.yo-rc.json の生成中

I'm all done. Running npm install for you to install the required dependencies. If this fails, try running the command yourself.
.....

今は日本語になってるんですね。

アプリのタイプですが、以下のような選択肢があります:

? どのようなタイプのアプリケーションにしますか? (Use arrow keys)
❯ api-server (A LoopBack API server with local User auth)
  empty-server (An empty LoopBack API, without any configured models or datasources)
  hello-world (A project containing a controller, including a single vanilla Message and a single remote method)
  notes (A project containing a basic working example, including a memory database)

今回はお試しなので、最後の「notes」を選んでみました。

基本的な操作

実行
$ node .
API一覧の表示

LoopBackでは、作成したモデルに対してREST APIのエンドポイントが自動的に割り当てられます。

デフォルトでは、以下のページにアクセスすると、各APIを操作できます:

http://localhost:3000/explorer/

Ref. Use API Explorer | LoopBack Documentation

ユーザー登録

POST /Users

設定項目は、username, email, password のみです。

ログイン

/Users/login

username, password を指定します。

レスポンスの id がアクセストークンなので、画面の一番上の欄にセットすると、/Users の他のAPIも使用できるようになります。(個人のアクセスが許可されていないものは除く。)

Ref. Introduction to User model authentication | LoopBack Documentation

Notesにアクセス制限をかける

いろいろいじってみると、ログインしていなくても /Notes にアクセスできることがわかりました。

Note が User に紐付いていると自動的にアクセス制限がかかるようですが、生成されたものは単独なので、誰でもアクセスできるようです。

そこで、ログインユーザーのみがアクセスできるようにしてみます。

まず、全ユーザーに対してアクセスを禁止するACLを設定します:

$ lb acl
? ACL エントリーを適用するモデルを選択します: Note
? ACL スコープを選択します: すべてのメソッドおよびプロパティー
? アクセス・タイプを選択します: All (match all types)
? ロールを選択します All users
? 適用する許可を選択します Explicitly deny access

その後、ログインユーザーだけに許可するACLを設定します:

$ lb acl
? ACL エントリーを適用するモデルを選択します: Note
? ACL スコープを選択します: すべてのメソッドおよびプロパティー
? アクセス・タイプを選択します: All (match all types)
? ロールを選択します Any authenticated user
? 適用する許可を選択します Explicitly grant access

これで、ログインしないと /Notes にアクセスできなくなりました。

インターラクティブなコマンドがあると、設定も簡単ですね。

Ref. Controlling data access | LoopBack Documentation

あとがき

今回はサンプルプロジェクトをセットアップして、アクセス権をいじってみただけですが、第一印象はいい感じです。