Typescript 即使在设置环境变量并运行模拟器之后,Firebase Auth也会攻击生产

Typescript 即使在设置环境变量并运行模拟器之后,Firebase Auth也会攻击生产,typescript,firebase,firebase-authentication,firebase-tools,Typescript,Firebase,Firebase Authentication,Firebase Tools,我有一个云函数,它作为一个端点,前端可以调用该端点向我们的应用程序注册一个新用户。我正在编写单元测试,以验证此CF是否确实按预期运行,但我无法连接到身份验证仿真器。我能够正确地模拟firestore和所有其他服务,但当涉及到验证测试时,直接攻击生产环境,并在那里注册用户 根据,环境变量FIREBASE\u AUTH\u EMULATOR\u HOST='localhost:9099'(假设用户没有更改AUTH EMULATOR的默认主机,我没有更改) 遵循报纸原则,我将从更广泛的信息转到更具体的

我有一个云函数,它作为一个端点,前端可以调用该端点向我们的应用程序注册一个新用户。我正在编写单元测试,以验证此CF是否确实按预期运行,但我无法连接到身份验证仿真器。我能够正确地模拟firestore和所有其他服务,但当涉及到验证测试时,直接攻击生产环境,并在那里注册用户

根据,环境变量
FIREBASE\u AUTH\u EMULATOR\u HOST='localhost:9099'
(假设用户没有更改AUTH EMULATOR的默认主机,我没有更改)

遵循报纸原则,我将从更广泛的信息转到更具体的信息,因为其中涉及到相当多的代码

首先,CF.这样的注册是通过一个可调用的云函数完成的,如下所示:

export const signUpUser\u v1=functions.https.onCall(异步(数据:SignUpUserRequestModel,context)=>{
返回wait wait executeIfUserIsNotLoggedIn(异步()=>{
const controller=getUsersControllerInstance()
返回等待控制器。注册用户(数据)
},上下文)
})
executeIfUserIsNotLoggedIn
我认为与我们的问题无关,但因为它非常简单,我将把它留在这里,以防我错了,并且可以帮助解决问题。函数
executeInfuserisnotloggedin
用作中间件,通过检查上下文是否不包含身份验证凭据,确保登录的任何人都不会执行此端点:

导出异步函数executeInfuserisnotloggedin(cb:()=>any,context:functions.https.CallableContext){
if(context.auth?.uid)抛出新函数.https.HttpsError('permission-denied','Logout first')
返回等待cb()
}
现在,测试文件。在这个文件中,我清楚地定义了所需的变量,并通过传递一个带有
projectId
的配置对象来初始化admin。我已经对它进行了修改,但在所有情况下都使用了相同的项目id:原始项目id(来自Firebase控制台的项目id,我是说,不是虚构的)

//tslint:disable:无隐式依赖项
//tslint:禁用:无导入副作用
从'chai'导入{assert}
导入admin=require('firebase-admin')
从“firebase函数测试”导入*作为测试
进口摩卡咖啡
从“路径”导入*作为路径
从“../../core/entities/enums/ChildrenSituationEnum”导入{ChildrenSituationEnum}”
从“../../core/entities/enums/GenderEnum”导入{GenderEnum}
从“../../core/entities/enums/usertraitsum”导入{usertraitsum}
从“../../core/requestModels/SignUpUserRequestModel”导入{SignUpUserRequestModel}
从“../../core/responseModels/SignUpUserResponseModel”导入{SignUpUserResponseModel}
从“../../services/firestore/FirestoreCollectionsEnum”导入{FirestoreCollectionsEnum}
从“../../usersManagementFunctions”导入{signUpUser_v1}
process.env.FIRESTORE\u EMULATOR\u HOST='localhost:8080'
process.env.FIREBASE\u AUTH\u EMULATOR\u HOST='localhost:9099'
process.env.GCLOUD_项目='tribbum-ffe98'
常数测试=测试(
{
projectId:“[修订]”,
databaseURL:'https://[redact].firebaseio.com',
storageBucket:“[REDACTED].appspot.com”,
},
join(uu dirname,“[redact]”)
)
描述('云功能',()=>{
admin.initializeApp({projectId:'[redact]'})
之前(异步()=>{
等待deleteAllUsersFromUsersCollection()的删除
})
beforeach(异步()=>{
等待deleteAllUsersFromUsersCollection()的删除
})
之后(异步()=>{
等待deleteAllUsersFromUsersCollection()的删除
})
描述('signupUser_v1',()=>{
const baseRequest=新的SignUpUserRequestModel(
“姓名”,
"姓",,
45,
女性,
“photoUrl”,
'email@email.com',
'123456',
你没有孩子吗,
[UserTraitsEnum.Employeed],
“说明”,
10,
100
)
它('当请求正确时,在响应中返回一个用户',async()=>{
const cf=test.wrap(signUpUser\u v1)
const response=wait cf(baseRequest)
assert.equal(response.user.name,'name')
})
})
})
异步函数deleteAllUsersFromUsersCollection(){
const query=wait admin.firestore().collection(FirestoreCollectionsEnum.USERS.get())
等待承诺.all(query.docs.map((doc)=>doc.ref.delete())
}
为了遵循干净的体系结构准则,CF接收RequestModel作为第一个参数,并将其传递给期望它的控制器方法。这是控制器:

从“../entities/IUserEntity”导入{IUserEntity}
从“../entities/User”导入{User}
从“../gateways/IEntityGateway”导入{IEntityGateway}
从“../gateways/IIdentityGateway”导入{IIdentityGateway}
从“../gateways/IRequestsValidationGateway”导入{IRequestsValidationGateway}
从“../interactitors/IUsersInteractor”导入{IUserInteractor}
从“../requestModels/SignUpUserRequestModel”导入{SignUpUserRequestModel}
从“../requestModels/UpdateUserEmailAddressRequestModel”导入{UpdateUserEmailAddressRequestModel}
从“../requestModels/UpdateUserProfileInformationRequestModel”导入{UpdateUserProfileInformationRequestModel}
从“../responseModels/SignUpUserResponseModel”导入{SignUpUserResponseModel}
从“../responseModels/UpdateUserEmailAddressResponseModel”导入{UpdateUserEmailAddressResponseModel}
从“../responseModels/UpdateUserProfileInformationResponseModel”导入{UpdateUserProfileInformationResponseModel}
从“../tools/uuid/IUuid”导入{IUuid}
导出类UsersController实现IUserInteractor{
私有_uuid:IUuid
私有持久性:IEnti