2017-07-01 130 views
0

我用两个结构来保存用户的信息用户的cookie验证失败随机

// SecureDevice holds a user's device's infos 
type SecureDevice struct { 
    Name  string // Defined by the user 
    DeviceIP string 
    Token struct { 
     Token  string 
     StartingDate time.Time // The token is supposed to last only a week before becoming invalid 
    } 
} 

// GlobalUser is a struct defining all user's infos registered inside the server 
type GlobalUser struct { 
    Username   string 
    Password   string 
    Salt    string 
    Mail    string 
    ValidationToken string // Used to validate the user's mail adress 
    Lang    string 
    ConversationsID []int // The private messages the user has part in 
    SecureDevicesList []SecureDevice 
} 

而且我使用一个函数来检查,如果用户在

// IsLoggedIn checks if client's token is valid 
func IsLoggedIn(r *http.Request) string { 
    ips := strings.Split(r.Header.Get("X-Forwarded-For"), ", ") 
    ip := ips[0] 
    cookie, err := r.Cookie("auth") 
    if err != nil { 
     return "ERR$" + "not_connected" 
    } 
    cookieValue := strings.Split(cookie.Value, "$") 
    println(cookie.Value) 
    user := GetUser(cookieValue[0]) 
    userToken := cookieValue[1] 
    if user.Username == "" { 
     return "ERR$" + "error" 
    } 
    for _, SecureDevice := range user.SecureDevicesList { 
     if SecureDevice.DeviceIP == ip && SecureDevice.Token.Token == userToken { // We make sure that the token provided is actually the user's token 
      if time.Since(SecureDevice.Token.StartingDate)*time.Hour >= 168 { // If token is older than 1 week, we throw it away 
       return "ERR$" + "error_token_expired" 
      } else if time.Since(SecureDevice.Token.StartingDate)*time.Second >= 30 { // If it's age is between 1 hour and one week, we renew it 
       db, err := scribble.New("./brony/db", nil) 
       if err != nil { 
        return "ERR$" + "error_internal" 
       } 
       tokenBytes, err := GenerateRandomBytes(64) // Generates a salt 
       if err != nil { 
        return "ERR$" + "error_internal" 
       } 
       token := base64.URLEncoding.EncodeToString(tokenBytes) 
       SecureDevice.Token.Token = token 
       SecureDevice.Token.StartingDate = time.Now() 
       errr := db.Write("users", user.Username, user) 
       if errr != nil { 
        return "ERR$" + "error_internal" 
       } 
       return "TOK$" + user.Username + "$" + SecureDevice.Token.Token 
      } else if time.Since(SecureDevice.Token.StartingDate)*time.Hour <= 1 { 
       return "NIL$" 
      } 
     } else if SecureDevice.DeviceIP == ip { 
      return "ERR$" + "error_bad_token" 
     } 
    } 
    return "ERR$" + "error_device_not_registered" 
} 

但几乎总是记录当我加载页面

status := IsLoggedIn(r) 
println(status) 

它经常给我一个错误,因为我打印“IsLoggedIn”来了解哪里pr oblem来自

test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
NIL$ 

test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
ERR$error_token_expired 

test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
NIL$ 

test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
ERR$error_token_expired 
test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
ERR$error_token_expired 

test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
ERR$error_token_expired 

test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
ERR$error_token_expired 

test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
ERR$error_token_expired 

test$ppDXRggtztyA9OBbdZh1t1ESqRo2XvuOBt4xlDai9kVxwq-_3zlWyvgNgA7AZcSpasJ_YnXZvoG                                        qlz1syF9X8g== 
NIL$ 

起初我还以为是我的令牌的更新代码是错误的,但同时beeing故障,未完成的,它似乎并没有被它的,因为一些F5故障后,它说,饼干是好的。我真的不明白错在哪里,而且它开始变得非常烦人,因为我不能让它成为现实,至少对于用户来说每次都要做f5会非常烦人,并且希望当页面会刷新,它会奇迹般地工作。代码在debian服务器上运行

回答

0

您的问题可能是,您处理time.Since的方式返回值进行比较。

time.Since方法返回类型Duration和内部表示为类型int64。价值在纳秒。

尝试这个 -

elapsedHours := int64(time.Since(SecureDevice.Token.StartingDate).Hours()) 
if elapsedHours >= 168 { 
    //... 
} else if elapsedHours >= 30 { 
    //... 
} else if elapsedHours <= 1 { 
    //... 
} 
+0

哇,似乎现在的工作每次。我仍然不明白为什么它有时会起作用,其他的则没有。非常感谢你! –

+0

不客气。打印'elapsedHours'和先前计算的值'time.Since(SecureDevice.Token.StartingDate)* time.Hour'来查看差异。 – jeevatkm