typescript - ¿Cómo se implementa la autenticación de Superlogin-Client en el lado del front-end con Superlogin, ionic3, PouchDB y CouchDB?
No tengo idea de dónde poner la importación y configuración de superlogin-client ni cómo obtener un token de autenticación almacenado en el almacenamiento local para que la aplicación móvil pueda permanecer autenticada mientras está sin conexión.
He intentado esto pero no funciona:
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');}
Respuesta #1
Parece que estás intentando invocar superlogin desde el lado del cliente (Ionic). Sin embargo, creo que la implementación de superlogin debería estar en el lado del servidor y tu aplicación Ionic debería enviar una solicitud de registro a tu servidor Node, el cual a su vez realizaría la autenticación usando superlogin.
Aquí hay una implementación de servidor de nodo de ejemplo:
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'));
