どーも、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 パフォーマンスがー問題」とか、いろいろ出てくるんでしょうけども、ちょっと試すには便利そうです。