如何重新验证由 firebase admin sdk 创建的用户

问题描述 投票:0回答:2

我已经使用管理 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 可以很好地注册,但我该如何重新登录? 谢谢

firebase kotlin firebase-authentication firebase-admin
2个回答
0
投票

好吧,我基本上找到了答案,我不知道为什么谷歌会把它埋起来。基本上 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 令牌,因此您必须进行两次循环,使用电子邮件/密码登录,然后如果通过则创建一个新的自定义令牌。完成后我会发布完成的代码


0
投票

工作代码,唯一缺少的部分是进行 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")
}
© www.soinside.com 2019 - 2024. All rights reserved.