我想定义一个可以从客户端和后端运行的云函数。我从文档中知道,HTTPS可调用函数将自动包含用户auth
数据。做下面的auth
检查够了吗?或者我需要做额外的事情,比如检查context.auth.uid
是否存在于我的users
集合中(我已经保存了用户及其uid
的列表)?
还有,我需要验证API密钥吗?我正试着做最坏的打算,所以我假设一个恶意的用户将以某种方式能够自己传递这个,所以不确定检查这个有多重要。
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
interface Data {
apiKey: string;
}
export const getServerTimestamp = functions.https.onCall(async (data: Data, context) => {
try {
// Check if the user is authenticated
if (!context.auth) {
throw new functions.https.HttpsError('unauthenticated', 'The user is not authenticated');
}
// Validate the request
if (data.apiKey !== 'MY_API_KEY') {
throw new functions.https.HttpsError('permission-denied', 'The API key is invalid');
}
const timestamp = admin.firestore.FieldValue.serverTimestamp();
return { timestamp };
} catch (error) {
console.error(error);
throw new functions.https.HttpsError('internal', 'An error occurred', error);
}
});
执行if (!context.auth)
足以检查调用CloudFunction的用户是否在项目的Firebase Auth服务中声明并经过身份验证。
但是请注意,恶意用户很容易获得您的项目API密钥并通过Auth REST API在Auth服务中创建帐户(电子邮件/密码)。因此,您确实应该检查用户是否存在于您的users集合中(应保护该集合不受自由文档创建的影响),或者更好的做法是,将Custom Claims分配给(真正的)用户。
如果context.Auth
不为空(或未定义),您可以确定用户是针对您的Firebase项目进行身份验证的,所以在我看来,您不需要添加API密钥检查。正如文档中所解释的:Firebase ID令牌是经过签名的jwt,可以安全地标识Firebase项目中的用户。!">
最后一句话:您指出您"想要定义一个可以在客户端和后端同时运行的云函数"。
一个可调用的云函数不是一个更容易从"后端,无论是另一个云功能还是你自己的服务器。你没有详细说明你想如何调用这个云函数,但如果你想通过HTTPS请求调用它,你需要遵循一个复杂的协议。