我在我的Android应用中使用FCM(Firebase Cloud Messaging(。我需要下一个:
- 用户打开的应用程序和如果
- 应用程序获取登录和MD5密码,然后尝试登录
- 如果登录成功 - 用户进入MainAttivity else
- 如果登录错误 - 用户进入登录屏幕
- 用户输入登录和密码,然后按登录按钮
- 如果成功 - 用户进入Main Activity,login and Login and Password(MD5(存储在共享流程中。否则用户会看到错误,并且可以登录更多
或
- 用户可以打开注册屏幕并创建一个新的配置文件,并使用新的登录和密码
- 用户试图注册,如果成功 - 用户进入MainAttivity,登录和密码(MD5(存储在SharedPreferences中。否则用户会出错
它是Android应用程序的典型逻辑。但是我不明白如何将firebase添加到此逻辑中。
当我的应用启动时,我没有FirebaseInstanceId
,我只能在onTokenRefresh
(async
(中进行。但是,当用户尝试登录时,我需要将此ID(令牌(传递给服务器。我有一些方法:
-
用户打开应用程序时 - 我等待一段时间,然后获得令牌并发送登录和密码 - 我认为这是非常糟糕的练习。
-
我将令牌TosharedPreferens保存在
onTokenRefresh
中。当我尝试登录时,我会检查这个令牌。如果令牌为空 - 我投掷异常并打开登录屏幕((。到这个时候,令牌将进入设备,用户将尝试再次登录。 - 我认为这也是不良的习惯。 -
当用户尝试登录时,我仅向服务器发送登录和密码。当我获得令牌时 - 我将其发送到另一个请求中的服务器。 - 我不喜欢那是两个请求。
怎么做?
很多时候,我都使用了这种方法(当全部使用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-我打开应用程序,然后转到屏幕输入登录和密码。在这一点上,我不知道我有一个令牌还是无效。
因此,我尝试在任何情况下输入。如果成功登录 - 我会在共享流程中检查是否有令牌,然后将其发送到服务器。如果不是 - 那么他将从另一个地方发送(从Ontokenrefresh方法(。在OntokenRefresh方法中,当我获得新的令牌时 - 我将其保存到共享流程中并检查Authtoken。如果authtoken不是null(这意味着我登录( - 我将新令牌发送到服务器,而仅保存到共享Preferences。并在登录成功后发送。成功签署。
但是,只要您将其保存到正确的共享偏好中,它不应为null。无效的唯一方法是,如果您的应用程序中设置的FCM存在问题,这不应该限制您的用户登录FCM短时间...
很常见的是,FCM令牌是在单独的请求中发送的。从这里开始,它指出令牌是在初始启动时生成的。
也与您的问题无关的另一点,如果您在设备上存储了用户密码的MD5哈希,则还应该放哈片并在到达服务器时使用盐。您没有提及此事,但是当您说有关将用户的密码存储在设备上时,它向我提出了旗帜。
如果您真的很想了解有关安全性的更多信息,请查看JSON Web令牌。
当我的应用程序启动时,我没有FirebaseInstanceID,并且我只在OntokenRefresh(async(中获得OT。
如果我正确理解这一点,您期望将令牌仅在onTokenRefresh()
中生成。在大多数情况下都是如此,但是行为是,一旦您致电getToken()
- 大概是在您的主activity中,将有两种情况:它立即返回令牌,或者它返回null。
对于第一种情况,您可以立即将令牌发送到首选的应用程序服务器。如果是null,则onTokenRefresh()
然后触发,为您提供随意发送的选项。
onTokenRefresh()
仅在检测到有一个新的令牌时(在您的用例中,您当前拥有的实际上是通常的方法(的单独请求,以发送用户详细信息和令牌 - 在大多数情况下,不应保持相同的重要性。即签名凭证至关重要。
从firebase文档中您获得注册令牌:
当注册令牌可能会更改:
- 应用程序删除实例ID
- 在新设备上还原该应用
- 用户卸载/重新安装应用
- 用户清除应用数据。