ブロックチェーン

【dapps】Metamaskを使いサーバ側にてユーザ認証する方法

こんにちは、とだこうき(cohki0305)です。

ブロックチェーンは素晴らしい技術ですが、すべての問題において最適解ではないでしょう。たとえば、ユーザの情報を保管する際や大量のデータを保存する際など、現状のブロックチェーンでは現実的に難しいです。

それゆえに、Dapps を作る際、一部のデータを DB に保存したい場合や一部の処理をサーバ側にて行いたい場合があると思います。

その際に、当然検討が必要なのが、ユーザ認証です。サーバ側にてリクエストを送っているイーサリアムアカウントが本当にそのアカウントの持ち主なのかを検証する必要があります。

Metamask と Express を使ってユーザ認証を行う方法を考えたので紹介します。

詳しい実装はこちらcohki0305/question-bc | Githubを参照してください。

web3 にて署名を作成する

サーバ側にて認証を行うために、フロント側にて署名を作成します。

以下を実行した際、metamask が起動して、承認を求められるはずです。

作成された署名と metamask のアカウントのアドレスをサーバ側にリクエストを送ります。

アカウントは web3 は以下のようにすれば取得することができます。

実装例

今回は vue で実装したので以下のようにしました。「sign up」というボタンを押したタイミングでサーバ側に署名を送信しています。

サーバ側(Express)にて署名を認証

サーバ側では受け取った署名から Address を復元します。

この復元された address とリクエストの account の address が一致することを確認できれば、正しいユーザがリクエストを送ってきたことが確認できるはずです。

実装例

validateSign という middleware を定義します。

JWT を作成する

あとは一般的なユーザ認証の方法を取ります。Json web token を使ったユーザ認証です。

User モデルに token を保存して、token をフロントに返して、フロント側はそれを localStroage に保存するという感じです。

実装例

参考文献

How to verify MetaMask account holder is the real owner of the address? | StackExchange

Signing into the backend with Ethereum and JSON Web Tokens | Medium

ABOUT ME
cohki0305
営業から転職し、たった6ヶ月でリードエンジニアになった最速の男。 その後半年でフリーランスとして独立し時給が4倍に。今は海外ノマドやりながら、週3フルリモート労働。 自分の経験を元に、未経験からエンジニアになる方法や業界のことを発信してます。
プログラマーになって年収1000万目指そう

学歴・職歴関係なく、数年間で年収 1000 万円を目指せる職業って何が思いつきますか??

僕はソフトウェアエンジニア(プログラマー)しか思いつかないです。

僕は実務一年でフリーランスになって年収1000万稼げるようになりましたが、別にこの業界なら普通です。学歴も職歴も関係ないです。

プログラマーを目指して稼ぎたい方は、僕が紹介している「プログラマーになるための最短ステップ 3」を是非読んでチャレンジしてください。

未経験からプログラマーになるための方法を知る