离子/cordova应用程序中的身份validation
首先,我不是专业人士。
为了成为一名更好的开发人员,我试图了解需要什么以及如何完成创buildIonic-Framework应用程序的注册/login。
大多数单页面应用程序(SPA)处理同样为客户端提供HTML的节点服务器上的身份validation。 在我的情况下,手机本身将提供HTML,所以我猜测我可能会遇到一些CORs问题。
我明白,ionic framework使用状态和基于angular度的客户端身份validation回购我应该进行身份validation,每当我改变我的应用程序的状态。
我有一个最初的应用程序设置,但现在我有点困惑从哪里去这里。
我拥有的工具:
- Node.JS服务器 – 感谢DigitalOcean(我应该使用这个作为我的数据库的代理?)
- CouchDB服务器(我们来到这里完整的堆栈)
我的问题:
- 使用混合应用程序进行身份validation的标准方法是什么?
- 我应该使用Node.JS作为数据库的代理吗?
- 我应该跳过node.js并直接使用CouchDB服务器进行身份validation吗? (我听说过这个)
- 我是否以这种错误的方式去做?
- 我有什么潜在的障碍?
- CORS如何与混合应用程序一起工作?
- 任何我失踪?
感谢您帮助我成为更好的开发人员。
好的,有很多答案。 但简单的答案就是保持简单和authentication像一个普通的Web应用程序的身份validation。
在一个普通的networking应用程序
- 在常规的Web应用程序中,您可以向服务器发送请求,并使用数据库检查凭据以validation用户身份
在移动应用程序中:
- 在移动应用程序中,您将通过ajax请求执行相同的操作(在angular度情况下使用$ http)。
- 在服务器上完成身份validation后,向应用程序发回一个响应(例如,json / xml),向前端指示身份validation的结果。
标准方法是什么?
- 我不确定标准,但这似乎是最简单的方法。 标准总是改变,因为总是有更好的方法去做。 所以只要把工作做好了,以后再改进。
我应该使用Node.JS作为数据库的代理吗?
- 我没有使用nodeJs,所以我不知道你的意思。 但是,如果有助于知道 – 我使用接收到Ajax请求的服务器上的PHP,处理与MySQL数据库的身份validation,并返回到移动应用程序的响应。
我是否以这种错误的方式去做?
- 我还没有看到你的初始设置。 就应用程序的状态更改而言,只要进行身份validation,就可以使用localStorage在成功login后存储用户信息。 在注销时清除localStorage。 因此,您只需检查localStorage中是否存在该值,以确认用户是否已login。
我有什么潜在的障碍?
- 我build议你开始制作你的应用程序,你很快就会知道。 总的来说,离子+cordova使事情变得非常简单,并消除了应用程序开发的大部分障碍。
CORS如何与混合应用程序一起工作?
- Cordova默认允许跨域请求,所以你不会有任何跨域请求的问题,因此你可以直接访问你的服务器进行authentication。
任何我失踪?
-
IonicFramework只是一个前端的HTML5框架。 它本身不能让你成为一个移动应用程序。它只会给你很好的用户界面工作。 IonicFramework为您提供了一些使用angular度实现的很好的JavaScriptfunction 。 因此,要充分利用离子,您应该熟练掌握angularJs。 学习angular度是非常值得的努力,所以去吧。
-
实际的应用程序由Cordova编译。 cordova需要你的正常的HTML / CSS / JavaScript文件,并将其打包到android apk或iphone ipa,以便它们可以作为本地应用程序安装在相应的操作系统上。
-
cordova是什么将允许您访问本机的function,如相机,画廊,联系等
2015年6月3日更新
基于令牌的身份validation :我相信是一种select。 这是一种更简洁,更安全的处理身份validation的方式。
欲了解更多信息,请查看以下链接:
- Angular jwt (对于在前端使用angular的应用程序)
- Video Talk:使用JWT保护您的应用程序 (由jwt.io的创build者)
- Jwt.io (jwt的官方网站)
- Jwt-Auth for Laravel (对于那些在后端使用Laravel的人)
使用基于令牌的方法有什么好处?
跨域/ CORS: Cookie + CORS在不同的域名中performance不佳。 基于令牌的方法允许您对任何服务器进行AJAX调用,因为您使用HTTP头来传输用户信息。 无状态(又名服务器端可扩展性):不需要保留会话存储,令牌是传递所有用户信息的自包含的实体。 其余的州生活在客户端的cookies或本地存储。
CDN:您可以从CDN(例如JavaScript,HTML,图像等)提供您应用的所有资产,而您的服务器端只是API。 解耦:你不是绑定到一个特定的authenticationscheme。 令牌可能在任何地方生成,因此您的API可以从任何地方通过validation这些调用的单一方式进行调用。
移动就绪:在开始使用本地平台(iOS,Android,Windows 8等)时,Cookie在使用安全API(您必须处理Cookie容器)时并不理想。 采用基于令牌的方法简化了这一点。 CSRF:由于您不依赖于cookies,因此您不需要防止跨站点请求(例如,您的站点不可能生成POST请求并重新使用现有的身份validationcookie,因为不会有) 。
性能:我们在这里没有提供任何硬件性能基准testing,但是networking往返(比如查找数据库会话)可能比计算HMACSHA256来validation令牌和parsing其内容花费更多的时间。
login页面并非特例:如果使用量angular器编写functiontesting,则不需要处理任何特殊情况的login。 基于标准:您的API可以接受标准的JSON Web令牌(JWT)。 这是一个标准,有多个后端库(.NET,Ruby,Java,Python,PHP)和支持其基础设施的公司(例如Firebase,Google,Microsoft)。 例如,Firebase允许其客户使用任何身份validation机制,只要您生成具有某些预定义属性的JWT,并使用共享密钥进行签名即可调用其API。
nathvarun给了一个非常完整的答案,但我想分享我在应用程序中进行身份validation的步骤。
- 通过ajax发送
email
+password
到服务器 - 在服务器中生成一个
token
并将其发回给应用程序 - 将
email
+token
存储在localStorage
- 对于我向服务器发送的每个请求,我都通过
POST
发送email
+token
- 在服务器中,我使用该标记validation该用户的真实性,如果为
true
,则执行该方法,如果为false
,则发回给应用一个错误(401) - 如果应用程序收到成功,那么没关系,如果收到错误我redirect到login屏幕。
好的是,当应用程序打开时,您可以从localStorage
获取email
+ token
,发送到服务器,如果该令牌对该用户可用,则redirect到主屏幕,否则redirect到login。 然后每当用户清除应用程序的caching,他被redirect到login屏幕。
如果您正在寻找一个完整的身份validation示例,我可以推荐我的完整指南用于AngularJS的用户身份validation 。
确保SPA的安全并不容易,但是如果你知道如何安全的话。 在这种情况下,作为后端使用的内容并不重要,因为它只是提供我们需要标识用户的令牌。 一般你想要
- 捕捉每个状态变化事件
- 捕获每个HTTP请求到服务器
所以基本上所有可能改变应用程序界面的东西。 在这种情况下,您需要检查用户是否已通过身份validation,或者有权执行此操作。 这是确保我眼中SPA的最佳方式。
关于CORS,错误可能在开发时发生,但这也是服务器设置正确的头信息的一部分。
实际上,我正在为我正在处理的一些应用程序需要类似的东西。 我花了相当一段时间调查这一点,并能够实现这一目标。
我对结果非常满意,除了电子邮件/密码authentication之外,我还添加了一些以相同方式工作的社交authentication。
- 在客户端用提供者的(脸书/推特/ instagram)urllogin打开url
- 用户login并被redirect到服务器的callbackurl(我的服务器是用nodejs写的)
- 一旦我得到了来自提供者的访问令牌。 我保存这个令牌,然后为客户端创build一个令牌,以便每次用户想要访问受保护的资源时都可以重复使用。
下载apk并testing它。
如果这是您正在寻找的东西,您可以在以下url查看客户端代码: https : //github.com/malikov/Authenticate.me-client-cordova-ionic
服务器端代码在: https : //github.com/malikov/Authenticate.me-Node-Server