😸

ログイン済みの制御を入れる(Go/echo/GORM+PostgreSQL16.4)

2024/10/05に公開

前回、ログインとセッション管理の仕組みを作成しました。今回はログイン済みかどうかの制御と画面上の表示を実装していきます。

https://zenn.dev/kaikusakari/articles/f0f623b4d0f6bf

セッション管理の仕組みとしてログイン成功したら、一意な文字列を作成してユーザーにAddCookieします。以降そのユーザーからリクエストを受け付けた場合、そのCookie内の文字列を見てログイン済みかどうか判断します。

セッションの一意な文字列はDBで管理していて、ユーザーのリクエストごとにDBを参照して一致するレコードがあるかどうか確認します。

WEBページ表示用のロジック。ここではセッションのチェックのみしています。

func GetIndex(c echo.Context) error {
	session := api.CheckSessionFromReq(c)
	return c.Render(http.StatusOK, "hello.html", map[string]interface{}{
		"name":    "WEBページ!",
		"session": session.Userid,
	})
}

セッションのチェック用ロジック。Cookieから文字列を取得してセッション管理テーブルに問い合わせを行い抽出できた結果を返します。

func CheckSessionFromReq(c echo.Context) model.Session {
	s := new(model.Session)
	cookie, err := c.Cookie("session")
	if err != nil {
		return *s
	}

	if err != nil {
		log.Fatal("Cookie: ", err)
	}
	conf.MainDB.Where("uuid = ?", cookie.Value).First(&s)
	return *s
}

画面のテンプレではログインしている場合はユーザーを一意に特定するIDを表示します。未ログインの場合はログインボタンを出します。

<!DOCTYPE html>
    <body>
        {{ if .session }} ログイン中のユーザー: {{ .session}}
        {{ else }}<button type="button" class="btn btn-primary" onclick="location.href='/sociallogin'">Sign in with Google</button>{{ end }}<br/>
        <a href="/list">todolist</a>
    </body>
</html>

Discussion