一、安装
- https://github.com/pantsel/konga
- https://sailsjs.com/#!/documentation
$ git clone https://github.com/pantsel/konga.git
$ cd konga
$ npm i
二、配置文件
将默认的配置文件重命名,".env_example" --> ".env"
- .env_example
PORT=1337
NODE_ENV=production
KONGA_HOOK_TIMEOUT=120000
DB_ADAPTER=postgres
DB_URI=postgresql://localhost:5432/konga
KONGA_LOG_LEVEL=warn
TOKEN_SECRET=some_secret_token
2.1、环境
指定环境为production,默认是Development
- NODE_ENV=production
2.2、密钥
定期更新你的密钥,因为konga在给登录用户颁发token的时候,没有对token设置有效期,所以用户可以一直使用该token,对安全有一定的隐患。
- TOKEN_SECRET=123456
三、启动
3.1、start.sh
这是konga开源项目中自带的启动命令,但是它非是后台运行的,一旦你退出命令行窗口,Konga进程就挂了。
#!/bin/bash
#bash start.sh -c prepare -a postgres -u postgresql://postgres:postgres@localhost:5432/konga
if [ $# -eq 0 ]
then
# If no args are set, start the app as usual
node --harmony app.js
else
while getopts "c:a:u:" option
do
case "${option}"
in
c) COMMAND=${OPTARG};;
a) ADAPTER=${OPTARG};;
u) URI=${OPTARG};;
esac
done
# echo $COMMAND
# echo $ADAPTER
# echo $URI
# echo $PORT
if [ "$COMMAND" == "prepare" ]
then
node ./bin/konga.js $COMMAND --adapter $ADAPTER --uri $URI
else
echo "Invalid command: $COMMAND"
exit
fi
fi
- 总结:核心的命令是“node --harmony app.js”,下面将编写一个自定义的命令。
3.2、自定义命令
nohup node --harmony app.js > nohup.log &
四、源码调试
执行命令npm start即可,因为它默认的环境就是开发模式。
围绕着问题去看它的源码,带着问题看源码,有重点。下面将遇到的疑问点梳理出来。
4.1、 安全类的问题
- 用户的账户和密码,是存储在哪?
- 用户在首次登录成功之后,token多久失效,换句话说,下次输入用户名和密码进行授权是在什么时候?(离职用户对系统的安全性很关键)
- 禁用用户或修改密码,会要求用户重新进行授权认证么?
4.2、token的颁发与验证
见类Token.js, 密钥依赖于环境变量env.TOKEN_SECRET,而且它不会保存在redis中,也没有其他关于过期时间之说。
/**
* Service method to generate a new token based on payload we want to put on it.
*
* @param {String} payload
*
* @returns {*}
*/
module.exports.issue = function issue(payload) {
sails.log.verbose(__filename + ':' + __line + ' [Service.Token.issue() called]');
return jwt.sign(
payload, // This is the payload we want to put inside the token
process.env.TOKEN_SECRET || "oursecret" // Secret string which will be used to sign the token
);
};
/**
* Service method to verify that the token we received on a request hasn't be tampered with.
*
* @param {String} token Token to validate
* @param {Function} next Callback function
*
* @returns {*}
*/
module.exports.verify = function verify(token, next) {
sails.log.verbose(__filename + ':' + __line + ' [Service.Token.verify() called]');
return jwt.verify(
token, // The token to be verified
process.env.TOKEN_SECRET || "oursecret", // The secret we used to sign it.
{}, // Options, none in this case
next // The callback to be call when the verification is done.
);
};
4.3、环境
环境取之于process.env.NODE_ENV, 如果未指定,则默认为development。同理,数据存储默认为localDiskDb。
module.exports = {
/**
* The default fallback URL to Kong's admin API.
*/
// kong_admin_url : process.env.KONG_ADMIN_URL || 'http://127.0.0.1:8001',
connections: {
},
models: {
connection: process.env.DB_ADAPTER || 'localDiskDb',
},
session: {
secret: '' // Add your own SECRET string here
},
port: process.env.PORT || 1338,
environment: process.env.NODE_ENV || 'development',
log: {
level: 'info'
}
};
4.4、创建数据库
- index.js
如果没有定义数据库类型,则默认使用本地数据库。
'use strict'
module.exports = function (next) {
if(process.env.NODE_ENV == 'production') return next();
switch (process.env.DB_ADAPTER) {
case("postgres"):
return require("./dbs/pg").run(next);
case("mysql"):
return require("./dbs/mysql").run(next);
case("mongo"):
return next();
case("sqlserver"):
return next();
default:
console.log("No DB Adapter defined. Using localDB...");
return next();
}
}
五、总结
1、不定期地更新.env中的TOKEN_SECRET值,强制将用户踢出,让用户必须进行认证。
2、使用mysql或者postgres等数据库存储,不建议使用localDB。
3、指定自己的环境NODE_ENV,如果是在生产环境,一定是production。
4、建议你对接LDAP,统一身份认证。(详见另外一篇文章)