1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RCC (立命館コンピュータークラブ)Advent Calendar 2024

Day 21

【Go,Docker】簡易的なログインシステムを作成する

Last updated at Posted at 2024-12-20

はじめに

先日の記事では、GoREST Clientを利用して、サーバーにHTTPリクエストを送る簡易的なプログラムを作成、実行しました。今回は、それらに加えてDockerを利用してデータベース的なものを作成し、それを持ち得て簡易的なログインシステムを作成していきます。

なお、この記事ではDockerや先日の記事で紹介したREST Clientについての説明は省きます。

では、始めていきます。

ファイルの作成

今回は、server.gogo.moddockerfilerequest.httpの4つのファイルを作成しました。それぞれのコードは以下の通りです。(go.modは省略)

server.go
package main

import (
	"encoding/json"
	"net/http"
)

type User struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

var users = make(map[string]string)

func regissterHandler(w http.ResponseWriter, r *http.Request) {
	var user User
	if err := json.NewDecoder(r.Body).Decode((&user)); err != nil {
		http.Error(w, "Invalid Request", http.StatusBadRequest)
		return
	}
	if _, exists := users[user.Username]; exists {
		http.Error(w, "User already exists", http.StatusBadRequest)
		return
	}
	users[user.Username] = user.Password
	w.WriteHeader(http.StatusCreated)
}

func loginHandler(w http.ResponseWriter, r *http.Request) {
	var user User
	if err := json.NewDecoder(r.Body).Decode((&user)); err != nil {
		http.Error(w, "Invalid Request", http.StatusBadRequest)
		return
	}
	if password, exists := users[user.Username]; exists && password == user.Password {
		w.WriteHeader(http.StatusOK)
	} else {
		http.Error(w, "Invalid Username or Password", http.StatusUnauthorized)
	}
}

func checkHandler(w http.ResponseWriter, r *http.Request) {
	usernames := make([]string, 0, len(users))
	for username := range users {
		usernames = append(usernames, username)
	}
	w.Header().Set("Content-Type", "application/json")
	if err := json.NewEncoder(w).Encode(usernames); err != nil {
		http.Error(w, "Failed to encode usernames", http.StatusInternalServerError)
		return
	}
}

func main() {
	http.HandleFunc("/register", regissterHandler)
	http.HandleFunc("/login", loginHandler)
	http.HandleFunc("/check", checkHandler)
	http.ListenAndServe(":8080", nil)
}

dockerfile
# ベースイメージ
FROM golang:1.23

# アプリケーションコードのコピー
WORKDIR /app
COPY . .

# コンパイル
RUN go build -o server .

# 実行
CMD ["/app/server"]

request.http
### ユーザー情報を登録 1
POST http://localhost:8080/register HTTP/1.1
Content-Type: application/json

{
  "username": "testuser",
  "password": "testpassword"
}

### ユーザー情報を登録 2
POST http://localhost:8080/register HTTP/1.1
Content-Type: application/json

{
  "username": "taro",
  "password": "123"
}

### ユーザー情報でログイン認証
POST http://localhost:8080/login HTTP/1.1
Content-Type: application/json

{
  "username": "testuser",
  "password": "testpassword"
}

### 登録されたユーザー情報を確認 
GET http://localhost:8080/check HTTP/1.1
Content-Type: application/json

ファイルの実行

まずはじめにDocker Desktopを起動させます。そして、作業ディレクトリに移り、以下の流れでコマンドを入力していきます。
ちなみに今回、Docker Imageにつけた名前はgo-login-appにしました。

まずはDocker Imageをビルドします。

docker build -t go-login-app .

次にDocker Containerを作成、起動します。

docker run -d -p 8080:8080 --name go-login-container go-login-app

では、VSCode上でrequest.httpを開いてリクエストを送信します。
リクエストに対し、以下のようにレスポンスがきます。もし良ければ、上記のrequest.http以外にも色々とリクエストを送ってみてください。

ユーザー情報を登録(POST)
HTTP/1.1 201 Created
Date: Mon, 09 Dec 2024 02:59:25 GMT
Content-Length: 0
Connection: close
ユーザー認証に成功
HTTP/1.1 200 OK
Date: Tue, 10 Dec 2024 08:06:15 GMT
Content-Length: 0
Connection: close

ユーザー認証に失敗(名前またはパスワードが異なる)(POST)
HTTP/1.1 401 Unauthorized
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Mon, 09 Dec 2024 03:08:04 GMT
Content-Length: 29
Connection: close

Invalid Username or Password
登録したユーザーの確認(GET)
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 10 Dec 2024 07:29:26 GMT
Content-Length: 20
Connection: close

[
  "testuser",
  "taro"
]

おわりに

今回の記事では新しくDockerを利用したプログラムファイルを作成、実行しました。途中、慣れない操作に苦戦することもありましたが何とか解決することができて良かったです。今後はもっと触る機会を増やして慣れたいと思います。

では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?