我知道我可以使用Firebase's
电话验证开启Android
and iOS
,但问题是有关客户端验证的信息很容易在客户端被伪造,因为我只使用服务器端SSL证书,所以,只有客户端知道服务器是可信的。
因此,我决定在服务器端发送手机号码并在那里进行检查:发送验证码并向用户询问此验证码。但我看不到任何 C++ 服务器Firebase SDK
,仅提供客户端C++ SDK。
所以,我有两个选择:
- 了解客户端验证如何在服务器端可信(请注意,我可以有不可信的客户端)?所以,这意味着我可以使用主要的 Firebase 电话号码身份验证方法。
- 使用服务器端电话验证。
请帮我解决 Firebase 中的这个误解。
客户端在这里绝对可以工作。流程是这样的:
- 您请求使用电话号码登录
- Firebase 电话身份验证服务器向该号码发送代码
- 用户将您的代码输入您的应用程序,该应用程序将其发送到 Firebase 身份验证服务器
- Firebase 身份验证服务器向您返回 Firebase 身份验证令牌
这是有效的,因为恶意用户只有拥有您的手机才能知道该代码。它不能保证该设备就是具有该电话号码的设备(用户可以有两部手机,或者使用笔记本电脑上的手机登录),但它确实会验证用户是否有权访问该号码。
为了向您自己的后端验证这一点,您可以检索 Firebase ID 令牌。这只是一个 base64 编码的 JSON 的小包,但重要的是它由 Firebase 进行了加密签名。这意味着在您的服务器上,您可以验证它是否确实由 Firebase 创建,其中包含其中的用户和电话号码。如果用户无法访问基础帐户,则无法生成这些代币之一。
请参阅文档验证 ID 令牌 https://firebase.google.com/docs/auth/admin/verify-id-tokens了解更多!
所以你的下一步是:
检索 Firebase ID 令牌
您可以在登录后随时执行此操作。
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();
}
}
});
在服务器上验证 ID 令牌的内容。
管理 SDK 是开箱即用的,用于检查 ID 令牌的正确证书、受众、到期日和其他重要属性。
admin.auth().verifyIdToken(idToken)
.then(function(decodedToken) {
var uid = decodedToken.uid;
// ...
}).catch(function(error) {
// Handle error
});
decodedToken
也将包含电话号码的属性!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)