猿问

使用 JWT 的 GraphQL Golang 身份验证

我有一个我一直在编写的 GraphQL API,并且想知道当您已经在使用传递数据源go时如何管理 JWT 身份验证。context


main所以我的函数的缩写版本是:


import (

    "net/http"

    "github.com/graphql-go/graphql"

    gqlhandler "github.com/graphql-go/handler"

)


func queryHandler(ds *sources.DataSources, gql *gqlhandler.Handler) http.Handler {

    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        ctx := context.WithValue(context.Background(), sources.CtxSourcesKey, ds)

        gql.ContextHandler(ctx, w, r)

    })

}


func main() {

    apiSchema, _ := schema.CompileSchema(schema.QueryType, schema.MutationType)

    gql := gqlhandler.New(&gqlhandler.Config{

        Schema:     &apiSchema,

        GraphiQL:   !isDeployed,

        Pretty:     false,

        Playground: false,

    })

    http.ListenAndServe(":41000", util.CreateChiRouter(healthCheckHandler(), queryHandler(ctxSources, gql)))

}

如您所见,我已经创建了一个新context实例来存储我的各种数据源的映射并将其传递给查询解析函数,但还需要能够解析出Authorization可能的 JWT 的标头以传递给认证的路由。


鉴于我目前的情况,最好的方法是什么?(将 JWT 与数据源上下文相结合?以不同方式处理数据源以释放context?)


慕娘9325324
浏览 198回答 1
1回答

慕田峪7331174

处理此类身份验证标头的常用方法是使用中间件来处理身份验证,并将身份验证信息添加到当前上下文中。目前,您正在创建一个新的上下文。我建议使用现有的 HTTP 上下文并添加到其中,这样您就可以链接:ctx := context.WithValue(r.Context(), sources.CtxSourcesKey, ds)newReq:=r.WithContext(ctx)gql.ContextHandler(ctx, w, newReq)您可以安装一个执行相同操作的中间件:type autoInfoKeyType intconst authInfoKey authInfoKeyType=iotafunc GetAuthInfo(ctx context.Context) *AuthInfo {   if v:=ctx.Value(authInfoKey); v!=nil {     return v.(*AuthInfo)   }   return nil}func AuthMiddleware(next http.Handler) http.Handler {  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {    authInfo:=processJWT(...)    if authInfo!=nil {       ctx := context.WithValue(r.Context(), authInfoKey, authInfo)       r=r.WithContext(ctx)    }    next.ServeHTTP(w,r)  }}这样,您可以检查上下文是否具有身份验证信息,如果有,请使用它。if authInfo:=GetAuthInfo(req.Context()); authInfo!=nil {  ...}
随时随地看视频慕课网APP

相关分类

Go
我要回答