在服务器上验证检索到的Firebase UID
我正在使用angularfire2
和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中不是有用的 – 将不会被使用)
我将把这个uid
或apiKey
发送到我的REST API(通过Angular2的http.post
),但为了防止中间人攻击,我想验证令牌。
所以( 编辑 :添加if
和isComplete
@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
。 (最好通过发送apiKey
和accessToken
而只是检查uid
是否相同现在就足够了。
尝试这个:
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一样,看看这个 Java的例子。