add jwt middleware

This commit is contained in:
arnaucube
2019-06-15 10:12:21 +02:00
parent c38f7762f4
commit eec7019497
10 changed files with 178 additions and 58 deletions

View File

@@ -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

View File

@@ -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
}