在Angular中正确设置Firebase应用检查(@angular/fire)

6tqwzwtp  于 2023-06-24  发布在  Angular
关注(0)|答案(1)|浏览(109)

Angular版本:15.2.9 AngularFire版本:7.5.0
下面是我的代码:
(app.module.ts)

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { LayoutModule } from '@angular/cdk/layout' ;
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { getApp, initializeApp, provideFirebaseApp } from '@angular/fire/app';
import { ReCaptchaV3Provider, initializeAppCheck, provideAppCheck } from '@angular/fire/app-check' ;
import { environment } from '../environments/environment';
import { provideAuth,getAuth, connectAuthEmulator } from '@angular/fire/auth';
import { provideFirestore,getFirestore, Firestore, initializeFirestore } from '@angular/fire/firestore';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    provideFirebaseApp(() => initializeApp(environment.firebase)),
    provideAppCheck( () => initializeAppCheck(undefined, {
      provider: new ReCaptchaV3Provider(environment.recaptchaV3SiteKey),
      isTokenAutoRefreshEnabled: true
    })),
    provideAuth(() => {
      const auth = getAuth() ;
      if (environment.useEmulators){
        connectAuthEmulator(auth, 'http://localhost:9099', {
          disableWarnings: true
        }) ;
      }

      return auth ;
    }),
    provideFirestore(() => {
      let firestore: Firestore ;
      if (environment.useEmulators){
        firestore = initializeFirestore(getApp(), {
          experimentalForceLongPolling: true
        }) ;
      }
      else{
        firestore = getFirestore() ;
      }

      return firestore ;
    }),
    BrowserAnimationsModule,
    LayoutModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

在我的登录组件中:

它给出了开发模式下的以下错误日志:

我在firebase的app-check控制台中添加了给定的调试令牌。403错误,响应如下:

{
  "error": {
    "code": 403,
    "message": "Invalid API key for project ID: demo-project",
    "status": "PERMISSION_DENIED"
  }
}

当检查console.log(this.appcheck)的结果时,它会将demo-project作为我的projectId给予给我的应用程序凭据。但是当我为生产构建应用程序时,它会给我的Firebase项目ID不同的调试令牌和不同的403响应消息“应用程序证明失败”。
我已经查阅了很多关于stackoverflow的指南和其他问题,但仍然困惑于如何正确地设置本地和生产开发。

编辑1:新增生产模式截图。调试令牌是不同的,现在this.appcheck提供正确的projectId而不是demo-project时使用ng serve。

403响应截图

编辑2:在一些指南中设置firestore和auth模拟器时,他们告诉他们将projectId更改为demo-*。所以,在我的开发环境中,我改回了我的项目ID。现在我要拿回应用检查令牌了在开发模式下,可以显示调试令牌,但在生产中,它仍然显示上述生产错误,带有不同的调试ID,证明失败。如何解决这个问题?

sycxhyv7

sycxhyv71#

花了3天时间终于解决了这个问题。我检查了开发服务器源代码,并在app check init函数中检查全局值FIREBASE_APPCHECK_DEBUG_TOKEN是否为字符串或设置为true。然后它将显示带有调试令牌的日志,否则将生成新的日志。
因此,答案是对于生产版本设置为false,对于开发版本设置为在firebase控制台中保存的调试令牌。

export class AppComponent implements OnInit {

  ngOnInit(): void {
    if (!environment.production){
      self.FIREBASE_APPCHECK_DEBUG_TOKEN = environment.debugToken ;
    }
    else{
      self.FIREBASE_APPCHECK_DEBUG_TOKEN = environment.debugToken ;
    }
  }
}

生产控制台日志:

此外,在选择禁用网络中的缓存选项卡并刷新生产页面后,生产上的403问题得到解决。我认为浏览器使用的是一个旧版本,我没有改变projectId,也没有将DEBUG TOKEN设置为false。

相关问题