package token import ( "context" "fmt" "git.x2erp.com/qdy/go-base/config" "git.x2erp.com/qdy/go-base/ctx" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-base/model/request/configreq" "git.x2erp.com/qdy/go-base/model/response" "git.x2erp.com/qdy/go-base/util" "git.x2erp.com/qdy/go-base/util/jwt" "git.x2erp.com/qdy/go-db/factory/database" "git.x2erp.com/qdy/go-svc-configure/internal/service/dao" ) // CreateConfigureToken 用户为自己创建token(需要TokenAuth认证) func CreateConfigureToken(tokenRequest *configreq.ConfigTokenRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[string] { logger.Debug("CreateConfigureToken-开始创建用户token") // 获取当前用户信息 currentUserID := reqCtx.UserID currentTenantID := reqCtx.TenantID if currentUserID == "" || currentTenantID == "" { logger.ErrorC(reqCtx, "用户身份信息不完整") return util.CreateErrorResult[string]("用户身份信息不完整", reqCtx) } db := dbFactory.GetDB() // 验证当前用户是否存在 userExists, err := dao.CheckUserExists(ctx, db, currentUserID, currentTenantID) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("检查用户存在性失败: %v", err)) return util.CreateErrorResult[string](fmt.Sprintf("检查用户存在性失败: %v", err), reqCtx) } if !userExists { logger.ErrorC(reqCtx, "当前用户不存在") return util.CreateErrorResult[string]("当前用户不存在", reqCtx) } // 获取用户详细信息 user, err := dao.GetUserByUserID(ctx, db, currentUserID, currentTenantID) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("获取用户信息失败: %v", err)) return util.CreateErrorResult[string](fmt.Sprintf("获取用户信息失败: %v", err), reqCtx) } // 获取用户角色列表 roles, err := dao.GetUserRoles(ctx, db, currentUserID, currentTenantID) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("获取用户角色失败: %v", err)) // 继续处理,角色可能为空 roles = []string{} } // 生成JWT token claims := &jwt.Claims{ UserID: user.UserID, Username: user.Name, TenantID: user.TenantID, ProjectID: tokenRequest.ProjectID, // 使用请求中的项目ID Extra: map[string]interface{}{ "roles": roles, "mobile": user.Mobile, "email": user.Email, }, } secretKey := config.GetServiceConfig().SecretKey token, err := jwt.CreateTokenDays(claims, tokenRequest.ExpiresDays, secretKey) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("建立token产生错误: %v", err)) return util.CreateErrorResult[string](fmt.Sprintf("建立token产生错误: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("建立token成功!用户: %s, 租户: %s, 角色: %v", user.UserID, user.TenantID, roles)) return util.CreateSuccessResultData(token, reqCtx) }