Add auth and utils
This commit is contained in:
parent
23a04f1bba
commit
b630fb7ef8
2
.gitignore
vendored
2
.gitignore
vendored
@ -13,3 +13,5 @@
|
|||||||
# .nfs files are created when an open file is removed but is still being accessed
|
# .nfs files are created when an open file is removed but is still being accessed
|
||||||
.nfs*
|
.nfs*
|
||||||
|
|
||||||
|
/auth/node_modules/
|
||||||
|
/auth/.idea/
|
||||||
|
2
auth/.npmrc
Normal file
2
auth/.npmrc
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
{
|
||||||
|
}
|
112
auth/index.js
Normal file
112
auth/index.js
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const crypto = require('crypto');
|
||||||
|
const Redis = require('ioredis');
|
||||||
|
|
||||||
|
function AuthToken(redisOpt) {
|
||||||
|
if (!(this instanceof AuthToken)) {
|
||||||
|
return new AuthToken(redisOpt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!redisOpt) {
|
||||||
|
throw 'AuthToken: need redis config.';
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tokenDB = new Redis(redisOpt);
|
||||||
|
this.tokenDB.on("connect",function(){
|
||||||
|
console.log("AuthToken: ioredis connected: " + JSON.stringify(redisOpt));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthToken.prototype.genToken = async function(userData, expiresSeconds) {
|
||||||
|
// 生成系统内部的user token
|
||||||
|
let hash = crypto.createHash('md5');
|
||||||
|
hash.update(JSON.stringify(userData));
|
||||||
|
let userToken = hash.digest('hex');
|
||||||
|
|
||||||
|
// 缓存到redis
|
||||||
|
let tokenData = {
|
||||||
|
userData: userData,
|
||||||
|
expires: {ttl: expiresSeconds, ts: Math.floor(Date.now() / 1000)}
|
||||||
|
};
|
||||||
|
this.tokenDB.set(userToken, JSON.stringify(tokenData), 'EX', expiresSeconds);
|
||||||
|
|
||||||
|
return userToken;
|
||||||
|
};
|
||||||
|
|
||||||
|
AuthToken.prototype.delToken = async function (userToken) {
|
||||||
|
let tokenData = await this.tokenDB.get(userToken).then(function(data) {
|
||||||
|
return JSON.parse(data);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (tokenData) {
|
||||||
|
this.tokenDB.del(userToken);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
AuthToken.prototype.checkToken = async function (userToken) {
|
||||||
|
let tokenData = await this.tokenDB.get(userToken).then(function(data) {
|
||||||
|
return JSON.parse(data);
|
||||||
|
});
|
||||||
|
|
||||||
|
// token不存在
|
||||||
|
if (!tokenData) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
tokenData.expires.ts = Math.floor(Date.now() / 1000);
|
||||||
|
this.tokenDB.set(userToken, JSON.stringify(tokenData), 'EX', tokenData.expires.ttl);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
AuthToken.prototype.checkTokenKoaRequest = async function (ctx, next) {
|
||||||
|
if (!ctx.request.body.token) {
|
||||||
|
ctx.body = {
|
||||||
|
result: 'fail', error: { code: 401, msg: 'Need user token.' }, data: {}
|
||||||
|
};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let tokenData = await this.tokenDB.get(ctx.request.body.token).then(function(data) {
|
||||||
|
return JSON.parse(data);
|
||||||
|
});
|
||||||
|
if (!tokenData) {
|
||||||
|
ctx.body = {
|
||||||
|
result: 'fail', error: { code: 401, msg: 'User token error.' }, data: {}
|
||||||
|
};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.userData = tokenData.userData;
|
||||||
|
|
||||||
|
//
|
||||||
|
tokenData.expires.ts = Math.floor(Date.now() / 1000);
|
||||||
|
this.tokenDB.set(ctx.request.body.token, JSON.stringify(tokenData), 'EX', tokenData.expires.ttl);
|
||||||
|
|
||||||
|
return next();
|
||||||
|
};
|
||||||
|
|
||||||
|
AuthToken.prototype.checkTokenKoaRequestPost = async function (ctx, next) {
|
||||||
|
if (ctx.req.method === 'POST') {
|
||||||
|
return this.checkTokenKoaRequest(ctx, next);
|
||||||
|
}
|
||||||
|
|
||||||
|
next();
|
||||||
|
};
|
||||||
|
|
||||||
|
AuthToken.prototype.getTokenData = async function (userToken) {
|
||||||
|
let tokenData = await this.tokenDB.get(userToken).then(function(data) {
|
||||||
|
return JSON.parse(data);
|
||||||
|
});
|
||||||
|
|
||||||
|
// token不存在
|
||||||
|
if (!tokenData) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tokenData;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = AuthToken;
|
80
auth/package-lock.json
generated
Normal file
80
auth/package-lock.json
generated
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
{
|
||||||
|
"name": "@ehason/auth",
|
||||||
|
"version": "1.1.1",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"cluster-key-slot": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw=="
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
|
||||||
|
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
|
||||||
|
"requires": {
|
||||||
|
"ms": "^2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"denque": {
|
||||||
|
"version": "1.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
|
||||||
|
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
|
||||||
|
},
|
||||||
|
"ioredis": {
|
||||||
|
"version": "4.14.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.14.0.tgz",
|
||||||
|
"integrity": "sha512-vGzyW9QTdGMjaAPUhMj48Z31mIO5qJLzkbsE5dg+orNi7L5Ph035htmkBZNDTDdDk7kp7e9UJUr+alhRuaWp8g==",
|
||||||
|
"requires": {
|
||||||
|
"cluster-key-slot": "^1.1.0",
|
||||||
|
"debug": "^4.1.1",
|
||||||
|
"denque": "^1.1.0",
|
||||||
|
"lodash.defaults": "^4.2.0",
|
||||||
|
"lodash.flatten": "^4.4.0",
|
||||||
|
"redis-commands": "1.5.0",
|
||||||
|
"redis-errors": "^1.2.0",
|
||||||
|
"redis-parser": "^3.0.0",
|
||||||
|
"standard-as-callback": "^2.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lodash.defaults": {
|
||||||
|
"version": "4.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
|
||||||
|
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
|
||||||
|
},
|
||||||
|
"lodash.flatten": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
|
||||||
|
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
|
},
|
||||||
|
"redis-commands": {
|
||||||
|
"version": "1.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz",
|
||||||
|
"integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg=="
|
||||||
|
},
|
||||||
|
"redis-errors": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
|
||||||
|
"integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60="
|
||||||
|
},
|
||||||
|
"redis-parser": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
|
||||||
|
"integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
|
||||||
|
"requires": {
|
||||||
|
"redis-errors": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"standard-as-callback": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
auth/package.json
Normal file
14
auth/package.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "@ehason/auth",
|
||||||
|
"version": "1.1.1",
|
||||||
|
"description": "User auth lib",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "likeagle",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"ioredis": "^4.14.0"
|
||||||
|
}
|
||||||
|
}
|
1
auth/readme
Normal file
1
auth/readme
Normal file
@ -0,0 +1 @@
|
|||||||
|
This is auth token lib for ehason.
|
6
utils/index.js
Normal file
6
utils/index.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
exports.yo = function() {
|
||||||
|
alert('Yo Coder!')
|
||||||
|
}
|
||||||
|
exports.hello = function() {
|
||||||
|
alert('Hello Coder!')
|
||||||
|
}
|
11
utils/package.json
Normal file
11
utils/package.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "@ehason/utils",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Utils for ehason develope",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "likeagle <likeagle@163.com>",
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user