原文 http://blog.csdn.net/lnniyunlong99/article/details/50557666 )
一个知道服务器地址就能连接,并publish和subscribe的broker不是好的broker。这样对于物联网通信安全有很大的威胁,所以身份验证是一个必须要做的工作,也是其中一部分工作。根据不同的需求,可以根据连接到broker的用户名和密码进行publish和subscribe权限控制。
推荐一个比较好的文章 ,文章里面的工作我还没有做,但是很有启发。
本文中连接者的身份验证是通过查找mysql数据库进行比对,再决定是否允许连接broker。
先贴出来node.js的服务器源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 var conMySql = require ('./con_mysql' );var mosca = require ('mosca' );var MqttServer = new mosca.Server({ port : 1883 }); var authenticate = function (client, username, password, callback ) { var auth = new conMySql(); var authorized = auth.isPassed(username,password,callback); } MqttServer.on('clientConnected' , function (client ) { console .log('client connected' , client.id); }); 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...' ); MqttServer.authenticate = authenticate; });
红色字体部分是用到了mysql数据库。
下面贴出node.js的查找mysql数据库源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 var mysql = require ('mysql' );function Auth ( ) { this .isPassed = function (uname,pwd,callback ) { 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); callback(null ,ispassed); console .log('------------------------------------------------------------' ); }); }; }; module .exports = Auth;
了解到node.js的异步特性,查找数据库是异步进行的,找到数据库中的内容,再进行比对是否是合法登录用户。回调函数是最佳的方案。红色字体部分就是回调的使用。
至于客户端源码可以参考 http://blog.csdn.net/lnniyunlong99/article/details/50519946