我在Android应用中使用FCM(Firebase云消息传递)。我接下来需要:
OR
这是Android应用的典型逻辑。但我不明白如何将Firebase添加到此逻辑中。
当我的应用开始时,我没有FirebaseInstanceId
而我只能进入onTokenRefresh
(async
)。但是当用户尝试登录时,我需要将此id(令牌)传递给服务器。我有一些方法:
当用户打开应用程序时 - 我等待一段时间,然后获取令牌并使用登录名和密码发送 - 我认为这是非常糟糕的做法。
我在onTokenRefresh
中保存了令牌tosharedPreferens。当我尝试登录时,我会检查此令牌。如果令牌为空 - 我抛出异常并打开登录屏幕()。此时,令牌将到达设备,用户将尝试再次登录。 - 我认为这也是不好的做法。
当用户尝试登录时,我只向服务器发送登录名和密码。当我得到令牌时 - 我会在另一个请求中将它发送到服务器。 - 我不喜欢,因为这将是两个请求。
怎么做好呢?
很久以前我用这种方法(全部使用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。登录成功后发送。有道理吗?
答案 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
- 应用程序在新设备上恢复
- 用户卸载/重新安装应用
- 用户清除应用数据。