feat(User/Auth): Use stand alone auth token

This commit is contained in:
Berkeley Martinez
2017-12-29 09:59:27 -08:00
committed by mrugesh mohapatra
parent 7a922229f4
commit 07f30427cb
6 changed files with 51 additions and 5 deletions

View File

@ -483,6 +483,12 @@ module.exports = function(User) {
}
);
User.prototype.createAuthToken = function createAuthToken({ ttl } = {}) {
return Observable.fromNodeCallback(
this.authTokens.create.bind(this.authTokens)
)({ ttl });
};
User.prototype.getEncodedEmail = function getEncodedEmail() {
if (!this.email) {
return null;
@ -506,7 +512,7 @@ module.exports = function(User) {
}
// create a temporary access token with ttl for 15 minutes
return this.createAccessToken$({ ttl: 15 * 60 * 1000 });
return this.createAuthToken({ ttl: 15 * 60 * 1000 });
})
.flatMap(token => {
let renderAuthEmail = renderSignInEmail;

View File

@ -288,6 +288,14 @@
"type": "hasOne",
"model": "pledge",
"foreignKey": ""
},
"authTokens": {
"type": "hasMany",
"model": "AuthToken",
"foreignKey": "userId",
"options": {
"disableInclude": true
}
}
},
"acls": [

View File

@ -21,7 +21,7 @@ module.exports = function enableAuthentication(app) {
const ifUserRedirect = ifUserRedirectTo();
const router = app.loopback.Router();
const api = app.loopback.Router();
const { AccessToken, User } = app.models;
const { AuthToken, User } = app.models;
router.get('/login', (req, res) => res.redirect(301, '/signin'));
router.get('/logout', (req, res) => res.redirect(301, '/signout'));
@ -99,7 +99,7 @@ module.exports = function enableAuthentication(app) {
));
}
// first find
return AccessToken.findOne$({ where: { id: authTokenId } })
return AuthToken.findOne$({ where: { id: authTokenId } })
.flatMap(authToken => {
if (!authToken) {
throw wrapHandledError(
@ -135,7 +135,7 @@ module.exports = function enableAuthentication(app) {
}
);
}
return authToken.validate$()
return authToken.validate()
.map(isValid => {
if (!isValid) {
throw wrapHandledError(
@ -150,7 +150,7 @@ module.exports = function enableAuthentication(app) {
}
);
}
return authToken.destroy$();
return authToken.destroy();
})
.map(() => user);
});

View File

@ -78,5 +78,9 @@
"about": {
"dataSource": "db",
"public": true
},
"AuthToken": {
"dataSource": "db",
"public": false
}
}

View File

@ -0,0 +1,15 @@
import { Observable } from 'rx';
export default function(AuthToken) {
AuthToken.on('dataSourceAttached', () => {
AuthToken.findOne$ = Observable.fromNodeCallback(
AuthToken.findOne.bind(AuthToken)
);
AuthToken.prototype.validate = Observable.fromNodeCallback(
AuthToken.prototype.validate
);
AuthToken.prototype.destroy = Observable.fromNodeCallback(
AuthToken.prototype.destroy
);
});
}

View File

@ -0,0 +1,13 @@
{
"name": "AuthToken",
"base": "AccessToken",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {},
"validations": [],
"relations": {},
"acls": [],
"methods": {}
}