本文介紹云消息隊(duì)列 MQTT 版客戶端在Token模式下如何上傳Token、更新Token、監(jiān)聽Token失效信息和監(jiān)聽Token非法信息。

Token模式MQTT客戶端連接參數(shù)設(shè)置

MQTT支持三種模式的Token,每個(gè)客戶端每個(gè)類型至多申請(qǐng)一個(gè)Token,根據(jù)實(shí)際需要可能申請(qǐng)其中的一種或者多種,并使用。具體的類型如下表所示。

類型標(biāo)志說(shuō)明
R只讀類型的Token,只擁有指定資源的讀權(quán)限。
W只寫類型的Token,只擁有指定資源的寫權(quán)限。
RW讀寫類型的Token,對(duì)指定資源既可以讀也可以寫。
Token模式下MQTT客戶端的連接參數(shù)設(shè)置如下:
  • Username

    由鑒權(quán)模式名稱、AccessKey ID、InstanceId三部分組成,以 “|” 分隔。Token模式下鑒權(quán)模式設(shè)置為”Token”。

  • 舉例

    一個(gè)客戶端的ClientId是GID_Test@@@0001,使用了實(shí)例ID是mqtt-xxxxx,使用了AccessKey ID是YYYYY,則Token模式的Username應(yīng)該設(shè)置成“Token|YYYYY|mqtt-xxxxx”。

  • Password

    客戶端需要使用的Token內(nèi)容。具體設(shè)置方法是將所有的Token按照Token類型和Token內(nèi)容依次使用“|”連接符拼接成一個(gè)完整的字符串,不同類型之間的Token拼接順序無(wú)要求。

    舉例1:客戶端只有一個(gè)讀類型的Token,Token字符串為“123”,則Password為“R|123”。

    舉例2:客戶端擁有2個(gè)類型的Token,讀類型的Token是“123”,寫類型的Token是“abcd”,則Password為“R|123|W|abcd”。

    說(shuō)明 客戶端設(shè)置Token參數(shù)時(shí)需要保證嚴(yán)格按照約定規(guī)則,且需要保證所有Token有效,如果僅用部分Token合法,服務(wù)端仍然會(huì)判定非法。

客戶端更新Token憑證

正常情況下客戶端更換Token時(shí)需要斷開連接重新使用新的Token來(lái)連接,如果業(yè)務(wù)場(chǎng)景中不希望由于更換Token中斷客戶端的連接,可以使用動(dòng)態(tài)更新Token的接口來(lái)動(dòng)態(tài)替換服務(wù)端session內(nèi)的Token數(shù)據(jù)。

動(dòng)態(tài)更新Token本質(zhì)上是由MQTT客戶端以約定的系統(tǒng)Topic發(fā)送一個(gè)特殊的消息,將新的Token內(nèi)容更新到服務(wù)端,客戶端需要保證在動(dòng)態(tài)替換的同時(shí),本地配置也要替換,防止下次連接初始化又使用了舊的Token數(shù)據(jù)。

  • 更新Token發(fā)送Topic:$SYS/uploadToken
  • 內(nèi)容:JSONString
  • 內(nèi)容信息:
    名稱類型說(shuō)明
    tokenString如果客戶端選用Token模式,則需要上傳Token字符串。
    typeStringToken類型,分為W、R、RW共三種,對(duì)應(yīng)三種權(quán)限類型的Token。一個(gè)客戶端最多擁有這3個(gè)Token,設(shè)置錯(cuò)誤的類型會(huì)導(dǎo)致權(quán)限校驗(yàn)錯(cuò)誤。
  • 返回值:

    普通的PubAck報(bào)文。客戶端必須等到該響應(yīng)才能進(jìn)行下一步Pub或者Sub操作,否則服務(wù)端仍然有可能使用舊的Token數(shù)據(jù)來(lái)做鑒權(quán),可能會(huì)鑒權(quán)失敗導(dǎo)致連接斷開。

客戶端監(jiān)聽即將失效的Token信息(無(wú)需訂閱)

服務(wù)端為方便業(yè)務(wù)調(diào)試和監(jiān)控,會(huì)在Token即將失效的時(shí)候以系統(tǒng)Topic的形式推送通知消息到MQTT客戶端,客戶端可以監(jiān)控該消息來(lái)判斷是否有出現(xiàn)過(guò)Token即將到期的情況。

  • 接收Topic:$SYS/tokenExpireNotice
  • 內(nèi)容:JSONString
  • 內(nèi)容信息:
    名稱類型說(shuō)明
    expireTimeLong該Token即將于什么時(shí)候失效,格式為毫秒時(shí)間戳,一般提前5分鐘通知,只通知一次,但服務(wù)端不保證一定會(huì)有通知。
    typeStringToken類型,分為W、R、RW共三種,對(duì)應(yīng)客戶端上傳的三種權(quán)限類型的Token。
  • 響應(yīng):

    客戶端收到Token即將失效的消息后,需要盡快處理重新申請(qǐng)Token的動(dòng)作,以免造成收發(fā)消息失敗。

客戶端監(jiān)聽Token非法的通知(無(wú)需訂閱)

服務(wù)端為方便業(yè)務(wù)調(diào)試和監(jiān)控,會(huì)在Token鑒權(quán)錯(cuò)誤時(shí)以系統(tǒng)Topic的形式推送通知消息到MQTT客戶端,客戶端可以監(jiān)控該消息來(lái)判斷是否有出現(xiàn)過(guò)Token不匹配等錯(cuò)誤權(quán)限的情況。

  • 接收Topic:$SYS/tokenInvalidNotice

  • 內(nèi)容:JSONString

  • 內(nèi)容信息:
    名稱類型說(shuō)明
    codeintToken校驗(yàn)失敗的類型。
    typeStringToken類型,分為W、R、RW共三種,對(duì)應(yīng)客戶端上傳的三種權(quán)限類型的Token。
  • 響應(yīng):

    服務(wù)端校驗(yàn)Token失效,會(huì)導(dǎo)致鑒權(quán)失敗,服務(wù)端會(huì)主動(dòng)斷開鏈接。斷開鏈接之前,服務(wù)端會(huì)給客戶端推送失敗的Code,客戶端根據(jù)Code即可判斷原因。

    type code錯(cuò)誤類型
    1偽造Token,不可解析。
    2Token已經(jīng)過(guò)期。
    3Token已經(jīng)被吊銷。
    4資源和Token不匹配。
    5權(quán)限類型和Token不匹配。
    8簽名不合法。
    -1賬號(hào)權(quán)限不合法。