node.js搭建mqtt服務器(broker)身份驗證(auth)

一個知道服務器地址就能連接,並publish和subscribe的broker不是好的broker。這樣對於物聯網通信安全有很大的威脅,所以身份驗證是一個必須要做的工作,也是其中一部分工作。根據不同的需求,可以根據連接到broker的用戶名和密碼進行publish和subscribe權限控制。

推薦一個比較好的文章,文章裏面的工作我還沒有做,但是很有啓發。(https://auth0.com/docs/scenarios/mqtt#components-of-the-solutionss)

本文中連接者的身份驗證是通過查找mysql數據庫進行比對,再決定是否允許連接broker。

先貼出來node.js的服務器源碼:

/**
 * Created by niyl on 2016/1/13.
 */
<span style="color:#FF0000;">var conMySql = require('./con_mysql');</span>
var mosca = require('mosca');
var MqttServer = new mosca.Server({
    port: 1883
});

/**
 * 驗證方法
 *
 **/
var authenticate = function(client, username, password, callback) {
<span style="color:#FF0000;">    var auth = new conMySql();
    var authorized = auth.isPassed(username,password,callback);</span>
    //console.log('authenticate---->'+username+','+password);
    //callback(null, authorized);
}


//MqttServer.on('authenticate',function(client, username, password, callback){
//    console.log('authenticate---->'+username+','+password);
//    callback(null, false);
//});

MqttServer.on('clientConnected', function(client){
    console.log('client connected', client.id);
});

/**
 * 監聽MQTT主題消息
 **/
MqttServer.on('published', function(packet, client) {
    var topic = packet.topic;
    console.log('message-arrived--->','topic ='+topic+',message = '+ packet.payload.toString());

});

MqttServer.on('ready', function(){
    console.log('mqtt is running...');
    <span style="color:#FF0000;">MqttServer.authenticate = authenticate;</span>
});

紅色字體部分是用到了mysql數據庫。

下面貼出node.js的查找mysql數據庫源碼:

/**
 * Created by niyl on 2016/1/21.
 */
var mysql  = require('mysql');

/**
 *
 * @constructor
 */
function Auth(){

    /**
     * 初始化的時候帶上 登錄mqtt服務器的用戶名和密碼
     * @param uname 登錄mqtt服務器的用戶名
     * @param pwd 登錄mqtt服務器的密碼
     * @param callback 函數運行時異步的,運行查找完結果後調用該回調函數
     */
    this.isPassed = function(uname,pwd,<span style="color:#FF0000;">callback</span>){

        var ispassed = false;

        var connection = mysql.createConnection({

            host     : 'localhost',
            user     : 'root',
            password : '123456',
            port: '3306',
            database: 'test',
        });

        connection.connect();

        var  userGetSql = 'SELECT * FROM mqtt_users where uname = '+uname;
//查
        connection.query(userGetSql,function (err, result) {

            if(err){
                console.log('[SELECT ERROR] - ',err.message);
                return;
            }
            connection.end();
            console.log('--------------------------SELECT----------------------------');
            console.log(result);
            console.log('------------------------------------------------------------');
            if(result != null && result.toString() != ''){
                console.log('uname = '+ result[0].uname);
                console.log('pwd = '+ result[0].pwd);
                console.log('client_id = '+ result[0].client_id);
                if (result[0].uname == uname && result[0].pwd == pwd  ){
                    ispassed = true;
                }
            }

            console.log('callback(null,ispassed)-------------------------------'+ispassed);
            <span style="color:#FF0000;">callback(null,ispassed);</span>

            console.log('------------------------------------------------------------');

        });
        //return ispassed;
    };

};
module.exports = Auth;
//isPassedAuth('13800000000','123456','app_13800000000');

瞭解到node.js的異步特性,查找數據庫是異步進行的,找到數據庫中的內容,再進行比對是否是合法登錄用戶。回調函數是最佳的方案。紅色字體部分就是回調的使用。

至於客戶端源碼可以參考 http://blog.csdn.net/lnniyunlong99/article/details/50519946

本人的node.js也是入門級水平.關於mqtt broker node.js的問題,歡迎交流探討:[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章