我已经使用管理 SDK 和谷歌身份提供商将我所有的用户创建和身份验证转移到 Firebase。我可以很好地创建用户,并且正在添加密码(我创建密码的代码仍然在那里,我不知道如何重新验证用户身份。我已经看到了一些使用 EmailAuthProvider 的答案,但是那个类不存在。我的创建用户代码
fun createUser(request: HttpServletRequest?, response: HttpServletResponse?, createUserRequest: CreateUserRequest): User {
val hashedPassword = PasswordUtil.hashPassword(createUserRequest.password.trim())
val user: User = Mapper.convert(createUserRequest)
val trimmedEmail = user.email.trim()
user.email = trimmedEmail
usersRepo.save(user)
CoroutineScope(Dispatchers.IO).launch {
FirestoreClient.getFirestore().collection("users").document(user.id.toString()).set(user)
}
val auth = FirebaseAuth.getInstance()
val request = CreateRequest()
.setUid(user.id.toString())
.setDisplayName(user.username)
.setEmailVerified(false)
.setEmail(user.email)
.setPassword(createUserRequest.password)
auth.createUser(request)
val password = Password()
password.password = hashedPassword
password.user = user
passwordsRepo.save(password)
CoroutineScope(Dispatchers.IO).launch {
try {
marketplace.generateUsersWallets(user)
} catch (e: Exception) {
e.printStackTrace()
}
}
val link = FirebaseAuth.getInstance().generateEmailVerificationLink(user.email)
awsSesService.sendEmailVerification(user.email, link)
return user
}
我用的包是
//firebase
implementation("com.google.firebase:firebase-admin:9.1.1")
// Import the BoM for the Firebase platform
implementation(platform("com.google.firebase:firebase-bom:30.4.1"))
implementation("com.google.firebase:firebase-firestore-ktx")
FirebaseAuth 可以很好地注册,但我该如何重新登录? 谢谢
好吧,我基本上找到了答案,我不知道为什么谷歌会把它埋起来。基本上 admin sdk 无法进行身份验证,但是 google identity rest api 可以。 https://cloud.google.com/identity-platform/docs/use-rest-api#section-sign-in-email-password
现在奇怪的是,没有办法像在 firebase SDK 中那样登录并取回自定义 JWT 令牌,而是获得带有 IdToken 和 Refresh 令牌的负载。现在,由于自定义令牌的全部意义在于让客户与他们一起登录,然后发送 id 令牌,因此您必须进行两次循环,使用电子邮件/密码登录,然后如果通过则创建一个新的自定义令牌。完成后我会发布完成的代码
工作代码,唯一缺少的部分是进行 REST api 调用,您可以执行任何操作,但要点应该清楚
/**
* Logs in a user if the password hash is equal
*/
@Throws(IllegalArgumentException::class, FirebaseAuthException::class)
fun login(request: HttpServletRequest, response: HttpServletResponse, loginUserRequest: LoginUserRequest): User? = runBlocking {
//find the user in google
val userRecord = FirebaseAuth.getInstance().getUserByEmail(loginUserRequest.email)
if (userRecord != null) {
//find the user by our UUID
val user = usersRepo.findUserById(userRecord.uid.toUUID())
if (user != null) { //log them in
try {
googleIdentityService.apiClient.signInWithEmailAndPassword(SignInRequest(userRecord.email.toString(), loginUserRequest.password))
val customToken = FirebaseAuth.getInstance().createCustomToken(user.id.toString())
response.setHeader("JWT", customToken)
return@runBlocking user
} catch (e: Exception) {
e.printStackTrace()
}
}
}
throw ResponseStatusException(HttpStatus.NOT_FOUND, "invalid email or password")
}