npm-package/auth/index.js

123 lines
3.0 KiB
JavaScript

'use strict';
const crypto = require('crypto');
const Redis = require('ioredis');
function AuthToken(redisdb, expiresSeconds) {
this.tokenDB = redisdb;
this.defaultExpiresSeconds = expiresSeconds;
}
AuthToken.prototype.genToken = async function ({ userData, userapp }) {
// 生成系统内部的user token
let hash = crypto.createHash('md5');
hash.update(JSON.stringify(userData) + Date() + Math.random());
let userToken = hash.digest('hex');
// 缓存到redis
let tokenData = {
userData: userData,
apps: {},
createts: Math.floor(Date.now() / 1000),
ttl: this.defaultExpiresSeconds
};
tokenData.apps[userapp.appid] = userapp;
await this.tokenDB.set(userToken, JSON.stringify(tokenData), 'EX', this.defaultExpiresSeconds);
return userToken;
};
AuthToken.prototype.update = async function (userToken, { userData, userapp }) {
let tokenData = await this.tokenDB.get(userToken).then(function (data) {
return JSON.parse(data);
});
if (tokenData) {
if (userData) tokenData.userData = userData;
if (userapp) tokenData.apps[userapp.appid] = userapp;
await this.tokenDB.set(userToken, JSON.stringify(tokenData), 'EX', this.defaultExpiresSeconds);
}
};
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, updateExpire = true) {
let tokenData = await this.tokenDB.get(userToken).then(function (data) {
return JSON.parse(data);
});
// token不存在
if (!tokenData) {
return null;
}
if (updateExpire) {
tokenData.expires.ts = Math.floor(Date.now() / 1000);
this.tokenDB.set(userToken, JSON.stringify(tokenData), 'EX', tokenData.expires.ttl);
}
return tokenData;
};
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;
};
AuthToken.prototype.checkTokenKoaRequest = async function (ctx, next) {
let token = ctx.request.body.token
if (!token) token = ctx.header['authorization']
if (!token) token = token = ctx.header['token']
if (!token) {
ctx.body = {
code: 401, msg: 'Need user token.', data: {}
};
return;
}
let tokenData = await this.checkToken(token, "");
if (!tokenData) {
ctx.body = {
code: 401, msg: 'Need user token.', data: {}
};
return;
}
ctx.userData = tokenData.userData;
return next();
};
/*
AuthToken.prototype.checkTokenKoaRequestByAgent = async function (ctx, next) {
return this.checkTokenKoaRequest(ctx, ctx.userAgent.source, true, next);
};
*/
let tokenInstance = null;
module.exports = function getTokenInstance(redisdb) {
if (!tokenInstance) {
tokenInstance = new AuthToken(redisdb);
}
return tokenInstance;
};