登录
首页 >  Golang >  Go问答

使用 JWT 进行 GraphQL Golang 身份验证

来源:stackoverflow

时间:2024-05-01 13:48:33 381浏览 收藏

大家好,我们又见面了啊~本文《使用 JWT 进行 GraphQL Golang 身份验证》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

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

所以我的 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?)


解决方案


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

当前,您正在创建一个新上下文。我建议使用现有的 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 {
  ...
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>