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

基于Golang后端的Firebase认证流程实现疑问

Golang后端实现完整Firebase认证流程方案

由于Firebase Golang Admin SDK仅提供用户管理、Token生成/验证等后端能力,不包含客户端侧的登录验证方法(如用户名密码登录、自定义Token登录),因此需要结合Firebase Auth官方REST API来实现完整流程。以下是两种可行方案:

一、直接调用REST API实现用户名密码登录(推荐)

如果你的用户账号是通过Firebase Auth注册的(密码存储在Firebase侧),直接调用官方登录端点即可完成验证,无需绕自定义Token:

1. 核心请求说明

  • 请求端点:https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=YOUR_FIREBASE_WEB_API_KEY
  • 请求方式:POST
  • 请求体(JSON):
    {
      "email": "用户邮箱",
      "password": "用户密码",
      "returnSecureToken": true
    }
    
  • 响应会返回idToken(用于后续身份验证)、refreshToken(用于刷新过期的ID Token)等字段。

2. Golang代码示例

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

type SignInReq struct {
	Email             string `json:"email"`
	Password          string `json:"password"`
	ReturnSecureToken bool   `json:"returnSecureToken"`
}

type SignInResp struct {
	IDToken      string `json:"idToken"`
	RefreshToken string `json:"refreshToken"`
	LocalID      string `json:"localId"`
	ExpiresIn    string `json:"expiresIn"`
}

func main() {
	apiKey := "你的Firebase Web API Key"
	url := fmt.Sprintf("https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=%s", apiKey)

	reqBody := SignInReq{
		Email:             "test@example.com",
		Password:          "user123456",
		ReturnSecureToken: true,
	}
	jsonBody, _ := json.Marshal(reqBody)

	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonBody))
	if err != nil {
		// 处理请求错误
		panic(err)
	}
	defer resp.Body.Close()

	var signInResp SignInResp
	if err := json.NewDecoder(resp.Body).Decode(&signInResp); err != nil {
		// 处理解析错误
		panic(err)
	}

	// 拿到ID Token后,可通过Admin SDK验证合法性
	fmt.Println("ID Token:", signInResp.IDToken)
}

3. 验证ID Token合法性

拿到前端传回的ID Token后,用Firebase Admin SDK验证其有效性:

import (
	"context"
	"firebase.google.com/go/auth"
)

func verifyToken(authClient *auth.Client, idToken string) (*auth.Token, error) {
	token, err := authClient.VerifyIDToken(context.Background(), idToken)
	if err != nil {
		return nil, err
	}
	return token, nil
}

二、自定义Token登录方案(适配自有用户体系)

如果你的后端维护独立用户数据库(密码自行存储校验),可通过自定义Token完成登录:

1. 流程步骤

  1. 后端校验用户提交的用户名/密码(从自有数据库验证)
  2. 验证通过后,用Firebase Admin SDK生成自定义Token(需传入用户UID,可与自有数据库用户ID对应)
  3. 调用REST API将自定义Token转换为正式的ID Token和Refresh Token

2. 关键代码示例

生成自定义Token

import (
	"context"
	"firebase.google.com/go/auth"
)

func generateCustomToken(authClient *auth.Client, uid string) (string, error) {
	customToken, err := authClient.CustomToken(context.Background(), uid)
	if err != nil {
		return "", err
	}
	return customToken, nil
}

调用自定义Token登录接口

请求端点:https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=YOUR_FIREBASE_WEB_API_KEY
请求体:

{
  "token": "生成的自定义Token",
  "returnSecureToken": true
}

Golang请求代码与用户名密码登录类似,仅需修改请求体结构。

三、完整流程总结

无论采用哪种方案,后端核心链路都是:

  1. 接收客户端登录凭证
  2. 调用Firebase Auth REST API完成登录,获取ID Token
  3. 用Admin SDK验证ID Token有效性
  4. 后续业务接口通过ID Token校验用户身份

额外注意:

  • ID Token默认1小时过期,客户端需用Refresh Token调用accounts:refreshToken端点刷新
  • 严格保管Firebase Web API Key和Admin SDK密钥,避免泄露

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:05:37