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
}