web-dev-qa-db-ja.com

Firebase Cloud Function HTTPエンドポイントを保護してFirebase認証ユーザーのみを許可する方法

新しいfirebaseクラウド機能を使用して、HTTPエンドポイントの一部をfirebaseに移動することにしました。すべてがうまく機能します...しかし、私は次の問題があります。 HTTPトリガー(クラウド機能)によって構築された2つのエンドポイントがあります

  1. ユーザーを作成し、Firebase Admin SDKによって生成されたカスタムトークンを返すためのAPIエンドポイント。
  2. 特定のユーザー詳細を取得するためのAPIエンドポイント。

最初のエンドポイントは問題ありませんが、私の2番目のエンドポイントでは、認証されたユーザーに対してのみ保護したいと思います。私が以前に生成したトークンを持っている人を意味します。

どうやってこれを解決しますか?

私たちはクラウド関数でHeaderパラメータを取得できることを知っています

request.get('x-myheader')

しかし、リアルタイムデータベースを保護するのと同じように、エンドポイントを保護する方法はありますか?

83
spaceMonkey

あなたがやろうとしていることの公式 コードサンプル があります。ここで説明しているのは、認証中にクライアントが受け取ったトークンを含むAuthorizationヘッダーを要求するようにHTTPS機能を設定する方法です。この関数はfirebase-adminライブラリを使ってトークンを検証します。

また、アプリケーションがFirebaseクライアントライブラリを使用できる場合は、 " 呼び出し可能な関数 "を使用してこの定型句を簡単に作成できます。

87
Doug Stevenson

@Dougが述べたように、トークンを検証するためにfirebase-adminを使うことができます。簡単な例を設定しました。

exports.auth = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    const tokenId = req.get('Authorization').split('Bearer ')[1];

    return admin.auth().verifyIdToken(tokenId)
      .then((decoded) => res.status(200).send(decoded))
      .catch((err) => res.status(401).send(err));
  });
});

上の例では、CORSも有効にしましたが、これはオプションです。まず、Authorizationヘッダーを取得してtokenを見つけます。

その後、firebase-adminを使用してそのトークンを検証できます。あなたはレスポンスでそのユーザのデコードされた情報を得るでしょう。それ以外の場合、トークンが無効な場合はエラーになります。

助けになれば幸いです。

73
Will

@Dougでも言及されているように、 呼び出し可能な関数 をクライアントとサーバーから 一部の定型コードを除外 するために使用できます。

例呼び出し可能関数:

export const getData = functions.https.onCall((data, context) => {
  // verify Firebase Auth ID token
  if (!context.auth) {
    return { message: 'Authentication Required!', code: 401 };
  }

  // do your things..
  const uid = context.auth.uid;
  const query = data.query;

  return { message: 'Some Data', code: 400 };
});

それはあなたのクライアントから直接呼び出すことができます。

firebase.functions().httpsCallable('getData')({query}).then(result => console.log(result));
0
Benny