为了账号安全,请及时绑定邮箱和手机立即绑定

使用 JWT 的 GraphQL Golang 身份验证

使用 JWT 的 GraphQL Golang 身份验证

Go
慕娘9325324 2022-05-23 17:44:44
我有一个我一直在编写的 GraphQL API,并且想知道当您已经在使用传递数据源go时如何管理 JWT 身份验证。contextmain所以我的函数的缩写版本是: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?)
查看完整描述

1 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

处理此类身份验证标头的常用方法是使用中间件来处理身份验证,并将身份验证信息添加到当前上下文中。


目前,您正在创建一个新的上下文。我建议使用现有的 HTTP 上下文并添加到其中,这样您就可以链接:


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

newReq:=r.WithContext(ctx)

gql.ContextHandler(ctx, w, newReq)

您可以安装一个执行相同操作的中间件:


type autoInfoKeyType int


const authInfoKey authInfoKeyType=iota


func 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 {

  ...

}


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号