ブロックチェーン

【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フルリモート労働。 自分の経験を元に、未経験からエンジニアになる方法や業界のことを発信してます。
特別なスキルがない20代でもフリーランスになれる

知ってましたか?エンジニアであれば、誰でもフリーランスになれます。

僕は実務経験1年で25歳のときに、フリーランスになりました。2ヶ月目には月収が100万円を超えていました。たった半年前、正社員をやっていたときは、20万円という薄給だったのに

実務経験1年なんて正直たいしたスキルなんてありません。でも、フリーランスになってお金を稼ぐことは出来ます。気づいてないかもしれませんが、エンジニアというのはそれぐらいお得な商売なのです。

フリーランスになって稼ぎたい方は、僕が紹介している「エンジニアがフリーランスになる方法と注意点のまとめ【完全版】」を是非読んでチャレンジしてください。この記事読めば、どうすればフリーランスになれるのか分かりますよ。

フリーランスになる方法と注意点を読む!