Open2

gqlgen認証関連

yDog-1yDog-1

ミドルウェアとコンテキスト

https://gqlgen.com/recipes/authentication/
http.Requestcontext.Contextでユーザ情報と呼び出し用のキー設定して、認証が必要な場面でcontext.Contextからユーザ情報を取り出して認証情報を照合する。

auth.go
var userCtxKey = &contextKey{"user"}
type contextKey struct {
	name string
}

func Middleware(db *sql.DB) func(http.Handler) http.Handler{
// ...
    user := getUserByID(db, userId)
    context.WithValue(r.Context(), userCtxKey, user)
    r = r.WithContext(ctx)
    next.ServeHTTP(w, r)
// ...
}
resolver.go
func (r *queryResolver) Hero(ctx context.Context, episode Episode) (Character, error) {
    if user := auth.ForContext(ctx) ; user == nil || !user.IsAdmin {
        return Character{}, fmt.Errorf("Access denied")
    }
// ...
}