Open2
gqlgen認証関連
ミドルウェアとコンテキスト
http.Request
にcontext.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")
}
// ...
}
参考