This commit is contained in:
Sakurasan
2023-03-26 02:52:11 +08:00
parent 2cf484cdf1
commit 58835ee0d4
2 changed files with 62 additions and 41 deletions

View File

@@ -2,7 +2,6 @@ package main
import (
"crypto/rand"
"database/sql"
"encoding/base64"
"log"
"net/http"
@@ -11,14 +10,15 @@ import (
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"github.com/go-sql-driver/mysql"
"github.com/golang-jwt/jwt"
"github.com/google/go-github/v32/github"
"github.com/google/go-github/v50/github"
"golang.org/x/oauth2"
"golang.org/x/oauth2/github"
ogithub "golang.org/x/oauth2/github"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var dbConn *sql.DB
var db *gorm.DB
var jwtSecret = []byte(os.Getenv("JWT_SECRET"))
func main() {
@@ -41,21 +41,21 @@ func main() {
func githubLoginHandler(c *gin.Context) {
state := generateState()
code := generateCode()
// code := generateCode()
err := storeStateToDB(state, code)
if err != nil {
log.Println("Error storing state to DB:", err)
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"})
return
}
// err := storeStateToDB(state, code)
// if err != nil {
// log.Println("Error storing state to DB:", err)
// c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Internal server error"})
// return
// }
oauthConfig := &oauth2.Config{
ClientID: os.Getenv("GITHUB_CLIENT_ID"),
ClientSecret: os.Getenv("GITHUB_CLIENT_SECRET"),
RedirectURL: "http://localhost:8000/auth/github/callback",
Scopes: []string{"user:email"},
Endpoint: github.Endpoint,
Endpoint: ogithub.Endpoint,
}
url := oauthConfig.AuthCodeURL(state)
@@ -65,18 +65,19 @@ func githubLoginHandler(c *gin.Context) {
func githubCallbackHandler(c *gin.Context) {
state := c.Query("state")
code := c.Query("code")
log.Println(state, code)
if !verifyState(state, code) {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"message": "Invalid state"})
return
}
// if !verifyState(state, code) {
// c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"message": "Invalid state"})
// return
// }
oauthConfig := &oauth2.Config{
ClientID: os.Getenv("GITHUB_CLIENT_ID"),
ClientSecret: os.Getenv("GITHUB_CLIENT_SECRET"),
RedirectURL: "http://localhost:8000/auth/github/callback",
Scopes: []string{"user:email"},
Endpoint: github.Endpoint,
Endpoint: ogithub.Endpoint,
}
token, err := oauthConfig.Exchange(c.Request.Context(), code)
@@ -101,7 +102,7 @@ func githubCallbackHandler(c *gin.Context) {
return
}
jwtToken, err := generateJWTToken(user.ID)
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"})
@@ -113,20 +114,19 @@ func githubCallbackHandler(c *gin.Context) {
}
func initDB() {
cfg, err := mysql.ParseDSN(os.Getenv("MYSQL_DSN"))
if err != nil {
log.Fatal("Error parsing MySQL DSN:", err)
}
dbConn, err = sql.Open("mysql", cfg.FormatDSN())
dsn := "chat:123456@tcp(42.192.36.14:3306)/chat?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("Error opening database:", err)
}
err = dbConn.Ping()
sqlDB, err := db.DB()
if err != nil {
log.Fatal("Error connecting to database:", err)
}
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)
log.Println("Database connection established")
}
@@ -151,13 +151,7 @@ func generateRandomString(length int) string {
func storeStateToDB(state, code string) error {
query := "INSERT INTO oauth_state (state, code) VALUES (?, ?)"
stmt, err := dbConn.Prepare(query)
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(state, code)
err := db.Exec(query, state, code).Error
if err != nil {
return err
}
@@ -167,7 +161,7 @@ func storeStateToDB(state, code string) error {
func verifyState(state, code string) bool {
query := "SELECT COUNT(*) FROM oauth_state WHERE state = ? AND code = ?"
row := dbConn.QueryRow(query, state, code)
row := db.Exec(query, state, code)
var count int
err := row.Scan(&count)
@@ -185,13 +179,8 @@ func verifyState(state, code string) bool {
func storeUserToDB(user *github.User) error {
query := "INSERT INTO users (id, login, email) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE login = VALUES(login), email = VALUES(email)"
stmt, err := dbConn.Prepare(query)
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(user.GetID(), user.GetLogin(), user.GetEmail())
err := db.Exec(query, user.GetID(), user.GetLogin(), user.GetEmail()).Error
if err != nil {
return err
}