我知道我可以在Firebase's
和Android
上使用iOS
电话验证,但问题是有关客户端验证的信息很容易在客户端伪造,因为我仅使用服务器端SSL证书,因此,只有客户端知道服务器是受信任的。
所以,我决定在服务器端发送手机号码并在那里检查:发送验证码并向用户询问此验证码。但我看不到任何C ++服务器Firebase SDK
,只有客户端C ++ SDK可用。
所以,我有两个选择:
请帮助我解决Firebase中的这种误解。
答案 0 :(得分:8)
客户端绝对适用于此。流程是这样的:
这是有效的,因为恶意用户只有在拥有手机时才能知道代码。它并不能保证设备是具有该电话号码的设备(用户可以拥有两部电话,或者通过笔记本电脑上的电话登录),但它确实验证用户是否可以访问该号码。
要验证您自己的后端,请检索Firebase ID令牌。这只是一小块base64编码的JSON,但重要的是它由Firebase加密签名。这意味着在您的服务器上,您可以验证它是否真的是由Firebase创建的,用于包含在其中的用户和电话号码。用户无法访问基础帐户,也无法生成其中一个令牌。
有关详情,请参阅verifying ID tokens上的文档。
所以接下来的步骤将是:
您可以在登录后随时执行此操作。
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
管理员SDK设置为开箱即用,以检查ID令牌的正确证书,受众,到期日期和其他重要属性。
admin.auth().verifyIdToken(idToken)
.then(function(decodedToken) {
var uid = decodedToken.uid;
// ...
}).catch(function(error) {
// Handle error
});
decodedToken
也会包含电话号码的属性!