func()

in user-center-slack/slack_user_center.go [147:199]


func (uc *UserCenter) LoginCallback(ctx *plugin.GinContext) (userInfo *plugin.UserCenterBasicUserInfo, err error) {
	log.Debugf("Processing LoginCallback")
	CallbackURL := ctx.Request.URL.String()
	log.Debugf("callbackURL in SlackLoginCallback:", CallbackURL)
	code := ctx.Query("code")
	if len(code) == 0 {
		return nil, fmt.Errorf("code is empty")
	}

	state := ctx.Query("state")
	if len(state) == 0 {
		return nil, fmt.Errorf("state is empty")
	}
	log.Debugf("request code: %s, state: %s", code, state)

	expectedState, exist := uc.Cache.Get("oauth_state_" + state)
	if !exist {
		fmt.Println("State not found in cache or expired")
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "Invalid or expired state"})
		return
	}
	if state != expectedState {
		fmt.Println("State mismatch")
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "Invalid state"})
		return
	}
	log.Debugf("State validated successfully")

	info, err := uc.SlackClient.AuthUser(code)
	if err != nil {
		return nil, fmt.Errorf("auth user failed: %w", err)
	}
	if !info.IsAvailable {
		return nil, fmt.Errorf("user is not available")
	}
	//Get Email
	if len(info.Profile.Email) == 0 {
		ctx.Redirect(http.StatusFound, "/user-center/auth-failed")
		return nil, fmt.Errorf("user email is empty")
	}

	userInfo = &plugin.UserCenterBasicUserInfo{}
	userInfo.ExternalID = info.ID
	userInfo.Username = info.ID
	userInfo.DisplayName = info.Name
	userInfo.Email = info.Profile.Email
	userInfo.Rank = 0
	userInfo.Mobile = ""
	userInfo.Avatar = info.Profile.Image192

	uc.Cache.Set(state, userInfo.ExternalID, time.Minute*5)
	return userInfo, nil
}