与Gin的大猩猩会话不会存储。我无法在初始请求之外访问它们

时间:2018-09-25 17:25:27

标签: reactjs go gorilla

我正在使用react and go创建一个小的测验应用程序。这是我的golang后端代码。我正在使用大猩猩进行会话,并使用杜松子酒进行路由。当我在初始请求(登录)中打印session.Values时,所有值都将正确打印。但是在其他请求中,session.Values变为nil。我在这里附加后端代码。

package main

import (
    "fmt"
    "net/http"

    "github.com/gin-gonic/gin"
    "github.com/gorilla/sessions"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite" // If you want to use mysql or any other db, replace this line
)

var db *gorm.DB // declaring the db globally
var err error
var store = sessions.NewCookieStore([]byte("secret"))

type Person struct {
    ID        uint   `json:"id"`
    FirstName string `json:"firstname"`
    LastName  string `json:"lastname"`
    Email     string `json:"email"`
    Password  string `json:"password"`
}
type Quiz struct {
    ID    uint   `json:"id"`
    Name  string `json:"name"`
    Genre string `json:"genre"`
}
type Question struct {
    ID       uint   `json:"id"`
    Question string `json:"question"`
    Opt1     string `json:"opt1"`
    Opt2     string `json:"opt2"`
    Opt3     string `json:"opt3"`
    Opt4     string `json:"opt4"`
    Ans1     bool   `json:"ans1"`
    Ans2     bool   `json:"ans2"`
    Ans3     bool   `json:"ans3"`
    Ans4     bool   `json:"ans4"`
    QuizId   uint   `json:"QuizID,string"`
}

func main() {
    db, err = gorm.Open("sqlite3", "./gorm.db")
    if err != nil {
        fmt.Println(err)
    }
    defer db.Close()

    db.AutoMigrate(&Person{})
    db.AutoMigrate(&Quiz{})
    db.AutoMigrate(&Question{})
    r := gin.Default()

    r.POST("/people", CreateAccount)
    r.POST("/authenticate/", Login)

    private := r.Group("/private")
    private.Use(AuthRequired())
    // {
    private.GET("/quiz-list/", ViewAllQuizzes)
    private.POST("/CreateQuiz/", CreateQuiz)
    private.GET("/AllPeople/", ListPeople)
    private.GET("/GetQuestion/:id", GetQuestion)
    private.GET("/getPlayerId/", getPlayerId)
    private.POST("/UpdateQuestion/:id", UpdateQuestion)
    private.POST("/DeleteQuiz/:id", DeleteQuiz)
    private.POST("/DeletePerson/:id", DeletePerson)
    private.POST("/AddQuestion/", AddQuestion)
    private.POST("/delete-question/:id", DeleteQuestion)
    private.GET("/question-list/:id", ListQuestions)
    // }

    r.Run(":8080") // Run on port 8080
}

func AuthRequired() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println("AuthReqAuthReqAuthReq==============================")
        // session := sessions.Default(c)
        session, err := store.Get(c.Request, "session-name")
        fmt.Println(err)
        fmt.Println("AuthRequired", err, session.Values)
        if session.Values["email"] != nil {
            // Continue down the chain to handler etc
            c.Next()
        } else {
            // You'd normally redirect to login page
            c.JSON(http.StatusBadRequest, "Not logged in")
        }
    }
}

func Login(c *gin.Context) {
    var person Person
    var received_person Person
    c.BindJSON(&received_person)
    d := db.Where("email = ?", received_person.Email).First(&person)
    fmt.Println("login", d)
    c.Header("access-control-allow-origin", "http://localhost:3000")
    c.Header("access-control-allow-credentials", "true")

    if person.Email == received_person.Email && person.Password == received_person.Password {
        session, err := store.Get(c.Request, "session-name")
        session.Values["email"] = person.Email
        session.Values["id"] = person.ID
        session.Values["logged-in"] = true
        session.Values["firstName"] = person.FirstName
        session.Values["lastName"] = person.LastName
        session.Save(c.Request, c.Writer)

        fmt.Println("login", session.Values, err)

        c.JSON(200, person)
    } else {
        c.JSON(200, "User Not Found")
    }
}
func getPlayerId(c *gin.Context) {
    c.Header("access-control-allow-origin", "*") // Why am I doing this? Find out. Try running with this line commented
    session, _ := store.Get(c.Request, "session-name")
    fmt.Println("getID ", session.Values)
    id := session.Values["id"]
    c.JSON(200, id)
}

在getPlayerId函数中,sessions.Values最终为nil。

这是一项学术任务。

0 个答案:

没有答案