新しいfirebaseクラウド機能を使用して、HTTPエンドポイントの一部をfirebaseに移動することにしました。すべてがうまく機能します...しかし、私は次の問題があります。 HTTPトリガー(クラウド機能)によって構築された2つのエンドポイントがあります
最初のエンドポイントは問題ありませんが、私の2番目のエンドポイントでは、認証されたユーザーに対してのみ保護したいと思います。私が以前に生成したトークンを持っている人を意味します。
どうやってこれを解決しますか?
私たちはクラウド関数でHeaderパラメータを取得できることを知っています
request.get('x-myheader')
しかし、リアルタイムデータベースを保護するのと同じように、エンドポイントを保護する方法はありますか?
@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
を使用してそのトークンを検証できます。あなたはレスポンスでそのユーザのデコードされた情報を得るでしょう。それ以外の場合、トークンが無効な場合はエラーになります。
助けになれば幸いです。
@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));