在本節中,我們將設計 iothub 的裝置認證機制。
emq x 在預設的情況是允許匿名連線的,所以在上一節課程中,iotdevice
類在連線 mqtt broker 的時候沒有指定 username 和 password 也能成功。
當然,我們肯定不希望任意乙個裝置都能連線到 maque iothub。首先我們需要到 maque iothub 註冊乙個裝置,然後裝置再通過由 maque iothub 下發的 username/password 連線到 maque iothub,以實現一機一密。
阿里雲 iot 平台用乙個三元組(productkey, devicename, secret)來標識乙個邏輯上的裝置,productkey 是指裝置所屬的產品,devicename 用來標識這個裝置的唯一名稱,secret 是指這個裝置連線物聯網平台使用的密碼。我認為這是乙個很好的設計,因為即使在同一家公司內部,往往也會有多個服務不同業務的物聯網產品需要接入,所以多乙個 productkey 對後續的主題名、資料儲存和分發等進行乙個區分是很有必有的。
maque iothub 將使用類似的三元組(productname, devicename, secret)來標識邏輯上的一台裝置。productname由業務系統提供,可以是乙個有意義的 ascii 字串,devicename 由 iothub 自動生成,(productname, devicename)應該是全域性唯一的。
這裡我們約定,對乙個裝置(productname1, devicename1, secret1),它接入 maque iothub 的 username 為productname1/devicename1
,password 為secret1
。
為什麼說三元組標識的是邏輯上的一台裝置而不是物理上的一台裝置? 比如說:移動應用接入 maque iothub 來訂閱某個主題,假如有乙個使用者在多個移動裝置上用同乙個賬號登入,他使用的應該是同乙個三元組,因為他訂閱的訊息在每個裝置上都應該能收到,那麼在這種情況下乙個三元組實際上是對應多個物理裝置。後面我們再來講怎麼來區分物理裝置。emq x 通過外掛程式提供了多種靈活的認證方式,你可以在這裡找到 emq x 自帶的外掛程式列表,maque iothub 使用 mongodb 作為資料儲存,所以這裡我們選擇 mongodb 認證外掛程式。除了使用 mongodb 認證以外,我們還會使用 jwt 的認證方式來提供一種臨時性的接入認證。為什麼要用"/"做分隔符,這裡先不作說明,在講到下行資料處理的部分再來解釋。
在啟用認證外掛程式之前,我們需要關閉 emq x 的預設匿名認證。
allow_anonymous = false
然後重新啟動 emq xmongodb 認證
mongodb 的認證外掛程式功能邏輯很簡單:將裝置的 username、password 儲存在 mongodb 的某個 collection 中,當裝置發起 connect 的時候,broker 再查詢這個 collection,如果 username/password 能匹配得上,則允許連線,否則拒絕連線。
在用於認證的資料庫:auth.mongo.database = mqtt
儲存裝置 username 和 password 的資料庫,這裡暫時用預設值。
用於認證的 collection:auth.mongo.auth_query.collection = mqtt_user
儲存裝置 username 和password 的 collection, 這裡暫時使用預設值。
password 欄位名:auth.mongo.auth_query.password_field = password
。
password 加密方式:auth.mongo.auth_query.password_hash = plain
, password 欄位的加密方式,這裡選擇不加密。
是否開啟超級使用者查詢:auth.mongo.super_query = off
,設定為關閉。
是否開啟許可權查詢:auth.mongo.acl_query = off
,這裡我們暫時不開啟 publish 和 subscribe 的許可權控制。
然後我們在 mongodb 插入一條記錄,在 mongodb shell 中執行:
use mqtt
db.createcollection("mqtt_user")
db.mqtt_user.insert()
然後載入 mongodb 認證外掛程式:
不出意外的話控制台會輸出:
plugin emqx_auth_mongo loaded successfully.
這個時候如果我們執行 test_mqtt.js,會得到以下輸出:error: connection refused: bad username or password
接下來,我們在連線的時候指定剛才儲存在 mongodb 的 username/password: test/123456
...
var client = mqtt.connect('mqtt:', )
...
重新執行 test_mqtt.js,如果
return code: 0
說明基於 mongodb 的認證方式已經生效了。
如果返回的是error: connection refused: bad username or password
,你需要檢查:
可以通過執行jwt (json web token) 認證
使用 mongodb 認證外掛程式已經能夠滿足我們對裝置註冊的需求,但是我在這裡還想再引入一種新的認證方式:jwt 認證。為什麼呢?考慮以下兩個場景:
json web token(jwt,讀作 [/dʒɒt/]),是一種基於 json 的、用於在網路上宣告某種主張的令牌(token),更詳細的介紹可以參考 jwt.io
emq x 提供了 jwt 認證外掛程式來提供 jwt 方式的認證,在下面我們來看下如何使用 jwt 來接入 maque iothub:
...在這裡我們使用 emq x 預設的 jwt secret 簽發了乙個有效期為 10 秒的 jwt token 進行連線,重新執行 test_mqtt.js,如果輸出為:var jwt = require('jsonwebtoken')
var password = jwt.sign(, "emqxsecret")
var client = mqtt.connect('mqtt:', )
...
return code: 0
說明基於 jwt 的認證方式已經生效了。
如果返回的是error: connection refused: bad username or password
,你需要檢查:
認證鏈我們載入了 mongodb 和 jwt 兩個認證外掛程式,emq x 就可以用這兩個外掛程式組成的認證鏈來對接入的 client 進行認證。簡單來說,裝置既可以使用儲存在 mongodb 裡的 username 和 password,也可以使用 jwt 來接入 emq x broker。
emq x 在載入乙個外掛程式後,會把這個外掛程式的名字寫入在這一節我們討論了 maque iothub 中裝置的認證方式,以及 emq x 是如何支援這些認證方式的。下一節我們會寫一些**,把這些功能整合到 maque iothub 的裝置註冊流程中去。
**推薦閱讀
裝置註冊 驅動註冊以及雜項裝置註冊之間的關係
1.裝置宣告是在平台檔案 home leizi android itop4412 kernel 3.0 arch arm mach exynos mach itop4412.c中,如下圖,並且裝置名稱是led two.核心編譯之後,s3c device leds ctl被註冊到核心中,並不名稱是le...
塊裝置註冊 register blkdev
先看一下函式的實現 cpp view plain copy int register blkdev unsigned int major,const char name if index 0 major index ret major 如果主裝置號不為0 我們就可以申請乙個struct blk ma...
字元裝置註冊例項
實驗平台 s5pv210開發板 kernel2.6 功能 驅動三顆led,led1 led2,共用乙個fops,led3單獨使用乙個fops。當open led1 led2 時,led1 和 led2 同時亮,open led3 時,led3亮 release 對應熄滅。include includ...