[golang]fiber API1~Admin: ユーザーの登録とログイン処理~

こんにちは、KOUKIです。

前回は、Docker環境上に「cosmtrek/air」というGoのツールを使ってLive Reloading機能(ホットリロード)を追加しました。

ここまでは、APIを開発するための基盤作りですが、今回からいよいよAPIの機能を実装していきます。

尚、この記事に出てくるソースコードは、Udemyの「React, NextJS and Golang: A Rapid Guide – Advanced」コースを参考にしています。解釈は私が勝手に付けているので、本物をみたい場合は受講をお勧めします!

前回

事前準備

フォルダ/ファイルの準備

モジュールのインストール

作るもの

認証機能のようなものを作りたいと思います。エンドポイントは、以下です。

エンドポイント
  • POST /api/admin/register
  • POST /api/admin/login
  • POST /api/admin/logout
  • GET /api/admin/user
  • PUT /api/admin/users/info
  • PUT /api/admin/users/password

本記事では、register(ユーザー登録)とlogin(ログイン)機能を作成したいと思います。

ルートの作成

APIがリクエストを受け取ったときに、エンドポイントのルールに従って処理を振り分る必要があります。例えば、「http://localhost:8000/api/admin/register」にアクセスした時、「ユーザー登録処理」を実行するといった具合にです。

エンドポイントを記述する場所

routes.goには、エンドポイントの一覧を記述します。

これは、main.goから呼び出されます。

処理の振り分け先を記述する場所(コントローラー)

本APIは、「リクエスト —–> ルート ——> コントローラー」という流れで、処理がされます。つまり、コントローラーには、エンドポイントに紐づけられた処理を記述します。

暫定ですが、Registerのコントローラーを実装しました。

これを、ルートから呼び出すようにします。

RegisterはPOSTリクエストで送信するので、POSTメソッドを使っています。

動作確認

ここまでで、一旦動作確認をしましょう。下記のコマンドで、コンテナを立ち上げておいてください。

ChromeのTalend APIからAPIへ、以下のパラメータでリクエストを送信しましょう。

  • POST -> http://localhost:8000/api/admin/register

OKですね。

エンドポイントのグループ化

Registerに設定したエンドポイント「/api/admin/register」のapiは、他のエンドポイントと共通です。これをGroupingすることが可能です。

「/api/admin」までのURLをグループとして登録したので、エンドポイントの記述が「register」のみになりました。大変わかりやすいですね。

ユーザー登録処理

ユーザー登録処理(Register)を実装しましょう。

データのバインド

Registerの呼び出しは、以下のパラメータ付きで行います。

つまり、API側でこれらのパラメータを取得する必要があるわけです。

BodyParserメソッドを使うと、リクエストからパラメータを取得できます。string型のmapにバインドしたので、data[“first_name”]などを指定すると、値が取得できます。

パスワードチェック

パラメータの「password/password_confirm(確認用のパスワード)」は一致している必要があるため、チェックを行っています。もし、不一致だった場合は、HTTPのステータスコードをStatusBadRequest(400)に設定し、呼び出し元に返す処理を実装しました。

なお、StatusBadRequestは定数であり、HTTPのステータスコードを表しています。詳しくは一覧を確認ください。

ハッシュパスワードの作成

平文のままパスワードをDBに保存するわけにもいかないので、ハッシュパスワードを作成します。

bcryptパッケージのGenerateFromPasswordメソッドを用いれば、ハッシュを簡単に作成できます。

ユーザーの登録

最後に、ユーザーをDBに登録しましょう。

「database.DB.Create」は、GORMのCreateメソッドです。SQL文無しでデータ登録ができるので、大変便利です。

検証

ユーザーが登録できるか検証します。

Talend APIから以下のパラメータで、POSTリクエストを送信します。

OKですね。

DBも確認してみましょう。

問題なく、ユーザーが登録されてますね。

ログイン

次は、ログイン処理を実装します。

ログインするときは、emailpasswordをAPIヘリクエストと共に送ります。

ルートの追加

ログインのルートを追加します。

データのバインド

controllers.goにログイン処理を実装します。

Registerと同様にデータのバインド処理を実装しましょう。

データ検索

GORMのWhereを使うと条件検索できます。今回は、emailを対象にしましょう。

パスワードチェック

パスワードのチェックを行います。

CompareHashAndPasswordメソッドを使えば、パスワードのチェックは楽勝にできます。

検証

ログイン機能を検証してみましょう。

URL: http://localhost:8000/api/admin/login
形式: POST

成功

ユーザーなし

パスワード不一致

OKですね。

エラーメッセージのリファクタリング

エラーメッセージの「ユーザーが見つかりませんでした」及び「パスワードに誤りがあります」ですが、ログインする際にどちらかが間違っているとあえて伝える必要がないので、一律に「ログイン情報に誤りがあります」に変更しておきましょう。

次回

次回は、JWTを使ってトークンの発行処理を実装します。

Go言語まとめ

ソースコード

ここまでのソースコードを記載しておきます。

main.go

auathController.go

db.go

models.go

routes.go

コメントを残す