为什么我们不能使用getUid()在firebase身份验证中对后端服务器进行身份验证

时间:2016-06-22 09:49:55

标签: firebase-authentication

在他们提到的这段代码片段(firebase doc)中,不要使用user.getUid()对后端服务器进行身份验证。改为使用FirebaseUser.getToken()。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // Name, email address, and profile photo Url
    String name = user.getDisplayName();
    String email = user.getEmail();
    Uri photoUrl = user.getPhotoUrl();

    // The user's ID, unique to the Firebase project. Do NOT use this value to
    // authenticate with your backend server, if you have one. Use
    // FirebaseUser.getToken() instead.
    String uid = user.getUid();
}


getUid()    A unique user ID, intended as the user's unique key across all providers.   
getToken()  The Firebase authentication token for this session.

我的要求是。

  1. 首先,我将使用firebase身份验证方法(电子邮件和密码)注册用户。
  2. 我将保存String uid = user.getUid();注册成功后,在我自己的后端服务器中。
  3. 用户信用信息表示用户余额作为关键用户保存在我自己的后端服务器中.getUid()。
  4. 用户使用电子邮件和密码登录并询问其余额。
  5. 我将从firebase获取user.getUid()并与我的记录匹配,如果匹配,则将余额返回给用户。
  6. 他们说getUid()是唯一的用户ID,但请勿使用此值对您的后端服务器进行身份验证。

    为什么这样?为什么我们不能使用getUid()对您的后端服务器进行身份验证?

2 个答案:

答案 0 :(得分:10)

uid是用户的唯一标识符。因此,虽然它识别用户,但它不会对其进行身份验证。

一个简单的推论是我的Stack Overflow ID是209103.知道了,你可以识别我。但要向Stack Overflow证明你是Frank van Puffelen,要求你知道我的证书。

用户的ID经常在界面中公开。例如,如果您点击我的个人资料,您将看到我的ID。这对于识别我来说是必要的。如果您也使用相同的身份验证身份,那么曾经看过您的个人资料的每个人都可以在网站上冒充您。在安全方面不是一个好主意。

答案 1 :(得分:0)

以您的要求为例,如果您使用[GET] https://your-domain.com/api/users/$uid/balance来检索用户数据,则此API完全不安全,任何人都可以使用随机的$ uid获得其他用户的数据。

按照评论(firebase文档)的建议,FirebaseUser.getToken()将获得一个JWT令牌,您应该在后端使用firebase Admin SDK验证该令牌,这就是您可以信任的数据。 / p>

并且客户端方法现在应该更新为user.getIdToken()https://firebase.google.com/docs/auth/admin/verify-id-tokens是更详细的参考。