Bladeren bron

fix: 修复 Telegram OAuth 登录时用户已存在但缺少社交绑定导致的 login_failed 错误

urban 2 weken geleden
bovenliggende
commit
02f601a4fa
1 gewijzigde bestanden met toevoegingen van 38 en 0 verwijderingen
  1. 38 0
      apis/daytask/auth.go

+ 38 - 0
apis/daytask/auth.go

@@ -779,6 +779,44 @@ func (s *Server) OAuthLogin(c *gin.Context) {
 	if err := tx.Create(user).Error; err != nil {
 		tx.Rollback()
 		fmt.Printf("OAuth create user error: %v\n", err)
+
+		// 如果是 phone 重复,说明用户已存在但缺少社交绑定,自动补绑定并登录
+		var existingUser entity.DtUser
+		if dbErr := db.Where("phone = ?", oauthPhone).First(&existingUser).Error; dbErr == nil {
+			// 补创建社交绑定
+			newSocial := entity.DtUserSocial{
+				UserId:   existingUser.Id,
+				Platform: req.Provider,
+				Account:  req.OpenId,
+				Nickname: req.Nickname,
+				Avatar:   req.Avatar,
+				Extra:    "{}",
+			}
+			db.Create(&newSocial)
+
+			// 更新登录时间
+			db.Model(&entity.DtUser{}).Where("id = ?", existingUser.Id).
+				Update("last_login_time", time.Now().Unix())
+
+			existToken, tokenErr := middleware.GenerateJWT(middleware.Member{ID: existingUser.Id, Uid: existingUser.Uid})
+			if tokenErr != nil {
+				ctx.Fail("login_failed")
+				return
+			}
+			ctx.OK(gin.H{
+				"token": existToken,
+				"user": gin.H{
+					"id":       existingUser.Id,
+					"uid":      existingUser.Uid,
+					"nickname": existingUser.Nickname,
+					"avatar":   existingUser.Avatar,
+					"phone":    existingUser.Phone,
+					"email":    existingUser.Email,
+				},
+			})
+			return
+		}
+
 		ctx.Fail("login_failed")
 		return
 	}