离子/cordova应用程序中的身份validation

首先,我不是专业人士。

为了成为一名更好的开发人员,我试图了解需要什么以及如何完成创buildIonic-Framework应用程序的注册/login。

大多数单页面应用程序(SPA)处理同样为客户端提供HTML的节点服务器上的身份validation。 在我的情况下,手机本身将提供HTML,所以我猜测我可能会遇到一些CORs问题。

我明白,ionic framework使用状态和基于angular度的客户端身份validation回购我应该进行身份validation,每当我改变我的应用程序的状态。

我有一个最初的应用程序设置,但现在我有点困惑从哪里去这里。

我拥有的工具:

  • Node.JS服务器 – 感谢DigitalOcean(我应该使用这个作为我的数据库的代理?)
  • CouchDB服务器(我们来到这里完整的堆栈)

我的问题:

  1. 使用混合应用程序进行身份validation的标准方法是什么?
  2. 我应该使用Node.JS作为数据库的代理吗?
  3. 我应该跳过node.js并直接使用CouchDB服务器进行身份validation吗? (我听说过这个)
  4. 我是否以这种错误的方式去做?
  5. 我有什么潜在的障碍?
  6. CORS如何与混合应用程序一起工作?
  7. 任何我失踪?

感谢您帮助我成为更好的开发人员。

好的,有很多答案。 但简单的答案就是保持简单和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的步骤。

  1. 通过ajax发送email + password到服务器
  2. 在服务器中生成一个token并将其发回给应用程序
  3. email + token存储在localStorage
  4. 对于我向服务器发送的每个请求,我都通过POST发送email + token
  5. 在服务器中,我使用该标记validation该用户的真实性,如果为true ,则执行该方法,如果为false ,则发回给应用一个错误(401)
  6. 如果应用程序收到成功,那么没关系,如果收到错误我redirect到login屏幕。

好的是,当应用程序打开时,您可以从localStorage获取email + token ,发送到服务器,如果该令牌对该用户可用,则redirect到主屏幕,否则redirect到login。 然后每当用户清除应用程序的caching,他被redirect到login屏幕。

如果您正在寻找一个完整的身份validation示例,我可以推荐我的完整指南用于AngularJS的用户身份validation 。

确保SPA的安全并不容易,但是如果你知道如何安全的话。 在这种情况下,作为后端使用的内容并不重要,因为它只是提供我们需要标识用户的令牌。 一般你想要

  • 捕捉每个状态变化事件
  • 捕获每个HTTP请求到服务器

所以基本上所有可能改变应用程序界面的东西。 在这种情况下,您需要检查用户是否已通过身份validation,或者有权执行此操作。 这是确保我眼中SPA的最佳方式。

关于CORS,错误可能在开发时发生,但这也是服务器设置正确的头信息的一部分。

实际上,我正在为我正在处理的一些应用程序需要类似的东西。 我花了相当一段时间调查这一点,并能够实现这一目标。

我对结果非常满意,除了电子邮件/密码authentication之外,我还添加了一些以相同方式工作的社交authentication。

  1. 在客户端用提供者的(脸书/推特/ instagram)urllogin打开url
  2. 用户login并被redirect到服务器的callbackurl(我的服务器是用nodejs写的)
  3. 一旦我得到了来自提供者的访问令牌。 我保存这个令牌,然后为客户端创build一个令牌,以便每次用户想要访问受保护的资源时都可以重复使用。

下载apk并testing它。

如果这是您正在寻找的东西,您可以在以下url查看客户端代码: https : //github.com/malikov/Authenticate.me-client-cordova-ionic

服务器端代码在: https : //github.com/malikov/Authenticate.me-Node-Server