search
LoginSignup
7

More than 3 years have passed since last update.

posted at

updated at

NEMを使った認証

はじめに

TipAssistというChrome拡張を作っているヤマコーと申します。
PCでtipnem使ってる人は是非インストールしてみてください(露骨な宣伝)。
(tipbot廃止に伴い非公開になりました)

NEMの活用法

私は直接NEMに関する開発をしたことがないので(TipAssistはあくまで、twitter上でテキストをいじったりするだけ)、
想像と思いつき、あとはTLの人から出てきた知見を元に少し語る事にします。

まずNEMのユーザー側にとって特徴的な機能はおおよそ以下の通り。
・モザイク(トークン)の作成
・アポスティーユ(証明書発行)
・ハーベスティング
・Voting(投票)

この中でも、モザイクの作成は異質で、かつ応用性が高いです。
という事でモザイクの内容を取り上げます。

モザイクの活用

モザイク認証

指定のモザイクを持つ人のみ、アクセスできるページ。

001.PNG

作ってみた。

ファイル構成

image.png

index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>認証が必要なページ</title>
    <script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="js/main.js"></script>
  </head>
  <body>
    <p id="status"></p>
    <p id="mosaic"></p>
  </body>
</html>

main.js
$(function(){
    var nem = prompt("NEMアドレスを入力してください").replace(/-/g,"");
    status("104.238.161.61:7890", nem,"nem_games.ammo:9mm");
});

function status(supernode,nemAddress,mosaic){
  $.getJSON(
    "http://"+ supernode +"/status", //リクエストURL
    null,       //送信データ
    function(data, status) {
      if(data.code == 6){
          $('#status').text("SN "+ supernode+"は正常に動作している");
          // getBalance(supernode,nemAddress);
          getMosaic(supernode,nemAddress,mosaic);
      }else{
          $('#status').text("SN "+ supernode +" に何らかの障害あり");
          console.log(data);
      }
    }
  );
}


//モザイク一覧
function getMosaic(supernode,nemAddress,mosaic){
  $.getJSON(
    "http://"+ supernode+"/account/mosaic/owned?address=" + nemAddress, //リクエストURL
    null,       //送信データ
    function(data, status) {
      mosaics = mosaic.split(":");
      hasflg = false;
      data.data.forEach(function(v, i, a){
        if(v.mosaicId.namespaceId == mosaics[0] && v.mosaicId.name == mosaics[1]){
          if(v.quantity > 1){//数量指定
            $('#mosaic').text(mosaic +"" + v.quantity + "個持っています。ありがとうございます");
          }else{
            $('#mosaic').text(mosaic +"" + v.quantity + "個持っていますがたりません");
          }
          hasflg = true;
        }
      });
      if(hasflg == false){
        alert(mosaic+ "をお持ちでない人にはお見せ出来ません!");
        window.location.href = "https://google.com";
      }

    }
  );
}


実行結果

image.png

しかし、NEMアドレスだけだと、他のユーザーも知る事が出来る情報のため、簡単になりすましが出来てしまう。
というかこの例だとそれ以前の問題なのは見逃して下さい

00.PNG

認証までの手順は以下の通り。

1.認証用アドレスに数XEMを送信する
2.認証用アドレスから暗号化されたメッセージでパスワードを送られてくる(ユーザー登録の完了)
3.認証が必要なページにアクセスして、NEMアドレスとパスワードを入力
4.そのNEMアドレスで指定のモザイクを所持していたら認証(yay!)

この認証方法をいろいろ使いまわせたら、汎用性が高そうですね!

ただ、この認証方式を特定のサーバーに依存したシステムにするんではなく、あくまでNEMだけでなんかできないかなーとか考えてます。
面白い方法を思いついた人は是非ヤマコーに教えてください!できるかわからんけど!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7