持久化Token

This commit is contained in:
奶爸
2019-12-20 23:58:09 +08:00
parent af146872fe
commit 70f0e92343
13 changed files with 82 additions and 55 deletions

View File

@@ -26,18 +26,17 @@ func (cp *commonPage) serve() {
}
func (cp *commonPage) home(c *gin.Context) {
var admin *model.User
isLogin, ok := c.Get(model.CtxKeyIsUserLogin)
if ok && isLogin.(bool) {
admin = dao.Admin
}
dao.ServerLock.RLock()
defer dao.ServerLock.RUnlock()
c.HTML(http.StatusOK, "page/home", mygin.CommonEnvironment(c, gin.H{
"Admin": admin,
data := gin.H{
"Domain": dao.Conf.Site.Domain,
"Servers": dao.ServerList,
}))
}
u, ok := c.Get(model.CtxKeyAuthorizedUser)
if ok {
data["Admin"] = u
}
c.HTML(http.StatusOK, "page/home", mygin.CommonEnvironment(c, data))
}
var upgrader = websocket.Upgrader{}

View File

@@ -28,14 +28,16 @@ func (ma *memberAPI) serve() {
}))
mr.POST("/logout", ma.logout)
mr.POST("/server", ma.addServer)
mr.POST("/server", ma.addOrEditServer)
}
type serverForm struct {
ID uint64
Name string `binding:"required"`
}
func (ma *memberAPI) addServer(c *gin.Context) {
func (ma *memberAPI) addOrEditServer(c *gin.Context) {
admin := c.MustGet(model.CtxKeyAuthorizedUser).(*model.User)
var sf serverForm
var s model.Server
err := c.ShouldBindJSON(&sf)
@@ -43,9 +45,13 @@ func (ma *memberAPI) addServer(c *gin.Context) {
dao.ServerLock.Lock()
defer dao.ServerLock.Unlock()
s.Name = sf.Name
s.Secret = com.MD5(fmt.Sprintf("%s%s%d", time.Now(), sf.Name, dao.Admin.ID))
}
if sf.ID == 0 {
s.Secret = com.MD5(fmt.Sprintf("%s%s%d", time.Now(), sf.Name, admin.ID))
s.Secret = s.Secret[:10]
err = dao.DB.Create(&s).Error
} else {
err = dao.DB.Save(&s).Error
}
if err != nil {
c.JSON(http.StatusOK, model.Response{
@@ -65,6 +71,7 @@ type logoutForm struct {
}
func (ma *memberAPI) logout(c *gin.Context) {
admin := c.MustGet(model.CtxKeyAuthorizedUser).(*model.User)
var lf logoutForm
if err := c.ShouldBindJSON(&lf); err != nil {
c.JSON(http.StatusOK, model.Response{
@@ -73,15 +80,17 @@ func (ma *memberAPI) logout(c *gin.Context) {
})
return
}
if lf.ID != dao.Admin.ID {
if lf.ID != admin.ID {
c.JSON(http.StatusOK, model.Response{
Code: http.StatusBadRequest,
Message: fmt.Sprintf("请求错误:%s", "用户ID不匹配"),
})
return
}
dao.Admin.Token = ""
dao.Admin.TokenExpired = time.Now()
dao.DB.Model(admin).UpdateColumns(model.User{
Token: "",
TokenExpired: time.Now(),
})
c.JSON(http.StatusOK, model.Response{
Code: http.StatusOK,
})

View File

@@ -75,9 +75,9 @@ func (oa *oauth2controller) callback(c *gin.Context) {
return
}
user := model.NewUserFromGitHub(gu)
dao.Admin = &user
dao.Admin.IssueNewToken()
c.SetCookie(dao.Conf.Site.CookieName, dao.Admin.Token, 60*60*24*14, "", "", false, false)
user.IssueNewToken()
dao.DB.Save(&user)
c.SetCookie(dao.Conf.Site.CookieName, user.Token, 60*60*24*14, "", "", false, false)
c.Status(http.StatusOK)
c.Writer.WriteString("<script>window.location.href='/'</script>")
}

View File

@@ -17,13 +17,11 @@ import (
func init() {
var err error
dao.ServerList = make(map[string]*model.Server)
dao.Conf, err = model.ReadInConfig("data/config.yaml")
dao.Conf = &model.Config{}
err = dao.Conf.Read("data/config.yaml")
if err != nil {
panic(err)
}
dao.Admin = &model.User{
Login: dao.Conf.GitHub.Admin,
}
dao.DB, err = gorm.Open("sqlite3", "data/sqlite.db")
if err != nil {
panic(err)
@@ -36,7 +34,7 @@ func init() {
}
func initDB() {
dao.DB.AutoMigrate(model.Server{})
dao.DB.AutoMigrate(model.Server{}, model.User{})
// load cache
var servers []model.Server
dao.DB.Find(&servers)