🗂
【Ginキャッチアップ②】Basic認証を実装する
はじめに
Ginのキャッチアップをしているので、備忘録として学習した内容をアウトプットしていきます。
今回はBasic認証を設定したエンドポイントを実装していきます。
前回の記事はこちら
環境
- 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 "})
}
参考
Discussion