当前位置: 首页>后端>正文

konga的安装及运维

一、安装

  • 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、创建数据库

konga的安装及运维,第1张
  • 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,统一身份认证。(详见另外一篇文章)


https://www.xamrdz.com/backend/3xn1939414.html

相关文章: