非Android/网页环境下,Kotlin脚本如何登录Firebase用户并获取JWT?
问题:非Android/Kotlin脚本中获取Firebase用户JWT用于负载测试
我已有现成的Firebase配置、应用及后端,正在编写Kotlin脚本(用于后端的Gatling负载测试)。目前可以通过Firebase Admin SDK创建测试用户:
val userRecord = FirebaseAuth.getInstance().createUser( UserRecord.CreateRequest() .setUid(test_uid) .setDisplayName(test_displayName) .setEmail(test_email) .setPassword(test_password) .setEmailVerified(true) )
但需要登录该用户并获取Firebase生成的JWT(ID Token),才能向后端API发起认证请求。Android应用中常用的signInWithEmailAndPassword方法在firebase-admin包中不可用,而客户端firebase-auth包在纯JVM环境中兼容不佳,求可行实现思路。
可行解决方案
1. 直接调用Firebase Auth REST API获取ID Token
Firebase提供了REST接口用于用户登录,无需依赖客户端SDK,适合纯JVM环境:
步骤:
- 找到Firebase项目的Web API Key:进入Firebase控制台 → 项目设置 → 一般 → 对应Web应用的API密钥
- 发送POST请求到
https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword,携带以下参数:email: 测试用户邮箱password: 测试用户密码returnSecureToken:true(必填,用于返回ID Token)key: 你的Web API Key
Kotlin代码示例(使用OkHttp):
import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import com.google.gson.JsonObject val client = OkHttpClient() val mediaType = "application/json; charset=utf-8".toMediaType() // 构造请求体 val requestBody = JsonObject().apply { addProperty("email", test_email) addProperty("password", test_password) addProperty("returnSecureToken", true) }.toString().toRequestBody(mediaType) // 发送请求 val request = Request.Builder() .url("https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=YOUR_WEB_API_KEY") .post(requestBody) .build() client.newCall(request).execute().use { response -> if (response.isSuccessful) { val responseBody = response.body?.string() // 解析获取idToken val json = com.google.gson.JsonParser.parseString(responseBody).asJsonObject val idToken = json.get("idToken").asString // 使用idToken调用后端API } }
2. 用Admin SDK生成自定义Token再兑换成ID Token
如果需要更灵活的用户标识(比如自定义Claims),可以先通过Admin SDK生成自定义Token,再兑换为标准ID Token:
步骤:
- 用Admin SDK生成自定义Token:
val customToken = FirebaseAuth.getInstance().createCustomToken(test_uid)
- 发送POST请求到
https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken,携带参数:token: 生成的自定义TokenreturnSecureToken:truekey: Web API Key
Kotlin代码示例:
// 构造请求体 val requestBody = JsonObject().apply { addProperty("token", customToken) addProperty("returnSecureToken", true) }.toString().toRequestBody(mediaType) val request = Request.Builder() .url("https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=YOUR_WEB_API_KEY") .post(requestBody) .build() client.newCall(request).execute().use { response -> if (response.isSuccessful) { val json = com.google.gson.JsonParser.parseString(response.body?.string()).asJsonObject val idToken = json.get("idToken").asString // 使用idToken } }
注意事项
- 确保测试用户的
emailVerified已设为true(如你创建用户时的设置),否则部分登录场景会受限 - Web API Key需要妥善保管,避免泄露
- Gatling脚本中可以将这些逻辑封装为方法,在场景初始化时批量生成ID Token供测试使用
内容的提问来源于stack exchange,提问作者Ian Rogers
相关产品推荐
相关产品推荐

