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'));
