Auth0でTesselデバイスを認証および認可する

Tesselは優れたボードです。強力なハードウェア仕様や高い拡張性に加えて、Javascriptでもプログラミングすることができます。Kickstarterで発表があった直後から、サポートを表明し、早く手に入れたいと首を長くして待っていました。

Tessel - Tesselポートの図

そして、ついにその時がやってきました。Auth0からトークンを取得し、APIを呼び出して、最初のプログラムを書くことができるのです。

Tesselの目標は、Javascriptとの完全な互換性を実現することです。コアNodeモジュールの大部分も機能しますが、すべてではありません。詳細については、GithubのTessleドキュメントを参照してください。

サンプル

このサンプルはいたって単純です。

  1. デバイス資格情報を使用して、Auth0でResource Owner(リソース所有者)エンドポイントを呼び出します。

  2. トークンを受け取ります。

  3. トークンを使ってAPIを呼び出します。

Tessel - TesselからAuth0へのフロー図

var http = require('https');
var tessel = require('tessel');

tessel.syncClock(function () {

  var device_id = 'tessel-01';
  var password = 'THE TESSEL PASSWORD';

  authenticate(device_id, password, function(e,token){

    if(e) return console.log("Error:" + e);

    getDeviceProfile(token.access_token, function(e, profile){
      console.log("Device profile:");
      console.log(profile);
    });
  });

  function getDeviceProfile(token, done){
    request('{yourDomain}',
          '/userinfo',
          'GET',
          {
          "Content-type": "application/json",
          "Authorization": "Bearer " + token
        },
        null,
        function(e,response){
          if(e) return done(e);
          done(null, JSON.parse(response));
        });
  }

  function authenticate(device_id, password, done)
  {
    request('{yourDomain}',
          '/oauth/ro',
          'POST',
          {
          "Content-type": "application/json",
        },
        JSON.stringify({
            client_id:   '{yourClientId}',
            username:    device_id,
            password:    password,
            connection:  'devices',
            grant_type:  "password",
            scope: 'openid'
          }),
          function(e,response){
            if(e) return done(e);
            done(null, JSON.parse(response));
        });
  }

  function request(host, path, method, headers, body, done){
    var options = {
      hostname: host,
      path: path,
      method: method,
      headers: headers
    };

    var req = http.request(options, function(res) {
      res.setEncoding('utf8');

      var response = "";

      res.on('data', function (chunk) {
        response += chunk;
      });

      res.on('end', function(){
        done(null, response);
        });
    });

    req.on('error', function(e) {
      done(e);
    });

    if( body ) req.write(body);
    req.end();
  }
});

Was this helpful?

/

コードに関する注目すべき点:

  1. Nodeと99%の互換性があります(唯一のデバイス固有モジュールはtesselで、これは適切な時間基準でSSLの呼び出しが行われることを確認するためだけに使用します)。

  2. request関数は、httpモジュール関数の簡単なラッパーです。requestモジュールはTesselでは現在機能しません。

リソース所有者のエンドポイントでは資格情報(ユーザー名/パスワードなど)が必要であるため、Auth0に接続されたバックエンドユーザーストアは、これをサポートする必要があります(データベース接続やActive Directoryなど)。

Tesselの設定

  • tessel updateを実行し、SSL対応の最新のファームウェアをインストールしてください。

  • Webに接続する必要があります。WiFiの設定はtessel wifiコマンドを使って行います。

  • 資格情報(username/passwordなど)を送信する場合には、必ず安全なネットワーク上で行います。

Summary(概要)

Tesselは多くの可能性を秘めた優れたボードです。このサンプルでは、これAuth0に接続することがどれほど簡単かをご紹介します。