Срок действия токена JWT истек при установке приложения Go - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю над продуктом на основе SAAS.Я использую метод JWT для аутентификации вошедших в систему пользователей в системе.Продукт разработан на Go на серверной основе с каркасом джина для маршрутизации.

Проблема

Когда пользователь входит в систему, генерируется его токен JWT и он работает хорошо.Теперь пользователь не вышел из системы, но закрыл вкладку или окно браузера.Прежде чем он вернется, приложение go будет переустановлено с помощью команды install.Теперь пользователь возвращается и получает доступ к своей учетной записи, срок действия токена истек, и он не может видеть никаких своих данных.

Ниже приведен код для создания токена при входе в систему:

func CreateToken(user models.User, c *gin.Context) (string, error){
var ip, userAgent string
keyError := InitKeys()
if keyError != nil{
    return "", keyError
}

if values, _ := c.Request.Header["Ip"]; len(values) > 0 {
    ip = values[0]
}

if values, _ := c.Request.Header["User-Agent"]; len(values) > 0{
    userAgent = values[0]
}

token := jwt.NewWithClaims(jwt.SigningMethodHS256, &jwt.MapClaims{
    "email": user.EmailId,
    "exp": time.Now().Add(time.Hour * 8760).Unix(),
    "role": user.Role,
    "name": user.FirstName+" "+user.LastName,
    "ip": ip,
    "user_agent": userAgent,
    "id": user.Id,
})
config.CurrentUserId    = user.Id
models.CurrentUser      = user

/* Sign and get the complete encoded token as a string */
tokenString, err := token.SignedString([]byte(config.SignKey))
return tokenString, err

}

func InitKeys()(err error){
    SignKey, err = ioutil.ReadFile(GetBasePath()+PrivateKeyPath)
    if err != nil {
        return err
    }
    VerifyKey, err = ioutil.ReadFile(GetBasePath()+PublicKeyPath)
    if err != nil {
        return err
    }
    return nil
}

Теперь для декодирования и сопоставления токена используется следующая функция:

func ParseJWTToken(c *gin.Context){
merchantDb  := models.MerchantDatabase{ c.Keys["merchant_db"].(string) }
merchantDatabase := make(map[string]interface{})
if values, _ := c.Request.Header["Authorization"]; len(values) > 0 {
    bearer := strings.Split(c.Request.Header["Authorization"][0], "Bearer")
    bearerToken := strings.TrimSpace(bearer[1])
    _, err := merchantDb.GetSession(bson.M{"token": bearerToken})
    if err != nil{
        errMsg := "Failed: Unauthorized Access."
        response := controllers.ResponseController{
            config.FailureCode,
            config.FailureFlag,
            errMsg,
            err,
        }
        controllers.GetResponse(c, response)
        c.Abort()
    }else{

        var userAgent string
        var userAgentCheck bool

        if values, _ := c.Request.Header["User-Agent"]; len(values) > 0 {
            userAgent = values[0]
        }
        _ = config.InitKeys()
        token, err := jwt.Parse(bearerToken, func(token *jwt.Token) (interface{}, error) {
            return config.SignKey, nil
        })
        if len (token.Claims.(jwt.MapClaims)) > 0{
            for key, claim := range token.Claims.(jwt.MapClaims) {
                if key == "user_agent"{
                    if claim == userAgent{
                        userAgentCheck = true
                    }
                }   

                if key == "role"{
                    role = claim.(string)
                }

                if key == "id"{
                    userId = claim.(float64)
                }
                if key == "name"{
                    userName = claim.(string)
                }
            }
        }
        merchantDatabase["userid"] = userId
        merchantDatabase["role"] = role
        merchantDatabase["username"] = userName
        c.Keys = merchantDatabase
        if err == nil && token.Valid && userAgentCheck == true {
            c.Next()
        } else {
            errMsg := "Failed: Invalid Token."
            response := controllers.ResponseController{
                config.FailureCode,
                config.FailureFlag,
                errMsg,
                nil,
            }
            controllers.GetResponse(c, response)
            c.Abort()
        }
    }
}else{
    errMsg := "Failed: Unauthorized Access."
    response := controllers.ResponseController{
        config.FailureCode,
        config.FailureFlag,
        errMsg,
        "Missing Authorization Header",
    }
    controllers.GetResponse(c, response)
    c.Abort()
}   

}

Я не могу обнаружить, что мне не хватает.Пожалуйста, посмотрите код и укажите, что мне делать в этом случае.

...