【问题标题】:Validate retrieved Firebase UID on server验证服务器上检索到的 Firebase UID
【发布时间】:2016-12-09 15:56:06
【问题描述】:

我正在使用 firebase 和 angularfire2,它允许使用 Facebook、Google+ 和 Twitter 进行身份验证。

现在,当用户像这样进行身份验证时,我会收到如下所示的响应。

{
"uid":"someUID",
"displayName":"ivaro18",
"photoURL":"https://lh3.googleusercontent.com/-myPicture/photo.jpg",
"email":"myEmail@gmail.com",
"emailVerified":true,
"isAnonymous":false,
"apiKey":"aUUIDApiKey",
"appName":"[DEFAULT]",
"authDomain":"mydemo.firebase.com",
"stsTokenManager":{
    "apiKey":"aUUIDApiKey",
    "refreshToken":"AHugeRefreshToken",
    "accessToken":"aHugeAccessToken",
    "expirationTime":1481297860666
},
"redirectEventId":null
}

身份验证有效并且可以检索用户数据(省略providerData,因为它在 JSON 中没有用 - 不会被使用)

我会将此 uidapiKey 发送到我的 REST API(通过 Angular2 的 http.post),但为了防止中间人攻击,我想验证令牌。

所以(编辑:添加了ifisComplete

    @JvmStatic fun main(args: Array<String>) {
        println("yes")
        val options = FirebaseOptions.Builder()
                .setServiceAccount(
                        FileInputStream("C:/Users/ivaro18/firebase.json")
                ).setDatabaseUrl("https://myDemo.firebaseio.com")
                .build()
        FirebaseApp.initializeApp(options)

        if(
        FirebaseAuth.getInstance().verifyIdToken("whatToken?")
                .addOnSuccessListener(OnSuccessListener<FirebaseToken>() {
                    @Override
                    fun onSuccess(decodedToken: FirebaseToken) {
                        val uid = decodedToken.getUid()
                        println("UID:::" + uid)
                    }
                })
                .addOnFailureListener(OnFailureListener() {
                    @Override
                    fun onFailure(e: Exception) {
                        e.printStackTrace()
                    }
                })
                .addOnCompleteListener(OnCompleteListener<FirebaseToken>() {
                    @Override
                    fun onComplete(token: FirebaseToken) {
                        println("Token: " + token)
                    }
        }).isComplete()) {
           println("verification completed");
        }
        println("ok")
    }

但是这段代码输出(顺便说一句,Kotlin,几乎与 Java 相同的语法,它可以运行 Java 代码)

yes
verficiation completed
ok

然后在一段时间后终止。我希望其中一位听众开火?代码有什么问题?

我应该在 FirebaseAuth 中验证该 JSON 数组中的哪个 ID?

编辑

JSON 的 uid 部分与 Firebase 身份验证页面中提到的 UID 相同(如下所示)

我想检查UID 是否等于控制台上的UID。 (最好发送apiKeyaccessToken,但现在只检查uid 是否相同就足够了。

【问题讨论】:

  • 如果我不得不猜测,我会怀疑 FirebaseAuth 实例在侦听器被触发之前不会使主线程保持活动状态(因此您的程序在第二个 println 之后终止)。您是否尝试过添加while 循环以等待操作完成(例如:使用isComplete
  • 将语句包装在 if(.....verfifyToken........isComplete()){ println("complete"); } 中打印 yes complete ok 我将使用新代码编辑问题
  • isSuccesful 返回 false 并在 JSON 对象中找到每个 id
  • 这是一个java示例:stackoverflow.com/questions/38418472/…

标签: java firebase angularfire2


【解决方案1】:

试试这个:

import com.google.firebase.FirebaseApp
import com.google.firebase.FirebaseOptions
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseToken
import com.google.firebase.tasks.Task
import com.google.firebase.tasks.Tasks
import java.io.FileInputStream

class Firebase {
val options = FirebaseOptions.Builder()
    .setServiceAccount(
        FileInputStream("your/url/to/firebase.json")
    ).setDatabaseUrl("https://your-application.firebaseio.com")
    .build()

    fun validateToken(accessToken: String) {
        val firebaseAuth = FirebaseAuth.getInstance(FirebaseApp.initializeApp(options))

        val authTask: Task<FirebaseToken> = firebaseAuth.verifyIdToken(accessToken)
        try{
            Tasks.await(authTask)
        } catch (e: Exception) {
            //handle exception
        }
        // retrieve uid/email/name
        authTask.getResult().uid
    }
}

就像 Stefan 说的,看看 this Java 示例。

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2019-02-14
    • 2019-12-24
    • 2013-10-30
    • 2018-04-08
    • 2022-11-30
    相关资源
    最近更新 更多