package board import ( "context" "fmt" "log" "net/http" "os" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "github.com/google/go-github/github" "golang.org/x/oauth2" ) var ( oauthConf = &oauth2.Config{ ClientID: os.Getenv("GITHUB_CLIENT_ID"), ClientSecret: os.Getenv("GITHUB_CLIENT_SECRET"), // Scopes: []string{"read:user", "user:email"}, Endpoint: oauth2.Endpoint{ AuthURL: "https://github.com/login/oauth/authorize", TokenURL: "https://github.com/login/oauth/access_token", }} ) type SignIn struct { Username string `json:"username"` Password string `json:"password"` } type SSOSignIn struct { Code string `json:"code"` State string `json:"state"` RedirectURI string `json:"redirectUri"` } type SignUp struct { Username string `json:"username"` Password string `json:"password"` } func SSOHandler(c *gin.Context) { signin := SSOSignIn{} session := sessions.Default(c) savedState := session.Get("state") if savedState == nil || savedState.(string) != signin.State { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "Invalid state parameter."}) return } // 使用 code 换取 token token, err := oauthConf.Exchange(context.Background(), signin.Code) if err != nil { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": fmt.Errorf("授权失败: %s", err.Error())}) return } log.Println("token:", &token.AccessToken) // 使用 token 获取 GitHub 用户信息 client := github.NewClient(oauthConf.Client(context.Background(), token)) // client := github.NewClient(oauth2.NewClient(context.Background(), oauth2.StaticTokenSource(token))) user, _, err := client.Users.Get(c.Request.Context(), "") if err != nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Errorf("获取用户信息失败: %s", err.Error())}) return } // err = storeUserToDB(user) // if err != nil { // log.Println("Error storing user to DB:", err) // c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"}) // return // } log.Printf("%#v\n", user) log.Println(user.GetEmail(), user.GetName(), user.GetID(), user.GetAvatarURL()) // 处理用户信息 c.JSON(http.StatusOK, gin.H{ "id": user.ID, "login": user.Login, "name": user.Name, "email": user.Email, "location": user.Location, "scopes": token.Extra("scope"), }) // jwtToken, err := generateJWTToken(*user.ID) // if err != nil { // log.Println("Error generating JWT token:", err) // c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"}) // return // } // c.SetCookie("token", jwtToken, 60*60*24, "/", "localhost", false, true) // c.Redirect(http.StatusFound, "http://152.70.110.4:8000") }