14
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

nemAdvent Calendar 2017

Day 9

NEMを使った認証

Last updated at Posted at 2017-12-03

##はじめに
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だけでなんかできないかなーとか考えてます。
面白い方法を思いついた人は是非ヤマコーに教えてください!できるかわからんけど!

14
7
5

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
  3. You can use dark theme
What you can do with signing up
14
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?