网站搜索

typescript - 如何在前端使用 Superlogin、ionic3、PouchDB 和 CouchDB 实现 Superlogin-Client 认证?


我不知道应该把 superlogin-client 的导入和配置放在哪里,也不知道如何将身份验证令牌存储到本地存储中,以便移动应用在离线时能够保持身份验证状态。

我已经尝试过这个,但它不起作用:

    import PouchDB from 'pouchdb';
    import superlogin from 'superlogin-client';

    var config = {
      // The base URL for the SuperLogin routes with leading and trailing slashes (defaults to '/auth/')
      baseUrl: 'http://localhost:3000/auth/',
      // A list of API endpoints to automatically add the Authorization header to
      // By default the host the browser is pointed to will be added automatically
      endpoints: ["localhost:3000"],
      // Set this to true if you do not want the URL bar host automatically added to the list
      //noDefaultEndpoint: false,
      // Where to save your session token: localStorage ('local') or sessionStorage ('session'), default: 'local'
      storage: 'local',
      // The authentication providers that are supported by your SuperLogin host
      providers: ['facebook', 'twitter'],
      // Sets when to check if the session is expired. 'stateChange', 'startup' or nothing.
      // 'stateChange' checks every time $stateChangeStart or $routeChangeStart is fired
      // 'startup' checks just on app startup. If this is blank it will never check.
      checkExpired: false,
      // A float that determines the percentage of a session duration, after which SuperLogin will automatically refresh the
      // token. For example if a token was issued at 1pm and expires at 2pm, and the threshold is 0.5, the token will
      // automatically refresh after 1:30pm. When authenticated, the token expiration is automatically checked on every
      // request. You can do this manually by calling superlogin.checkRefresh(). Default: 0.5
      refreshThreshold: 0.5
    };

    superlogin.configure(config);
    /*
      Generated class for the StoresProvider provider.

      See https://angular.io/guide/dependency-injection for more info on providers
      and Angular DI.
    */
    @Injectable()
    export class StoresProvider {
      db: any;
      remote: any;

      mystores: any = {};
      constructor() {
        console.log('Hello StoresProvider Provider');}

答案#1

看起来你正在尝试从客户端(Ionic)调用 superlogin。然而,我认为 superlogin 的实现应该在服务器端,而你的 Ionic 应用应该向你的 Node 服务器发送注册请求,服务器再使用 superlogin 执行认证。

这是一个示例节点服务器实现:

var express = require('express');
var http = require('http');
var bodyParser = require('body-parser');
var logger = require('morgan');
var cors = require('cors');
var SuperLogin = require('superlogin');
var userRoutes=require('./app/user.route'); 
var app = express();

app.set('port', process.env.PORT || 3000);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());

app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'DELETE, PUT, OPTIONS,POST,GET');
res.header("Access-Control-Allow-Headers", "Authorization, Origin, X- 
Requested-With, Content-Type, Accept");
next();
});

var config = {
dbServer: {
protocol: 'http://',
host: '13.175.228.159:5984',  //should be url of couchdb server
user: 'couchadmin',
password: 'Passw0rd',
couchAuthDB: '_users',
userDB:'sl_users'
},
defaultSecurityRoles: {
members: ['merchant']
},
 mailer: {
  fromEmail: '[email ',
   options:{
    service: 'Gmail',
     auth: {
      user: '[email ',
      pass: 'simplepass'
    }
 }
},
security: {
  maxFailedLogins: 3,
  lockoutTime: 600,
  tokenLife: 86400,
  loginOnRegistration: true,
   defaultRoles:['merchant','user']
    },
    providers: {
   local: true
  }
}


var superlogin = new SuperLogin(config);

//enable cors preflight for all options.
app.options('*', cors()) // include before other routes 

// Mount SuperLogin's routes to our app
app.use('/auth', superlogin.router);
app.use('/user',userRoutes,superlogin.requireAuth);

app.listen(app.get('port'));
console.log("App listening on " + app.get('port'));