用户尝试登录/ signUp

时间:2018-02-13 09:45:39

标签: android firebase firebase-cloud-messaging

我在Android应用中使用FCM(Firebase云消息传递)。我接下来需要:

  1. 用户打开应用,如果
  2. app从sharedPreferences获取登录名和md5密码并尝试登录
  3. 如果登录成功 - 用户输入mainActivity else
  4. 如果登录错误 - 用户进入登录屏幕
  5. 用户输入登录名和密码,然后按登录按钮
  6. 如果成功 - 用户在sharedPreferences中输入mainActivity和登录名和密码(md5)。其他用户看到错误并且可以登录越来越多
  7. OR

    1. 用户可以打开注册屏幕并使用新的登录名和密码创建新的个人资料
    2. 用户尝试注册,如果成功 - 用户在sharedPreferences中输入mainActivity和登录名和密码(md5)存储。否则用户收到错误
    3. 这是Android应用的典型逻辑。但我不明白如何将Firebase添加到此逻辑中。

      当我的应用开始时,我没有FirebaseInstanceId而我只能进入onTokenRefreshasync)。但是当用户尝试登录时,我需要将此id(令牌)传递给服务器。我有一些方法:

      1. 当用户打开应用程序时 - 我等待一段时间,然后获取令牌并使用登录名和密码发送 - 我认为这是非常糟糕的做法。

      2. 我在onTokenRefresh中保存了令牌tosharedPreferens。当我尝试登录时,我会检查此令牌。如果令牌为空 - 我抛出异常并打开登录屏幕()。此时,令牌将到达设备,用户将尝试再次登录。 - 我认为这也是不好的做法。

      3. 当用户尝试登录时,我只向服务器发送登录名和密码。当我得到令牌时 - 我会在另一个请求中将它发送到服务器。 - 我不喜欢,因为这将是两个请求。

      4. 怎么做好呢?

        很久以前我用这种方法(全部使用GSM时):

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);
            sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            CloudMessaging.getInstance(this).retrieveRegistrationId(new CloudMessaging.RegistrationListener() {
                @Override
                public void onRegistrationReceive(String registrationId) {
        
                    savePushToken(registrationId);
                    //open activity
                        }
                    });
                }
            });
        }
        

        当我获得令牌并且在打开活动之后我正在等待。但在Firebase中 - 一切都不同

        现在我做到了:

        @Override
            public void onTokenRefresh() {
                String token = FirebaseInstanceId.getInstance().getToken();
                Log.d(TAG, "FCM Token: " + token);
                utils.saveToken(token);
            FirebaseMessaging.getInstance().subscribeToTopic(FRIENDLY_ENGAGE_TOPIC);  
            }
        

        当用户尝试登录时 - 我从存储中获取令牌并使用登录名和密码发送到服务器。

        更新:

        我不太明白最后一段。现在我看到了这样的逻辑。

        1 - 我打开应用程序并转到屏幕输入登录名和密码。此时,我不知道我是否有令牌或者它是否为空。

        因此,我试图进入任何情况。如果成功登录 - 我检查sharedPreferences是否有令牌,然后是否将其发送到服务器。如果不是 - 那么他将从另一个地方发送(来自onTokenRefresh方法)。在onTokenRefresh方法中,当我获得新令牌时 - 我将其保存到sharedPreferences并检查authToken。如果authToken不为null(这意味着我已登录) - 我将新令牌发送到服务器,否则只保存到sharedPreferences。登录成功后发送。有道理吗?

3 个答案:

答案 0 :(得分:0)

就个人而言,我会选择第二个选项,将令牌保存到共享首选项,然后在成功登录后访问它。

但是,如果您正确地将其保存到共享首选项,则它不应为null。唯一可能是null的方法是,如果您的应用中设置的FCM存在问题,这不应该是您登录的用户的限制,因为这可以通过更新修复,您的用户可能只需要没有FCM的时间很短......

FCM令牌在单独的请求中发送是很常见的。从here开始,它指出令牌是在初次启动时生成的。

另外一点与您的问题无关,如果您在设备上存储用户密码的MD5哈希值,您还应该对其进行哈希处理并在到达服务器时使用salt。你没有提到任何关于这件事的事情,但是当你说关于在设备上存储用户密码时,它给我一个标志。

如果您真的希望了解有关安全性的更多信息,请查看JSON Web Tokens

答案 1 :(得分:0)

  

当我的应用程序启动时,我没有FirebaseInstanceId,我只得到onTokenRefresh(async)。

如果我理解正确,您希望只会在onTokenRefresh()中生成令牌。对于大多数情况都是如此,但行为是,只要您调用getToken() - 可能在您的MainActivity中,就会出现两种情况:它立即返回令牌,或者返回null。

对于第一种情况,您可以立即将令牌发送到首选的应用服务器。如果为空,则onTokenRefresh()会触发,您可以根据需要选择发送它。

onTokenRefresh()仅在检测到有新令牌时触发 - 在您的用例中,您当前拥有的实际上是通常的方式 - 单独发送用户详细信息的请求和令牌 - 在大多数情况下,不应该保持相同的重要性。即登录凭证至关重要。

答案 2 :(得分:-1)

从Firebase文档中获取注册令牌:

注册令牌可能会在以下情况下发生变化:

- 该应用删除实例ID

- 应用程序在新设备上恢复

- 用户卸载/重新安装应用

- 用户清除应用数据。