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

使用Go与Firebase Admin SDK实现邮箱密码用户认证的疑问

Go语言Firebase Admin SDK邮箱密码认证解决方案

Firebase Admin SDK本身不提供直接通过邮箱+密码验证用户身份的接口,它的定位是后端管理工具,而非客户端身份认证SDK。你当前使用CustomToken的方式跳过了密码校验,存在安全风险——任何知晓用户邮箱的人都能获取到认证Token。

可行实现步骤

要在后端完成邮箱+密码的身份认证,需借助Firebase官方REST API先验证用户凭证,再通过Admin SDK生成合法Token返回前端,具体流程如下:

  1. 调用Firebase的signInWithPassword REST接口,传入用户邮箱和密码完成身份校验
  2. 校验通过后,使用Admin SDK生成自定义Token(或直接返回REST接口返回的ID Token,按需选择)

代码实现示例

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

// 密码验证请求结构体
type verifyPasswordReq struct {
    Email             string `json:"email"`
    Password          string `json:"password"`
    ReturnSecureToken bool   `json:"returnSecureToken"`
}

// 密码验证响应结构体
type verifyPasswordResp struct {
    IDToken      string `json:"idToken"`
    LocalID      string `json:"localId"`
    Error        struct {
        Message string `json:"message"`
    } `json:"error,omitempty"`
}

func (svc *AuthenticationService) Login(ctx context.Context, req *LoginRequest) (*AuthResponse, error) {
    initFirebase()

    // 1. 调用Firebase REST API验证邮箱密码
    verifyReq := verifyPasswordReq{
        Email:             req.EmailAddress,
        Password:          req.Password, // 接收前端传入的用户密码
        ReturnSecureToken: true,
    }
    reqBody, _ := json.Marshal(verifyReq)
    // 替换为你的Firebase项目API_KEY
    apiKey := "YOUR_FIREBASE_PROJECT_API_KEY"
    httpResp, err := http.Post(
        "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key="+apiKey,
        "application/json",
        bytes.NewBuffer(reqBody),
    )
    if err != nil {
        return &AuthResponse{Result: Result_LOGIN_FAILED, Token: ""}, errors.New("login failed: " + err.Error())
    }
    defer httpResp.Body.Close()

    var verifyResp verifyPasswordResp
    if err := json.NewDecoder(httpResp.Body).Decode(&verifyResp); err != nil {
        return &AuthResponse{Result: Result_LOGIN_FAILED, Token: ""}, errors.New("parse verify response failed: " + err.Error())
    }
    if verifyResp.Error.Message != "" {
        return &AuthResponse{Result: Result_LOGIN_FAILED, Token: ""}, errors.New("login failed: " + verifyResp.Error.Message)
    }

    // 2. 生成自定义Token(可选,若需后端自定义权限逻辑则使用)
    authToken, err := authClient.CustomToken(ctx, verifyResp.LocalID)
    if err != nil {
        return &AuthResponse{Result: Result_LOGIN_FAILED, Token: ""}, errors.New("generate custom token failed: " + err.Error())
    }

    return &AuthResponse{
        Result: Result_LOGIN_SUCCEDED,
        Token:  authToken, // 也可直接返回verifyResp.IDToken,根据业务需求选择
    }, nil
}

关键说明

  • REST API的必要性:Admin SDK未开放密码验证能力,该功能属于客户端SDK范畴,因此需通过官方REST接口完成凭证校验
  • Token选择:verifyResp.IDToken是Firebase生成的客户端身份Token,有效期1小时;CustomToken由后端生成,前端可通过它换取ID Token和Refresh Token,适合需要自定义权限规则的场景
  • 安全注意:务必保管好Firebase项目API_KEY,避免泄露;密码传输必须使用HTTPS,防止明文泄露

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:00:09