feat: revert to check multi token in github plugin
diff --git a/plugins/github/api/connection.go b/plugins/github/api/connection.go
index 5890175..549e326 100644
--- a/plugins/github/api/connection.go
+++ b/plugins/github/api/connection.go
@@ -22,6 +22,7 @@
 	"fmt"
 	"github.com/apache/incubator-devlake/api/shared"
 	"net/http"
+	"strings"
 	"time"
 
 	"github.com/apache/incubator-devlake/plugins/github/models"
@@ -61,39 +62,75 @@
 	if err != nil {
 		return nil, err
 	}
-	apiClient, err := helper.NewApiClient(
-		context.TODO(),
-		params.Endpoint,
-		map[string]string{
-			"Authorization": fmt.Sprintf("Bearer %s", params.Token),
-		},
-		3*time.Second,
-		params.Proxy,
-		basicRes,
-	)
-	if err != nil {
-		return nil, err
+	tokens := strings.Split(params.Token, ",")
+
+	// verify multiple token in parallel
+	type VerifyResult struct {
+		err   error
+		login string
 	}
-	res, err := apiClient.Get("user", nil, nil)
-	if err != nil {
-		return nil, err
+	results := make(chan VerifyResult)
+	for i := 0; i < len(tokens); i++ {
+		token := tokens[i]
+		j := i + 1
+		go func() {
+			apiClient, err := helper.NewApiClient(
+				context.TODO(),
+				params.Endpoint,
+				map[string]string{
+					"Authorization": fmt.Sprintf("Bearer %s", token),
+				},
+				3*time.Second,
+				params.Proxy,
+				basicRes,
+			)
+			if err != nil {
+				results <- VerifyResult{err: fmt.Errorf("verify token failed for #%v %s %w", j, token, err)}
+				return
+			}
+			res, err := apiClient.Get("user", nil, nil)
+			if err != nil {
+				results <- VerifyResult{err: fmt.Errorf("verify token failed for #%v %s %w", j, token, err)}
+				return
+			}
+			githubUserOfToken := &models.GithubUserOfToken{}
+			err = helper.UnmarshalResponse(res, githubUserOfToken)
+			if err != nil {
+				results <- VerifyResult{err: fmt.Errorf("verify token failed for #%v %s %w", j, token, err)}
+				return
+			} else if githubUserOfToken.Login == "" {
+				results <- VerifyResult{err: fmt.Errorf("invalid token for #%v %s", j, token)}
+				return
+			}
+			results <- VerifyResult{login: githubUserOfToken.Login}
+		}()
 	}
+
+	// collect verification results
+	logins := make([]string, 0)
+	msgs := make([]string, 0)
+	i := 0
+	for result := range results {
+		if result.err != nil {
+			msgs = append(msgs, result.err.Error())
+		}
+		logins = append(logins, result.login)
+		i++
+		if i == len(tokens) {
+			close(results)
+		}
+	}
+	if len(msgs) > 0 {
+		return nil, fmt.Errorf(strings.Join(msgs, "\n"))
+	}
+
 	var githubApiResponse struct {
 		shared.ApiBody
 		Login string `json:"login"`
 	}
-	githubUserOfToken := &models.GithubUserOfToken{}
-	err = helper.UnmarshalResponse(res, githubUserOfToken)
-	if err != nil {
-		return nil, err
-	} else if githubUserOfToken.Login == "" {
-		return nil, fmt.Errorf("invalid token")
-	}
 	githubApiResponse.Success = true
 	githubApiResponse.Message = "success"
-	githubApiResponse.Login = githubUserOfToken.Login
-
-	// output
+	githubApiResponse.Login = strings.Join(logins, `,`)
 	return &core.ApiResourceOutput{Body: githubApiResponse, Status: http.StatusOK}, nil
 }