Auth0のドキュメントに書いてあったMQTTをWeb APIっぽく使うための工夫

どーも、ritouです。

一言でいうと、MQTTでもTokenを使えそうというだけの話

MQTTに関して、様々な言語のライブラリや、他の機能と連携するプラグインなどもよく見かけます。
詳細な解説記事からさくっと使って「簡単でした!」みたいな記事までたくさん出回っておりますが、その中で、MQTTのAuthN&AuthZに着目した内容に触れているドキュメントを見つけました。
https://auth0.com/docs/scenarios/mqtt

Auth0ってのはIdentity as a Service、クラウドな認証基盤なサービスなんて紹介されたりしてるサービスです。
で、上記のドキュメントは”Authenticating & Authorizing Devices using MQTT with Auth0” というタイトルのとおり、ざっくり言うと

  • CONNECT時のusername/passwordとAuth0を用いて接続元デバイスの検証を行う = Authentication
  • PUB/SUB時にAuth0を用いて接続元デバイスとTopicの組み合わせの検証を行う = Authorization

という感じで、2種類の方法が紹介されています。

  • (1) MQTT Clientは普通の使い方、MQTT BrokerがAuth0に問い合わせる

  • (2) MQTT ClientはAuth0からTokenを取得し、"username/password"のところに"'jwt'/(取得したToken文字列)"を指定し、BrokerはTokenの検証を行う

(2)は個人的に大好物であるところのOAuthなWeb APIっぽい使い方に見えます。
username/passwordのところに違う値をぶっこむというやや強引なやり方ですが、Tokenの検証などについては前に書いたやつと同じ感じの設計でいけそうです。
OAuth 2.0のAccess TokenへのJSON Web Token(JSON Web Signature)の適用 - r-weblife

Moscaはこのあたりを試すのに便利

そもそもMQTT Brokerをしっかり実装しようとすると大変そうだし、さらにTokenを使うように拡張なんて...と思われるのはないでしょうか。
Auth0は、Node製のMQTT BrokerであるMoscaを利用しています。
Moscaでは、AuthN/AuthZに関連する機能を拡張しやすいつくりになっています。

With Mosca you can authorize a client defining three methods.

  • #authenticate
  • #authorizePublish
  • #authorizeSubscribe

Those methods can be used to restric the accessible topics for a specific clients.

https://github.com/mcollina/mosca/wiki/Authentication-&-Authorization

使い方はAuth0Moscaのサンプルを見るとわかりやすいです。

var auth0 = new Auth0Mosca(...);

//Setup the Mosca server
var server = new mosca.Server(...);

//Wire up authentication & authorization to mosca
server.authenticate = auth0.authenticateWithJWT();
server.authorizePublish = auth0.authorizePublish();
server.authorizeSubscribe = auth0.authorizeSubscribe();

Productionで使うとなると「接続/Pub数の制限とか、もっといろんな独自処理を挟みたい vs パフォーマンスがー問題」とか、いろいろ出てくるんでしょうけども、ちょっと試すには便利そうです。

まとめ

  • Auth0が出しているMQTT利用シナリオにあった、Tokenを用いる方法がWebAPIっぽいなーと思って紹介した
  • そのあたりの拡張が簡単にできるMoscaは、ちょっと遊ぶには便利そうな印象

そういえば、BaaSにもサーバーサイドスクリプトってのがあります。
MQTT as a Serviceを提供するようなところでもこのあたりの拡張ができて自サービスで発行したOAuthのAccess Tokenなどが使えると、MQTT Broker自体のパフォーマンスを下げずに既存のサービスとの親和性も高められてさらに便利かなーと思いました。

ではまた!