こんにちは。KOUKIです。
前回に引き続き、ユーザー認証アプリの実装を行います。本記事は、主にバックエンドで以下の処理について書きます。
1. JSONデータのパース
2. パスワードのエンコード
3. データ登録
作業を始める前に、コンテナは起動しておきましょう。
1 |
docker-compose up |
なお、Mac環境&reflexツールで、コンテナを立ち上げ直さなくても修正内容が自動的に反映される環境にしてますが、Windowsをお使いの方はコードの修正があるたびに、コンテナを立ち上げ直してください。
<目次>
前回
JSONデータをパースする
WebフレームワークにFiberを使用していますが、JSONデータを簡単にパースできる機能があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// authController.go package controllers import ( "auth-api/models" "github.com/gofiber/fiber/v2" ) func Register(c *fiber.Ctx) error { var data map[string]string // リクエストデータをパースする if err := c.BodyParser(&data); err != nil { return err } user := models.User{ FirstName: data["first_name"], LastName: data["last_name"], Email: data["email"], Password: data["password"], } return c.JSON(user) } |
BodyParserメソッドを使うと、簡単にパースできます。
Talend API Testerでその機能を確認しましょう。
リクエスト先: http://localhost/api/register
形式: POST
1 2 3 4 5 6 |
// 送信データ { "first_name": "self", "last_name": "note", "email": "selfnote@yahoo.co.jp" } |


JSONデータをGoで扱えるデータとして、パースされたことがわかりますね。
この機能を応用すれば、パスワードのチェックもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
func Register(c *fiber.Ctx) error { var data map[string]string // リクエストデータをパースする ... // パスワードチェック if data["password"] != data["password_confirm"] { c.Status(400) return c.JSON(fiber.Map{ "message": "Passwords do not match!", }) } ... } |
上記のコードは、送られたパスワードが一致しているかをチェックし、一致していない場合は、400エラーとエラーメッセージを返してます。
次のJSONデータでリクエストを送ってみましょう。
1 2 3 4 5 6 7 8 |
// 送信データ { "first_name": "self", "last_name": "note", "email": "selfnote@yahoo.co.jp", "password": "a", "password_confirm": "ab" } |

パスワードのエンコード
パスワードを原文のままMySQLに登録するわけにはいかないので、bcryptパッケージを使って、エンコードしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// authController.go ... func Register(c *fiber.Ctx) error { var data map[string]string // リクエストデータをパースする ... // パスワードチェック ... // パスワードをエンコード password, _ := bcrypt.GenerateFromPassword([]byte(data["password"]), 14) user := models.User{ FirstName: data["first_name"], LastName: data["last_name"], Email: data["email"], Password: password, } ... } |
GenerateFromPasswordメソッドでエンコードしています。
この関数の戻り値の型は[]byte形式であるため、User構造体のPasswordの型を変更する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// user.go package models import "gorm.io/gorm" type User struct { gorm.Model FirstName string LastName string Email string `gorm:"unique"` Password []byte } |
確認してみましょう。先ほどと同様に以下の条件でPOST送信します。
1 2 3 4 5 6 7 8 9 10 |
// 送信データ { "first_name": "self", "last_name": "note", "email": "selfnote@yahoo.co.jp", "password": "a", "password_confirm": "a" } |
結果は、以下のようになりました。
1 2 3 4 5 6 7 8 9 10 11 |
// result { "ID": 0, "CreatedAt": "0001-01-01T00:00:00Z", "UpdatedAt": "0001-01-01T00:00:00Z", "DeletedAt": null, "FirstName": "self", "LastName": "note", "Email": "selfnote@yahoo.co.jp", "Password": "JDJhJDE0JHBtMmVWb2V4WjZ0T3BpRHlOYU9BQ3VqaVBscFRMLlhLNHN2THZJVjlOeTB0bHJUc1p2di91" } |
Passwordを確認するとエンコードされていることがわかりますね。
データ登録
最後に、MySQLへデータを登録します。
まずは、前回作成したDB接続処理をパッケージ外からでも使えるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// connect.go package database import ( "auth-api/models" "fmt" "os" "gorm.io/driver/mysql" "gorm.io/gorm" ) var ( schema = "%s:%s@tcp(mysql:3306)/%s?charset=utf8&parseTime=True&loc=Local" username = os.Getenv("MYSQL_USER") password = os.Getenv("MYSQL_PASSWORD") dbName = os.Getenv("MYSQL_DATABASE") datasourceName = fmt.Sprintf(schema, username, password, dbName) // DBインスタンス DB *gorm.DB ) func Connect() { connection, err := gorm.Open(mysql.Open(datasourceName), &gorm.Config{}) if err != nil { panic("Could not connect to the database") } // コネクション情報を追加 DB = connection connection.AutoMigrate(&models.User{}) } |
「DB *gorm.DB」変数をPublic(先頭大文字)で定義しました。これでパッケージ外からDB変数にアクセスすることが可能になりました。
Register関数内からGORMのCreateメソッドを呼び出してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// authController.go package controllers import ( "auth-api/database" // 追加 "auth-api/models" "github.com/gofiber/fiber/v2" "golang.org/x/crypto/bcrypt" ) func Register(c *fiber.Ctx) error { var data map[string]string // リクエストデータをパースする // パスワードチェック // パスワードをエンコード ... // データ登録 // CreateはGORMのメソッド database.DB.Create(&user) return c.JSON(user) } |
ここまで設定できたら、先ほどと同じ条件でPOSTリクエストを送信してください。MySQLにデータが登録されるはずです。

リクエストに成功したら「http://localhost:8888/sql.php?server=1&db=go_auth&table=users&pos=0」にアクセスして、データを確認しましょう。

データが挿入されたことがわかりますね。
次回
次回も引き続き、バックエンド開発を行っていきます。
コメントを残す
コメントを投稿するにはログインしてください。