mpurseを活用することで、認証が必要なイベントごとに署名を要求して検証する方式をとっており、これまでのユーザID、パスワード、ソーシャルログインなどから解放する設計にしてあります。

いわゆるweb3.0的設計とでもいうんでしょうかね? こういうの
この領域で実際になんか作って、ノウハウ構築している人ってどれくらいいるんでしょうね?

今のところ、あまり見かけないのでパイオニアになれるチャンス?
Mpurse使った開発るモナコイナーと、Metamask勢くらいじゃないとこういうのやってないんじゃないかなぁ?

知らんけどw

#今回書くこと
ざっくりMpurseを使って作る認証システムのメリット・デメリット、注意した方がいいことなどノウハウ的なことを書き留めておきます。

ただ、あくまでこれは僕が設計・開発している中で思いついた部分と、アドバイスをしてくださった人のノウハウですので、まだまだ十分に検証、蓄積されたノウハウとはまだ言えないでしょう。
なので、ぜひみなさんも実際に使って、作って、ノウハウを蓄積していけば、もっと便利なwebアプリが作れるんじゃないかと思っているので、ぜひ手を動かしましょう!

#フロントとバックの関わり
mpurse開発者のtadajamさんからアドバイスいただいた際には、「検証はバックエンドで行った方がいい」というものでした。
フロントであれば、必ずtrueを返すオブジェクトで上書きされたりする恐れがあるからです。

したがって、今回の設計では
フロントで署名を作成して、バックで署名を検証するという方式をとっています。

#署名するメッセージについて
今回はbitcoinjs-messageを使って検証しています。

僕が作ったモナマルシェでは
・商品登録
・商品削除
のイベント時に署名を要求するようにしています。

署名に必要なデータは

{
 アドレス
 メッセージ
 署名データ
}

の3つです。

このメッセージについては少し考えなければいけないのかな?
と思いました。

例えば、メッセージが何でもよくて、署名が正しいかどうかだけを見る場合、raw transactionのデータとかから、TXの署名データとアドレスをコピーしてくれば偽装できると思ったからです。

なので、ある程度ユニークなメッセージが望ましいかなと思いました。
そこで今回使ったのはタイムスタンプです。

タイムスタンプはいくらでも偽装ができそうですが、
・フロントで、タイムスタンプに署名
・バックで現在のタイムスタンプを取得 -> 差分を計算
 60秒以上のギャップがある場合は受け付けない

という方式にしました。
こうすることで、フロント側でタイムスタンプを上書きしようが何しようが、メッセージのタイムスタンプが、バックのタイムスタンプと60秒以上差がある場合falseを返すようにしたので、ワンタイム署名もどきになれたのではないかなと思っています。

フィードバック募集中

とはいえ、これが絶対にいい方法である確証はないので
この方法での欠陥だったり、意見や、もっといい方法を思いついた方や知っている方は気軽に教えてください。

では、ばいちゃー