🗂

【Ginキャッチアップ②】Basic認証を実装する

2022/09/19に公開

はじめに

Ginのキャッチアップをしているので、備忘録として学習した内容をアウトプットしていきます。
今回はBasic認証を設定したエンドポイントを実装していきます。

前回の記事はこちら
https://zenn.dev/moimoi_prog/articles/go_gin_example_1

環境

  • macOS Monterey 12.4
  • VSCode 1.71.0
  • go1.19

今回やること

  • Basic認証を実装したエンドポイントを実装する

Basic認証を実装したエンドポイントを実装する

全体のソースコードはこちらになります。

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

// BasicAuthの認証データ
var accounts = gin.Accounts{
	"user": "pass",
}

// 認証データに紐づくユーザーデータ
var details = gin.H{
	"user": gin.H{
		"email": "aaa@example.com",
		"phone": "080-0000-0000",
	},
}

func main() {
	engine:= gin.Default()

	// autorizedグループを作成する
	// このグループから作成したエンドポイントにはBasic認証が適用される
	authorized := engine.Group(
		"/admin", gin.BasicAuth(
			accounts,
		),
	)

	// Basic認証を適用したエンドポイントを登録する
	authorized.GET("/detail", func(ctx *gin.Context) {
		user := ctx.MustGet(gin.AuthUserKey).(string)
		if detail, ok := details[user]; ok {
			ctx.JSON(http.StatusOK, gin.H{"detail": detail})
		} else {
			ctx.JSON(http.StatusOK, gin.H{"detail": "NO DETAIL"})
		}
	})

	engine.Run()
}

解説

Basic認証が必要なページのエンドポイントのインスタンスを生成します。
*Engine.Groupでエンドポイントをグループ化できます。
グループ化することにより、Basic認証処理を共通化することができます。

引数には

  • 第一引数 ... Basic認証を行うエンドポイントのプレフィックス
  • 第二引数 ... Basic認証の認証情報
    を渡します。
authorized := engine.Group(
  "/admin", gin.BasicAuth(
    accounts,
  ),
)

第二引数はgin.Accountsで定義した認証情報を渡します。
Map形式になっており、

  • key ... Basic認証のユーザー名
  • value ... Basic認証のパスワード
    を設定します。
var accounts = gin.Accounts{
	"user": "pass",
}

認証情報に紐づくユーザーデータをレスポンスするので定義しておきます。

var details = gin.H{
	"user": gin.H{
		"email": "aaa@example.com",
		"phone": "080-1234-5678",
	},
}

生成したインスタンスのGET関数を呼び出し、Basic認証を設定したエンドポイントを登録します。
グループ化されているため、実際のプレフィックスはadmin/detailになります。

authorized.GET("/detail", func(ctx *gin.Context) {
  user := ctx.MustGet(gin.AuthUserKey).(string)
  if detail, ok := details[user]; ok {
    ctx.JSON(http.StatusOK, gin.H{"user": user, "detail": detail})
  } else {
    ctx.JSON(http.StatusOK, gin.H{"user": user, "detail": "NO DETAIL "})
  }
})

*gin.Context.MustGet(gin.AuthUserKey).(string)で、入力したユーザー名を取得できます。

user := ctx.MustGet(gin.AuthUserKey).(string)

Basic認証が許可された場合、details[user]で入力したユーザー名に紐づくユーザーデータを取得し、存在した場合その内容を、存在しなかった場合は"NO DETAIL"を返却します。

if detail, ok := details[user]; ok {
  ctx.JSON(http.StatusOK, gin.H{"user": user, "detail": detail})
} else {
  ctx.JSON(http.StatusOK, gin.H{"user": user, "detail": "NO DETAIL "})
}

参考

https://gin-gonic.com/ja/docs/

GitHubで編集を提案

Discussion