up
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -15,30 +16,39 @@ import (
|
|||||||
"github.com/google/go-github/v50/github"
|
"github.com/google/go-github/v50/github"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
ogithub "golang.org/x/oauth2/github"
|
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
var db *gorm.DB
|
var db *gorm.DB
|
||||||
var jwtSecret = []byte("JWT_SECRET")
|
var jwtSecret = []byte("JWT_SECRET")
|
||||||
|
var oauthConf *oauth2.Config
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := godotenv.Load()
|
err := godotenv.Load()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error loading .env file")
|
log.Fatal("Error loading .env file")
|
||||||
}
|
}
|
||||||
|
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",
|
||||||
|
}}
|
||||||
|
|
||||||
initDB()
|
initDB()
|
||||||
|
|
||||||
router := gin.Default()
|
router := gin.Default()
|
||||||
|
|
||||||
router.Use(cors.New(cors.Config{
|
router.Use(cors.New(cors.Config{
|
||||||
AllowOrigins: []string{"http://localhost:8000"},
|
AllowOrigins: []string{"*"},
|
||||||
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD"},
|
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD"},
|
||||||
AllowHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
|
AllowHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
|
||||||
AllowCredentials: true,
|
AllowCredentials: true,
|
||||||
}))
|
}))
|
||||||
|
router.GET("/", func(ctx *gin.Context) { ctx.Writer.WriteString("hello world") })
|
||||||
router.GET("/auth/github", githubLoginHandler)
|
router.GET("/auth/github", githubLoginHandler)
|
||||||
router.GET("/auth/github/callback", githubCallbackHandler)
|
router.GET("/auth/github/callback", githubCallbackHandler)
|
||||||
|
|
||||||
@@ -46,7 +56,6 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func githubLoginHandler(c *gin.Context) {
|
func githubLoginHandler(c *gin.Context) {
|
||||||
state := "1234567890"
|
|
||||||
// state := generateState()
|
// state := generateState()
|
||||||
// code := generateCode()
|
// code := generateCode()
|
||||||
|
|
||||||
@@ -57,15 +66,8 @@ func githubLoginHandler(c *gin.Context) {
|
|||||||
// return
|
// return
|
||||||
// }
|
// }
|
||||||
|
|
||||||
oauthConfig := &oauth2.Config{
|
url := oauthConf.AuthCodeURL("state")
|
||||||
ClientID: os.Getenv("GITHUB_CLIENT_ID"),
|
log.Println(url)
|
||||||
ClientSecret: os.Getenv("GITHUB_CLIENT_SECRET"),
|
|
||||||
RedirectURL: "http://localhost:8000/auth/github/callback",
|
|
||||||
Scopes: []string{"user:email"},
|
|
||||||
Endpoint: ogithub.Endpoint,
|
|
||||||
}
|
|
||||||
|
|
||||||
url := oauthConfig.AuthCodeURL(state)
|
|
||||||
c.Redirect(http.StatusFound, url)
|
c.Redirect(http.StatusFound, url)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,45 +81,51 @@ func githubCallbackHandler(c *gin.Context) {
|
|||||||
// return
|
// return
|
||||||
// }
|
// }
|
||||||
|
|
||||||
oauthConfig := &oauth2.Config{
|
// 使用 code 换取 token
|
||||||
ClientID: os.Getenv("GITHUB_CLIENT_ID"),
|
token, err := oauthConf.Exchange(context.Background(), code)
|
||||||
ClientSecret: os.Getenv("GITHUB_CLIENT_SECRET"),
|
|
||||||
RedirectURL: "http://localhost:8000/auth/github/callback",
|
|
||||||
Scopes: []string{"user:email"},
|
|
||||||
Endpoint: ogithub.Endpoint,
|
|
||||||
}
|
|
||||||
|
|
||||||
token, err := oauthConfig.Exchange(c.Request.Context(), code)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error exchanging token:", err)
|
// c.String(http.StatusBadRequest, "授权失败: %s", err.Error())
|
||||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"})
|
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": fmt.Errorf("授权失败: %s", err.Error())})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Println("token:", token)
|
||||||
|
|
||||||
client := github.NewClient(oauthConfig.Client(c.Request.Context(), token))
|
// 使用 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(), "")
|
user, _, err := client.Users.Get(c.Request.Context(), "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error getting user:", err)
|
// c.String(http.StatusInternalServerError, "获取用户信息失败: %s", err.Error())
|
||||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"})
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Errorf("获取用户信息失败: %s", err.Error())})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = storeUserToDB(user)
|
// err = storeUserToDB(user)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
log.Println("Error storing user to DB:", err)
|
// log.Println("Error storing user to DB:", err)
|
||||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"})
|
// c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"})
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
|
|
||||||
jwtToken, err := generateJWTToken(*user.ID)
|
log.Printf("%#v\n", user)
|
||||||
if err != nil {
|
log.Println(user.GetEmail(), user.GetName(), user.GetID(), user.GetAvatarURL())
|
||||||
log.Println("Error generating JWT token:", err)
|
// 处理用户信息
|
||||||
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"})
|
c.JSON(http.StatusOK, gin.H{
|
||||||
return
|
"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.SetCookie("token", jwtToken, 60*60*24, "/", "localhost", false, true)
|
||||||
c.Redirect(http.StatusFound, "http://localhost:8000/")
|
// c.Redirect(http.StatusFound, "http://152.70.110.4:8000")
|
||||||
}
|
}
|
||||||
|
|
||||||
func initDB() {
|
func initDB() {
|
||||||
|
|||||||
Reference in New Issue
Block a user