package middlewares import ( "backend/pkg/pg" "backend/providers/jwt" "github.com/gofiber/fiber/v3" "github.com/jinzhu/copier" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) func (f *Middlewares) WeChatAuthUserInfo(c fiber.Ctx) error { 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").Debug("code", code) // get the openid token, err := f.client.AuthorizeCode2Token(code) if err != nil { return errors.Wrap(err, "failed to get openid") } tenantSlug := c.Path("tenant") if tenantSlug == "" { return errors.New("tenant is empty") } tenantId, err := f.userSvc.GetTenantIDBySlug(c.Context(), tenantSlug) if err != nil { return errors.Wrap(err, "failed to get tenant id") } var oauthInfo pg.UserOAuth copier.Copy(&oauthInfo, token) user, err := f.userSvc.GetOrNew(c.Context(), tenantId, token.Openid, oauthInfo) if err != nil { return errors.Wrap(err, "failed to get user") } claim := f.jwt.CreateClaims(jwt.BaseClaims{UID: uint64(user.ID)}) claim.ID = user.OpenID jwtToken, err := f.jwt.CreateToken(claim) if err != nil { return errors.Wrap(err, "failed to create token") } _ = jwtToken return c.Redirect().To("/") }