Ionic + Phonegap - 使用授权

时间:2016-03-11 14:37:25

标签: javascript angularjs database cordova ionic-framework

我最近使用离子框架(也使用phonegap android / ios)制作了简单的应用程序。我需要将一些用户数据存储在数据库中。我发现了firebase并成功将其集成到我的应用程序中。我允许用户匿名登录或通过谷歌登录。在我的情况下,每个用户应该只看到他的内容,所以我添加了规则 - 他们工作。然而,我的应用程序需要在移动平台(android / ios)上没有互联网连接的情况下运行,而firebase不能在javascript中提供完全离线存储(仅限temponary)(持久存储目前仅在本机中实现)。所以基本上我撞墙了。我被告知CouchDB / PouchDB,它确实支持离线存储和与远程服务器同步。我在cloudant上创建了一个帐户,但后来我记得我需要用户授权 - 正如我所说,用户只需拥有自己的数据。因此,假设客户只有本地数据库,并且用户也在远程服务器上使用谷歌数据库登录,因此他可以切换设备并使用相同(他自己的)数据。但我在CouchDB(cloudant)中找不到这样的工具。有没有其他解决方案,它可以顺利地使用离子并提供:

  • 离线数据库,
  • 使用Google授权,
  • 成功授权后同步(使用本地数据库)的远程数据库,
  • 远程数据库托管在某些服务器上(可能需要支付,但需要试用) - 我不想担心服务器 - 仅限客户端

TL; DR:我正在寻找使用远程数据库+本地数据库并在它们之间同步的离子/ angularjs / cordova托管服务。

2 个答案:

答案 0 :(得分:0)

使用MongoDB有什么问题,使用npm mongoose最容易与Express / Node.js集成。它是非常受欢迎且存储数据的好方法,与firebase类似。 例如:

var Express = require('express'),
app = Express.router();
app.route('/api/auth/signup').post(users.signup);

架构示例:

var mongoose = require('mongoose'),
  Schema = mongoose.Schema

var UserSchema = new Schema({
  firstName: {
    type: String,
    trim: true,
    default: '',
    required: 'Please fill in your first name'//message given if you fail to provide the required field.
  },
  lastName: {
    type: String,
    trim: true,
    default: '',
    required: 'Please fill in your last name'
  },
  displayName: {
    type: String,
    trim: true
  },
  email: {
    type: String,
    unique: 'Email already exists. Sign In?',
    lowercase: true,
    trim: true,
    default: '',
    validate: [validateLocalStrategyEmail, 'Please fill a valid email address'],//create a custom Email Validation strategy
    required: 'Please enter a valid business Email'
  },
});

样本控制器:

exports.signup = function (req, res) {
  // For security measurement we remove the roles from the req.body object
  delete req.body.roles;

  // Init user and add missing fields
  var user = new User(req.body);
  user.provider = 'local';
  user.displayName = user.firstName + ' ' + user.lastName;

  // Then save the user
  user.save(function (err) {
    if (err) {
      return res.status(400).send({
        message: errorHandler.getErrorMessage(err)
      });
    } else {
      // Remove sensitive data before login
      user.password = undefined;
      user.salt = undefined;

      var jwtToken = authentication.signToken(user);
      res.json({ user: user, token: jwtToken });
    }
  });
};

你可以在MEAN.js Github上找到一些。 但您必须使用LocalStorage。如果您希望它在iPad / iPhone上运行,可以使用离子应用程序的JSON Web令牌。

答案 1 :(得分:0)

最好的办法是使用适用于本地存储的PouchDB(适用于ionic / cordova),并使用几行代码同步到远程couchdb服务器:

var localDB = new PouchDB('mylocaldb');
var remoteDB = new PouchDB('http://localhost:5984/myremotedb');
localDB.sync(remoteDB);

唯一棘手的问题是具有身份验证的远程服务器。 CouchDB可以开箱即用地处理oauth,但是在每个数据库的情况下,这意味着您需要为每个用户创建一个数据库,这是许多人所做的,但这非常复杂。做一个search for CouchDB on npmjs.com,看看会出现什么。

或者,您可以将CouchDB包装在Express之类的节点服务器之后,并在传递请求之前在Express中处理auth。

这不是一件容易的事,而且一旦你开始使用它,Firebase会收取一笔不小的财产。如果您对服务器端的内容不是很大,那么更简单的方法可能是使用meteorhoodie