0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ニフクラ mobile backendを拡張するNCMBプロキシを開発中です(リアルタイム通信)

Posted at

ニフクラ mobile backendでは認証やデータストア(クラウドデータベース)、ファイルストア(ファイルストレージ)、プッシュ通知など様々な機能があります。そして、サーバーレスで拡張できるスクリプト機能もあります。

しかし、実際のアプリ要件は多彩で、場合によっては他にも様々な機能が望まれます。すべての需要を満たすのは困難な場合もあります。そこで、NCMBのフロントとして動作するプロキシソフトウェアを開発中です。

このプロキシを使うことによって、小さなニーズはプロキシ側で実装できるようになります。今回紹介する機能はチャットなどで使えるであろうリアルタイム通信機能です。

追加する機能(予定)

現状は透過的なプロキシでしかありませんが、以下のような機能を実装する予定です。

  • 認証をJSON Web Tokenに
  • GitHub認証
  • ソーシャル認証(標準ではサーバー認証が必要ですが、プロキシだけで認証できるように)
  • Webhooks
  • 署名なしでデータストア操作
  • 全リクエストログ記録

他にもデータストアの集計機能、GraphQL機能なども追加できると便利そうです。なお、Webhooksなどの機能はプロキシ経由でしか実現できませんので注意してください(管理画面で操作しても実行されません)。

インストール

NCMBMania/ncmb-proxyのリポジトリをクローンします。

git clone git@github.com:NCMBMania/ncmb-proxy.git

ライブラリをインストールします。

npm i

設定の編集

setting.example.yml をコピーして setting.yml を作成します。そして、ファイル内にあるアプリケーションキー、クライアントキーをそれぞれお持ちのものに書き換えてください。

applicationKey: YOUR_APPLICATION_KEY
clientKey: YOUR_CLIENT_KEY

サーバーを起動

サーバーを起動する際には、以下のコマンドを実行します(まだ開発中なので、開発用サーバーが立ち上がります)。

npm run dev

例えばローカルの場合、 http://localhost:3000 にてサーバーが立ち上がります。

使い方

今回はJavaScript SDKでの使い方です。実際に利用するアプリケーション側でJavaScript SDKを初期化する際に、以下のように指定します。以下の例で分かるように、認証やデータストアとスクリプトは同じプロキシサーバーで提供されます。

const ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY", {
	fqdn: "localhost",
	scriptFqdn: "localhost",
	protocol: "http",
	port: 3000
});

この fqdnprotocolport を実際に運用するサーバーのものに書き換えて利用できます。本番運用できるレベルになったら、 protocolport は不要でしょう。恐らく以下のようになるはずです。

const ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY", {
	fqdn: "example.com",
	scriptFqdn: "example.com",
});

これでJavaScript SDKは直接ニフクラ mobile backendにはリクエストせず、 example.com へリクエストするようになります。

コードについて

上記以外のコードを編集する必要はありません。これまでのJavaScript SDKを使ったコードがそのまま実行できます。

リアルタイム通信について

現在はデータストアに対するデータの新規作成、更新、削除に対して通知を受け取れるようになっています。仕様は以下のようになります。

  • エンドポイントURL
    • wss://プロキシサーバーのURL/
  • クエリーパラメータ
    • classname(必須):購読するデータストアのクラス名です。
    • action : 購読するデータ操作を指定します。
      • create : データ作成
      • update : データ更新
      • delete : データ削除
    • objectid: 購読するデータのオブジェクトIDを指定します。このデータの更新、削除について通知を受け取れます。

actionかobjectidはどちらか必須です。両方指定した場合にはobjectidが優先されます。

例えば以下のように購読します。

wscat -c "ws://localhost:3000/?classname=Test&action=create,update"

新規作成

新規作成の際には以下のようなデータが送られてきます。

{
	"createDate":"2022-10-25T06:46:26.342Z",
	"objectId":"bIJYu1y1kBrEthK6",
	"action": "create"
}

更新

更新の際のデータは以下のようになります。

{
	"updateDate":"2022-10-26T08:14:28.580Z",
	"objectId":"bIJYu1y1kBrEthK6",
	"action":"update"
}

削除

削除の際の通知は以下になります。

{
	"objectId":"bIJYu1y1kBrEthK6",
	"action":"delete"
}

セキュリティ

通知の時点では、通知を受け取ったユーザーがデータの閲覧権限を持っているかを判断できません。そのため、オブジェクトIDだけを通知しています。実際のデータ内容について確認する際には、通知データに含まれるオブジェクトIDを使ってデータ取得を行ってください(権限がない場合にはエラーになりますので注意してください)。

まとめ

ニフクラ mobile backendは便利なmBaaSですが、機能が足りなくて別サービスと組み合わせて使うこともあるでしょう。そうした場合に2つのサービスをクライアントから呼び出すのではなく、プロキシを使うことで1つのサービスであるかのように利用できます。

開発はまだまだこれからですが、ぜひご期待ください。

NCMBMania/ncmb-proxy

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?