即使用户使用Ionic/Cordova强制退出应用程序,如何保持登录状态?

即使用户使用Ionic/Cordova强制退出应用程序,如何保持登录状态?,cordova,authentication,login,persistence,ionic-framework,Cordova,Authentication,Login,Persistence,Ionic Framework,本机移动应用程序的一个常见功能是,即使用户关闭了相关应用程序,也可以保持登录状态(例如,请参阅iOS上的Facebook应用程序) Cordova/Ionic/PhoneGap应用程序如何通过用户名/密码对Rails后端进行身份验证 我正在使用Desive_token_auth gem来促进针对Rails的身份验证,如果这有什么不同的话。我最近一直在考虑这个问题,我认为我有一个有效的解决方案。我对Rails一无所知,但这个想法应该会转移。我在Mongo只有数据库方面的经验,所以请容忍我 每个设备

本机移动应用程序的一个常见功能是,即使用户关闭了相关应用程序,也可以保持登录状态(例如,请参阅iOS上的Facebook应用程序)

Cordova/Ionic/PhoneGap应用程序如何通过用户名/密码对Rails后端进行身份验证


我正在使用Desive_token_auth gem来促进针对Rails的身份验证,如果这有什么不同的话。

我最近一直在考虑这个问题,我认为我有一个有效的解决方案。我对Rails一无所知,但这个想法应该会转移。我在Mongo只有数据库方面的经验,所以请容忍我

每个设备都有一个唯一的标识符,可以使用device.uuid()或getUUID()在Cordova中检索该标识符。此id仅保证每个平台都是唯一的,尽管它可能在所有平台上都是唯一的,因此您应该将平台和模型添加到您的唯一标识符中,以便更好地度量

var deviceId = device.platform + device.model + device.uuid;
现在,我们已经创建了一个真正唯一的id,它永远不会更改,而且您不必处理本地存储

现在,假设您的数据库中有一个设备集合或设备表,这些设备的外观与下面的键值对类似

{
    device: DEVICEID;
    loggedIn: true;
    userId: USERID;
}
现在,当应用程序启动时,从设备中获取deviceId并将其发送到服务器以搜索它。这对您来说可能会有所不同,只是一个简单的键值搜索

var result = Devices.find({device: deviceId}).fetch();
在Mongo中,这将返回一个结果数组,但应该只有一个结果。现在,我们检查他们以前是否登录过,并获取用户ID

var loggedIn = result[0].loggedIn;
var user = result[0].userId;
如果他们之前已注销或没有结果,请将他们转到登录页面。如果他们已登录,请自动运行正常的登录过程。 用户id可以是指向另一个集合中对象的指针

这就是我想我应该做的,或者你可以让用户对象将设备id作为一个键,但是一个用户可以有多个设备,所以它必须是一个键数组,我不确定现在如何搜索它。 添加新设备就像向集合添加唯一id并将其指向用户一样简单

每次打开应用程序时,它都会检查设备id,并查看用户是否登录到该设备。您可以在发生此情况时显示启动屏幕

现在,如果用户选择“从设置中注销”,您可以更新数据库以反映这一点,下次用户转到应用程序时,他们将注销

我希望我的想法能有所帮助

编辑: 我在想,每次他们注销时,最好从集合中删除设备对象,而不是只设置loggedIn,这样,如果他们要删除设备,它将不会保留在您的集合中。不过,我不确定删除对象的频率会对数据库的性能产生多大影响,但据我所知,用户注销设备的频率不会太高,所以这应该不是什么大问题

不过,这引出了另一点,即二手设备。不过,这是一个简单的补救方法,每次用户登录到现有设备时,如果新用户的userId密钥发生更改,请将其更新为新用户

进一步编辑(因为我无法评论):
关于本地存储/缓存以及它的危险性。您可以在本地存储中自动登录某人的唯一功能是他们的帐户凭据,这是高度敏感的信息,不应在本地存储(密码也不应远程存储,但哈希是一个单独的主题)。您永远不会将他们的密码存储在缓存中,您可以编写一些密钥并将其存储,但本地可访问的任何内容都可以被某人读取,并可能在另一台设备上复制。设备id信息更难伪造。

抱歉,我无法发表评论(需要50个代表),但我认为在这里使用localStorage是一个有效的选择。您可以创建并将其存储在缓存中

在Android上,除非您通过进入“设置”明确清除应用程序的缓存,否则即使您强制停止应用程序或将其从“多任务”窗格中删除,应用程序仍将保持您的用户登录(即不终止缓存)。我不确定它在iOS中是如何工作的

我强烈推荐这个

此外,还有令人惊叹的第三方库可以为您处理身份验证:

  • (个人推荐)

我希望这有帮助!祝你好运。

不是很安全,但是你可以使用Cordova/JS友好的本地存储

if ( logged_in_successfully ) {
  localStorage.setItem("email", email)
  localStorage.setItem("password", password)
} 

使用localStorage。登录后,将用户名和密码设置到localStorage中,并在注销时将其清除。如果您没有在每次登录时注销并终止应用程序,请检查您的localStorage key值是否为空,然后导航到您的页面。您不应该使用localStorage。。。使用WebSQL数据库会容易得多,因为它连接到您的web数据库。@Sithys这是个好主意,但不幸的是WebSQL被弃用了:@Banik根据我的经验,在用户在iOS上杀死Cordova应用程序后,localStorage不会继续存在。你的体验有什么不同吗?@AustinYork我不这么认为。在iOS上,如果你不删除应用程序,它仍然会保留杀戮后的数据。如果你在API中使用基于令牌的身份验证,这会让你的登录持久化付出太多的努力,而且这个事件无法工作,因为你的令牌在服务器端不会永远持续。这里有一个更好的方法将这些凭证存储在LocalStorage(ngStorage甚至更好)中,每次用户在后台验证应用程序时,如果已验证,请导航到desire页面或导航到有意义的登录页面。您的localstorage唯一没有用户凭据的时间是在首次登录期间以及用户手动注销时。请尝试以下方法:localstorage.email=”myEmail@yourdomain.com"; localStorage.id=“56”;