Token鑒權概述
云消息隊列 MQTT 版通過Token鑒權模式向MQTT客戶端提供臨時訪問權限。您可通過MQTT Token服務來給本地賬號系統管理的用戶頒發臨時的訪問憑證,并限制訪問權限,以實現對單一客戶端、單一資源的細粒度權限控制。本文介紹使用流程以及相關注意事項。
名詞解釋
術語 | 說明 |
Token(臨時憑證) | 云消息隊列 MQTT 版頒發的臨時訪問憑證,代表單一客戶端對特定資源的訪問權限。 |
應用服務器 | 您管理本地賬號的服務器,用來替客戶端申請和管理Token服務的應用。 |
MQTT服務器 | 云消息隊列 MQTT 版權限認證和消息收發服務器,用來處理應用服務器發起的Token相關的請求以及消息收發業務。 |
使用流程
Token鑒權模式相比簽名模式更加復雜,您需要按照下圖所示的流程,部署您的應用服務器。而且在初始化時,MQTT客戶端需要具備與您的應用服務器交互(獲取和更新Token)的能力。
具體流程如下:
客戶端啟動時,需要先連接應用服務器驗證身份。
客戶端向應用服務器申請所需的所有Topic的權限。
應用服務器驗證客戶端是否有必要操作所需的Topic權限,如果驗證通過則向云消息隊列 MQTT 版服務器申請對應資源的Token。
云消息隊列 MQTT 版服務器驗證申請Token的請求,判斷合法之后返回對應的Token。
應用服務器將返回的Token持久化到本地,對每個客戶端需要的權限以及Token信息進行映射。緩存Token有以下優勢:
客戶端重新啟動后再訪問時,只要權限范圍沒有變化,應用服務器可以返回緩存的Token,避免重復申請。
客戶端重新申請Token時,如果MQTT服務器異常,應用服務器可以嘗試返回客戶端之前申請的Token以實現本地容災。
MQTT客戶端按照規范將Token作為參數設置,連接MQTT服務器,服務端驗證通過后客戶端即可正常收發消息。
客戶端正常收發消息。如果服務端判斷Token失效,即會觸發鑒權失敗,斷開連接,客戶端應該重新發起申請Token的請求。
客戶端行為約束
客戶端從應用服務器拿到的信息除了Token本身,還需要獲取Token的失效時間,以便本地計算何時提前刷新Token。
必須按照約定形式將Token作為連接參數設置到Password中,每次連接時上傳。
客戶端應該知曉自己使用的Token的時效性,確保不要使用過期的Token,否則服務端會斷開連接。
客戶端可以監聽服務端下推的Token失效的通知消息,但服務端不保證通知一定觸發,該通知僅供排查問題使用。
客戶端應該對應用服務器返回的Token做持久化,避免每次重連都申請一樣的Token,防止大批量客戶端同時連接壓垮應用服務器。
客戶端更新Token可以選擇關閉舊的客戶端連接,然后重新使用新的Token來連接,也可以選擇使用MQTT提供的系統Topic動態上傳更新Token。如果選擇動態更新Token,需要保證本地的配置也同步更新,以供下次連接初始化使用。
應用服務器行為約束
應用服務器必須驗證自己的客戶端是否合法,避免客戶端冒用身份申請Token。
應用服務器應該對Token和客戶端的關系、已分配的Token、對應權限內容以及生效時間進行管理,避免同一個客戶端重復調用。
應用服務器將Token返回給客戶端的同時,也應該告知客戶端當前Token的操作權限以及過期時間,以便客戶端提前刷新Token。
應用服務器需要做本地容災,避免因MQTT服務器訪問短暫不可用而導致業務阻塞的情況。
相關API
Token鑒權流程通過相關的API來完成。
應用服務器負責Token的申請和吊銷管理,和云消息隊列 MQTT 版服務器之間通過HTTPS的OpenAPI進行交互。
每個接口都要求通過AccessKey和請求簽名來做身份驗證。目前開放申請Token、吊銷Token以及校驗Token接口。詳細信息,請參見Token應用服務器接口。
云消息隊列 MQTT 版客戶端則包括動態更新Token、監聽Token失效信息,以及監聽Token非法信息三個接口。詳細信息,請參見Token客戶端接口。