ブロックチェーン

【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
25 歳にして実務経験 1 年でフリーランスエンジニアになり月収 3 倍になった男。独学のみで営業からエンジニアになった経験あり。 未経験からでもエンジニアになる術を多くの人に伝えたいと思ってます!