mirror of
https://github.com/arnaucube/gogame.git
synced 2026-02-07 03:26:39 +01:00
add jwt middleware
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
package endpoint
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
jwt "github.com/appleboy/gin-jwt/v2"
|
||||
"github.com/arnaucube/gogame/constants"
|
||||
"github.com/fatih/color"
|
||||
"github.com/gin-gonic/gin"
|
||||
"gopkg.in/mgo.v2/bson"
|
||||
@@ -64,10 +64,32 @@ func handleLogin(c *gin.Context) {
|
||||
})
|
||||
}
|
||||
|
||||
func handleGetResources(c *gin.Context) {
|
||||
userid := c.Param("userid")
|
||||
func handleGetUser(c *gin.Context) {
|
||||
claims := jwt.ExtractClaims(c)
|
||||
userid := bson.ObjectIdHex(claims[constants.JWTIdKey].(string))
|
||||
|
||||
user, err := userservice.GetUserById(bson.ObjectIdHex(userid))
|
||||
user, err := userservice.GetUserById(userid)
|
||||
if err != nil {
|
||||
fail(c, err, "error on getting user")
|
||||
return
|
||||
}
|
||||
resources, err := user.GetResources()
|
||||
if err != nil {
|
||||
fail(c, err, "error on getting user resources")
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{
|
||||
"user": user,
|
||||
"resources": resources,
|
||||
})
|
||||
}
|
||||
|
||||
func handleGetResources(c *gin.Context) {
|
||||
claims := jwt.ExtractClaims(c)
|
||||
userid := bson.ObjectIdHex(claims[constants.JWTIdKey].(string))
|
||||
|
||||
user, err := userservice.GetUserById(userid)
|
||||
if err != nil {
|
||||
fail(c, err, "error on getting user")
|
||||
return
|
||||
@@ -85,9 +107,10 @@ func handleGetResources(c *gin.Context) {
|
||||
}
|
||||
|
||||
func handleGetUserPlanets(c *gin.Context) {
|
||||
userid := c.Param("userid")
|
||||
claims := jwt.ExtractClaims(c)
|
||||
userid := bson.ObjectIdHex(claims[constants.JWTIdKey].(string))
|
||||
|
||||
planets, err := userservice.GetUserPlanetsById(bson.ObjectIdHex(userid))
|
||||
planets, err := userservice.GetUserPlanetsById(userid)
|
||||
if err != nil {
|
||||
fail(c, err, "error on getting user planets")
|
||||
return
|
||||
@@ -104,16 +127,16 @@ type BuildMsg struct {
|
||||
}
|
||||
|
||||
func handlePostUpgradeBuilding(c *gin.Context) {
|
||||
userid := c.Param("userid")
|
||||
claims := jwt.ExtractClaims(c)
|
||||
userid := bson.ObjectIdHex(claims[constants.JWTIdKey].(string))
|
||||
var buildMsg BuildMsg
|
||||
err := c.BindJSON(&buildMsg)
|
||||
if err != nil {
|
||||
fail(c, err, "error parsing json")
|
||||
return
|
||||
}
|
||||
fmt.Println(buildMsg)
|
||||
|
||||
user, err := userservice.GetUserById(bson.ObjectIdHex(userid))
|
||||
user, err := userservice.GetUserById(userid)
|
||||
if err != nil {
|
||||
fail(c, err, "error on getting user")
|
||||
return
|
||||
|
||||
@@ -1,12 +1,19 @@
|
||||
package endpoint
|
||||
|
||||
import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
jwt "github.com/appleboy/gin-jwt/v2"
|
||||
"github.com/arnaucube/gogame/config"
|
||||
"github.com/arnaucube/gogame/constants"
|
||||
"github.com/arnaucube/gogame/database"
|
||||
"github.com/arnaucube/gogame/models"
|
||||
"github.com/arnaucube/gogame/services/gamesrv"
|
||||
"github.com/arnaucube/gogame/services/usersrv"
|
||||
"github.com/gin-contrib/cors"
|
||||
"github.com/gin-gonic/gin"
|
||||
"gopkg.in/mgo.v2/bson"
|
||||
)
|
||||
|
||||
var serverConfig config.Config
|
||||
@@ -17,15 +24,74 @@ var gameservice *gamesrv.Service
|
||||
func newApiService() *gin.Engine {
|
||||
api := gin.Default()
|
||||
api.Use(cors.Default())
|
||||
api.GET("/", handleMain)
|
||||
|
||||
// the jwt middleware
|
||||
authMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{
|
||||
Realm: "test zone",
|
||||
Key: []byte("secret key"),
|
||||
Timeout: time.Hour,
|
||||
MaxRefresh: time.Hour,
|
||||
IdentityKey: constants.JWTIdKey,
|
||||
PayloadFunc: func(data interface{}) jwt.MapClaims {
|
||||
if v, ok := data.(*models.User); ok {
|
||||
return jwt.MapClaims{
|
||||
constants.JWTIdKey: v.Id,
|
||||
}
|
||||
}
|
||||
return jwt.MapClaims{}
|
||||
},
|
||||
IdentityHandler: func(c *gin.Context) interface{} {
|
||||
claims := jwt.ExtractClaims(c)
|
||||
userid := bson.ObjectIdHex(claims[constants.JWTIdKey].(string))
|
||||
return &models.User{
|
||||
Id: userid,
|
||||
}
|
||||
},
|
||||
Authenticator: func(c *gin.Context) (interface{}, error) {
|
||||
var loginMsg LoginMsg
|
||||
if err := c.ShouldBind(&loginMsg); err != nil {
|
||||
return "", jwt.ErrMissingLoginValues
|
||||
}
|
||||
|
||||
_, user, err := userservice.Login(loginMsg.Email, loginMsg.Password)
|
||||
if err != nil {
|
||||
fail(c, err, jwt.ErrFailedAuthentication.Error())
|
||||
return "", err
|
||||
}
|
||||
return user, nil
|
||||
|
||||
},
|
||||
Unauthorized: func(c *gin.Context, code int, message string) {
|
||||
c.JSON(code, gin.H{
|
||||
"code": code,
|
||||
"message": message,
|
||||
})
|
||||
},
|
||||
TokenLookup: "header: Authorization",
|
||||
|
||||
// TokenHeadName is a string in the header. Default value is "Bearer"
|
||||
TokenHeadName: "Bearer",
|
||||
|
||||
// TimeFunc provides the current time. You can override it to use another time value. This is useful for testing or if your server uses a different time zone than your tokens.
|
||||
TimeFunc: time.Now,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatal("JWT Error:" + err.Error())
|
||||
}
|
||||
|
||||
api.GET("/info", handleInfo)
|
||||
api.POST("/register", handleRegister)
|
||||
api.POST("/login", handleLogin)
|
||||
// api.POST("/login", handleLogin)
|
||||
api.POST("/login", authMiddleware.LoginHandler)
|
||||
api.GET("/refresh_token", authMiddleware.RefreshHandler)
|
||||
|
||||
// TODO add jwt checker
|
||||
api.GET("/resources/:userid", handleGetResources)
|
||||
api.GET("/planets/:userid", handleGetUserPlanets)
|
||||
api.POST("/buildings/:userid", handlePostUpgradeBuilding)
|
||||
api.Use(authMiddleware.MiddlewareFunc())
|
||||
{
|
||||
api.GET("/", handleGetUser)
|
||||
api.GET("/resources", handleGetResources)
|
||||
api.GET("/planets", handleGetUserPlanets)
|
||||
api.POST("/buildings", handlePostUpgradeBuilding)
|
||||
}
|
||||
return api
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user