You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Angular应用以统一认证身份访问Firebase RTDB?

用统一共享身份自动认证访问Firebase实时数据库

实现步骤

1. 创建Firebase服务账号

  • 登录Firebase控制台,进入目标项目的「设置」→「服务账号」页面。
  • 点击「生成新的私钥」,下载JSON格式的密钥文件,妥善保存(绝对不要提交到公开代码仓库)。

2. 生成固定UID的自定义令牌

你可以通过Node.js脚本或Firebase云函数生成统一身份的自定义令牌:

本地Node.js脚本(用于测试)

const admin = require('firebase-admin');
const serviceAccount = require('./path/to/your/service-account-key.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

// 设定固定的UID作为共享身份,比如"app-shared-user"
admin.auth().createCustomToken('app-shared-user')
  .then(token => console.log('生成的令牌:', token))
  .catch(err => console.error('令牌生成失败:', err));

运行脚本得到令牌后,可暂时用于前端测试;正式环境建议用云函数动态生成(避免令牌过期问题)。

Firebase云函数(正式环境)

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.getSharedAuthToken = functions.https.onCall(async (data, context) => {
  // 可添加简单校验,比如验证请求来源
  const sharedUid = "app-shared-user";
  const token = await admin.auth().createCustomToken(sharedUid);
  return { token };
});

部署云函数后,前端可以调用它获取最新令牌。

3. Angular应用实现自动登录

创建认证服务并在应用初始化时自动完成登录:

AuthService示例

import { Injectable } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/compat/auth';
import { Functions, httpsCallable } from '@angular/fire/functions';

@Injectable({ providedIn: 'root' })
export class SharedAuthService {
  constructor(
    private afAuth: AngularFireAuth,
    private functions: Functions
  ) {}

  async autoAuthenticate() {
    try {
      // 调用云函数获取令牌
      const getToken = httpsCallable(this.functions, 'getSharedAuthToken');
      const response = await getToken({});
      const customToken = response.data.token;

      // 使用自定义令牌登录
      await this.afAuth.signInWithCustomToken(customToken);
      console.log('已通过共享身份完成认证');
    } catch (err) {
      console.error('自动认证失败:', err);
    }
  }
}

在AppComponent中触发自动登录

import { OnInit } from '@angular/core';
import { SharedAuthService } from './shared-auth.service';

export class AppComponent implements OnInit {
  constructor(private authService: SharedAuthService) {}

  ngOnInit() {
    this.authService.autoAuthenticate();
  }
}

4. 配置RTDB安全规则

在Firebase控制台的「实时数据库」→「规则」页面,设置仅允许认证用户(或指定UID)读取:

允许所有认证用户读取

{
  "rules": {
    ".read": "auth != null",
    ".write": false // 根据需求调整写权限
  }
}

仅允许指定共享UID读取(更严格)

{
  "rules": {
    ".read": "auth.uid === 'app-shared-user'",
    ".write": false
  }
}

内容的提问来源于stack exchange,提问作者almostasnecessary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:46:17