package middlewares import ( "strings" "backend/pkg/pg" "backend/providers/jwt" "github.com/gofiber/fiber/v3" "github.com/jinzhu/copier" "github.com/pkg/errors" "github.com/samber/lo" log "github.com/sirupsen/logrus" ) func (f *Middlewares) WeChatAuthUserInfo(c fiber.Ctx) error { // 如果请求存在 Authorization 头,则跳过 if len(c.GetReqHeaders()["Authorization"]) != 0 { return c.Next() } log.WithField("module", "middleware.AuthUserInfo").Debugf("query: %v", c.Queries()) state := c.Query("state") code := c.Query("code") if state == "" && code == "" { return c.Next() } if state != "sns_basic_auth" { return c.Next() } log.WithField("module", "middleware.AuthUserInfo").Debugf("code: %s, state: %s", code, state) // get the openid token, err := f.client.AuthorizeCode2Token(code) if err != nil { return errors.Wrap(err, "failed to get openid") } log.Debugf("tokenInfo %+v", token) paths := lo.Filter(strings.Split(c.Path(), "/"), func(s string, _ int) bool { return s != "" }) if len(paths) < 2 || paths[0] != "t" { return errors.New("invalid path") } tenantSlug := paths[1] if tenantSlug == "" { return errors.New("tenant is empty") } tenant, err := f.userSvc.GetTenantBySlug(c.Context(), tenantSlug) if err != nil { return errors.Wrap(err, "failed to get tenant id") } var oauthInfo pg.UserOAuth if err := copier.Copy(&oauthInfo, token); err != nil { return errors.Wrap(err, "failed to copy oauth info") } log.Debugf("oauthInfo %+v", oauthInfo) user, err := f.userSvc.GetOrNew(c.Context(), tenant.ID, token.Openid, oauthInfo) if err != nil { return errors.Wrap(err, "failed to get user") } claim := f.jwt.CreateClaims(jwt.BaseClaims{ OpenID: user.OpenID, Tenant: tenantSlug, UserID: user.ID, TenantID: tenant.ID, }) jwtToken, err := f.jwt.CreateToken(claim) if err != nil { return errors.Wrap(err, "failed to create token") } // TODO: send html with jwt token return c.SendString(jwtToken) }