如何在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
相关产品推荐
相关产品推荐

