1 回答

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 {
...
}
- 1 回答
- 0 关注
- 197 浏览
添加回答
举报