バックエンドで解決するFirebase Storageの制限事項


Silicon Valley Super Ware

2020年9月13日


バックエンドで解決するFirebase Storageの制限事項

便利なFirebase Storageですが、幾つか制限事項があります。
Firebaseのストレージのアクセスはセキュリティルールであろう程度制限する事ができます

しかし、取得したURLの取り扱いは注意が必要です。
このURLは、Firebase storageのファイルをダウンロードする際に必要です。
ただし、このURLにはアクセスの為の「トークン」が含まれています。

つまり、このURLを使うと、ログインしなくてもファイルにアクセスできてしまいます。

オンライン上のコンテンツを販売する場合、このリンクをどのように考えるかが一つの課題です。

クライアントで出来る事は限られています!

最初の、ダウンロードの為のURLの発行には、Firebaseへのログインや支払い完了などの条件を付ける事は可能です。しかし、ここで取得したURLはファイルのアップロードをやり直さない限り有効になります。

つまり、誰かが購入してURLを取得して、そのURLを別の人と共有した場合、実際の購入者以外でもファイルにアクセスできる事になります。

この対策としては、サーバー側でダウンロードのURLを管理するという方法があります。

オンライン決済をする以上、サーバー側のバックエンドサービスは必須になるので、この方法を採用すると、ダウンロードをする度にログインをしてURLを取得する必要があります。この方法を利用すると、購入後のみのダウンロードに制限したり、購入者は購入後いつでもダウンロードできるようになります。
URLは一定時間で向うになるようにすれば、仮に共有されたとしても、不正にダウンロードが出来る時間は限られるのでセキュリティは大きく向上します。

サーバー側のコードの例です
const admin = require("firebase-admin"); const bucket = admin.storage().bucket(); const ristrictURL = { version: "v4", action: "read", expires: Date.now() + 1000 * 60 * 10, // 10 分間のみ有効 } const [url] = await bucket .file("uploads/file.txt") .getSignedUrl(ristrictURL);


セキュリティルールで、「getDownloadUrl()」でURLを取得してもアクセスできないようにすると、多くのケースで、ファイルへのアクセスを限られた人に限定する事ができます。

ただし、この方法も完ぺきではありません!ご注意を!

これでも、幾つかの制限事項がありますが、その辺はブログでは公開しない事にさせて頂きます。しかし、サーバー側で対策をする事によって、単純にダウンロードの仕組みを作るよりは厳しい制限を書ける事は可能です。

ユーザーごとに一部の中身を変えたい!

全ての人に同じファイルを提供する場合は問題ではありませんが、利用者ごとに違うファイルをを提供する場合は別の制限事項があります。

例えば、あなたが提供するWebサービスで必要な設定ファイルをダウンロードで提供するような場合です。もちろん、それぞれ別々のファイルを作成して提供すれば問題はないのですが、個別に変える部分は1行だけでそれ以外は同じ場合があります。

その場合の処理は、同じファイルをテンプレートとして、個別の情報をログイン情報を基に差し替えるような処理をしたい場合があります。この場合も、クライアント(フロントエンド/ブラウザ)で処理をする場合は一つ問題があります。

フロントエンドのコードではダウンロードしたファイルにはアクセスできない!

セキュリティ上の問題で、「getDownloadUrl()」は、ファイルをローカルのPCなどのフォルダーに保存するための仕組みです。残念ながら、Firebaseの標準のAPIでは、Storage上にあるファイルの中身を見るための仕組みがありません。また、一旦ディスクに保存してしまうと、JavaScriptからはファイルにアクセスできないという制限があります。

Google Cloud Storageと連携して処理する

この対策もバックエンド側のコードが必要ですが、Firebaseのドキュメントを調べるとやり方が解説されています。

$ npm install --save @google-cloud/storageセキュリ
のパッケージを利用して、サーバー側でダウンロードしたファイルを処理して提供するという方法が使えます。詳細はFirebaseのドキュメントを見ると書いてあります。

(ご参考)https://firebase.google.com/docs/storage/extend-with-functions?hl=ja

バックエンドの処理が使えると制限事項が少なくなります

Firebaseを使うと、バックエンドのサービスなしでWebサービスが作れるというのは事実です。実際にデータベースを準備したり、データベースとやり取りするコードは書かなくてもサービスが作れるのは大きな魅力です。

しかし、ある程度機能の実現はできても、実際にそのサービスで有料のビジネスを考えると、バックエンドの実装は「別の意味で必要」です。

オンライン決済を機に、バックエンドの実装も勉強するとより、高度なサービスが実現できます。

シリコンバレースーパーウエアでは、フリーランスの型だけではなく、プログラミングを職業とされる方にビジネスを意識した マインドセットを身に着けるお手伝いも提供しています。プログラミングは手段であって、それをどのように生かして、将来のキャリアに結び付けて行くかを長期的な視点で考えるのがとても大切です。この意識が出来ると勉強の方向も絞られて、あなたの夢を実現する道筋が見えてきます。

興味のある方は今すぐお問合せください!



またよろしければ、ニュースレターの登録をお願いします!大体週一回お届けしています。ブログよりは一歩踏み込んだもっと濃い内容を発信しています。



Copyright(c) 2020 by Silicon Valley Super Ware, all rights reserved.

コメント