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

如何在Java中获取有效的Firebase ID Token用于Spring Boot集成测试

获取有效Firebase ID Token的正确方案

我来帮你解决这个问题——要在Java/Kotlin环境中获取带有完整iss字段的有效Firebase ID Token(适配你的Spring Boot集成测试场景),有两种可靠的方式,下面分别说明:

方案一:使用Firebase Auth v1 REST API

你之前用的是旧版Identity Toolkit v3的verifyPassword端点,这就是为什么返回的Token缺少iss字段的原因。建议切换到Firebase Auth官方推荐的v1版本signInWithPassword端点,它返回的ID Token包含所有必需的Claims。

示例Kotlin代码

private fun getValidIdToken(): String {
    val restClient = RestTemplate()
    val requestBody = mapOf(
        "email" to testUsername,
        "password" to testPassword,
        "returnSecureToken" to true // 必须设为true才会返回idToken
    )
    val headers = HttpHeaders().apply {
        contentType = MediaType.APPLICATION_JSON
        accept = listOf(MediaType.APPLICATION_JSON)
    }
    val request = HttpEntity(requestBody, headers)
    
    // 替换成你的Firebase项目Web API Key(在控制台->项目设置->通用里找)
    val apiKey = "YOUR_FIREBASE_WEB_API_KEY"
    val response = restClient.postForObject(
        "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=$apiKey",
        request,
        Map::class.java
    ) as Map<String, Any>
    
    return response["idToken"] as String
}

关键注意点

  • 一定要加上returnSecureToken=true参数,否则接口不会返回ID Token
  • 用v1版本的accounts:signInWithPassword端点替代旧的verifyPassword,这样返回的Token完全符合Firebase ID Token规范,能被Admin SDK的verifyIdToken正常验证

方案二:通过Admin SDK生成自定义Token再交换

如果你已经在项目中引入了Firebase Admin SDK,也可以先给测试用户生成自定义Token,再调用REST API交换成标准ID Token:

第一步:生成自定义Token

// 注入项目中已有的FirebaseAuth实例
@Autowired
private lateinit var firebaseAuth: FirebaseAuth

private fun generateCustomToken(): String {
    // 测试用户的UID(可以从Firebase控制台的用户列表中获取)
    val testUserUid = "YOUR_TEST_USER_UID"
    // 异步获取同步化,适合测试场景
    return firebaseAuth.createCustomToken(testUserUid).get()
}

第二步:交换为标准ID Token

private fun exchangeCustomTokenToIdToken(customToken: String): String {
    val restClient = RestTemplate()
    val requestBody = mapOf(
        "token" to customToken,
        "returnSecureToken" to true
    )
    val headers = HttpHeaders().apply {
        contentType = MediaType.APPLICATION_JSON
    }
    val request = HttpEntity(requestBody, headers)
    
    val apiKey = "YOUR_FIREBASE_WEB_API_KEY"
    val response = restClient.postForObject(
        "https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=$apiKey",
        request,
        Map::class.java
    ) as Map<String, Any>
    
    return response["idToken"] as String
}

集成到你的测试代码

把获取Token的逻辑放到测试里,就可以正常验证接口了:

@Test fun `accepts valid token`() {
    val testToken = getValidIdToken()
    println("Acquired token $testToken")
    mockMvc.perform(get("/").header(FirebaseAuthenticationTokenFilter.TOKEN_HEADER, testToken))
        .andExpect(status().isOk)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:16:22