Sessions: рдерд░реНрдб рдкрд╛рд░реНрдЯреА рд╕реНрдЯреЛрд░ рдХреЛрдбреЗрдХ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдЬреБрд▓ре░ 2015  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: gorilla/sessions

рд╣рдордиреЗ рдЕрднреА рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреБрдХреАрдЬрд╝ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдирд┐рдпрдорд┐рдд рдмреЗрд╕ 64 рдПрдиреНрдХреЛрдбреЗрдб рдХреБрдХреА рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп _ga=GA1.1.92283183.14264788986 рдЬреИрд╕реЗ рд╕рд╛рдорд╛рди рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдЬрдм рдпрд╣ рдЯреВрдЯ рдЧрдпрд╛ рддреЛ рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ? рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдЯреЛрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдЕрдкрдиреЗ рдмреИрдХрдПрдВрдб рд╕реНрдЯреЛрд░ рдореЗрдВ рдЖрдИрдбреА рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдХреНрдпреЛрд░рдХреБрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ SetMaxAge рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ redistore рдХрд╛ рдЖрдзрд╛ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ (30 рджрд┐рди) рд╕реБрд░рдХреНрд╖рд┐рддрдХреБрдХреА рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реЛрддрд╛ рд╣реИред

рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рд╕реЗ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ _all_ рдЕрдиреНрдп рд╕реНрдЯреЛрд░ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВтАФрд╡рд┐рдХрд▓реНрдк рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ MaxAge рдХреА рд╕реНрдерд╛рдкрдирд╛ CodecsFromPairs рд╕реЗ рдЙрддреНрдкрдиреНрди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реБрд░рдХреНрд╖рд┐рддрдХреБрдХреА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдмрдЧ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓реЗ рд╣реЛрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐рдпрд╛рдВ _less_ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреБрдХреА рдПрдЪрдПрдордПрд╕реА рдореЗрдВ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдПрдореНрдмреЗрдб рдХрд░ рд░рд╣реА рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ: рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ "рджреВрд░ рднрд╡рд┐рд╖реНрдп" рдХреБрдХреА рд╕рдорд╛рдкреНрддрд┐ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

рд╕рднреА 17 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

"_ga" рдХреБрдХреА рдХрд╛ рдЧреЛрд░рд┐рд▓реНрд▓рд╛/рд╕рддреНрд░реЛрдВ рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдПрдХ Google Analytics рд╣реИ
рдХреБрдХреА

рдпрджрд┐ рдЧреЛрд░рд┐рд▓реНрд▓рд╛/рд╕рддреНрд░ рдХреБрдХреАрдЬрд╝ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдХреЛрдИ рддреЛрдбрд╝ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ
рдкрд░рд┐рд╡рд░реНрддрди) рдХреНрдпрд╛ рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдФрд░ рдХреБрдХреАрдЬрд╝ рдлрд▓рдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ? (рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░> рд╕рдВрд╕рд╛рдзрди> рдХреНрд░реЛрдо рдХреЗ рддрд╣рдд рдХреБрдХреАрдЬрд╝)

рд╢реБрдХреНрд░ рд╣реИ, рдХрдо рд╕реЗ 07:12 рдЬреБрд▓рд╛ 10, 2015 рдХреЛ marksalpeter [email protected]
рд▓рд┐рдЦрд╛ рдерд╛:

рд╣рдордиреЗ рдЕрднреА рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреБрдХреАрдЬрд╝ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрдИрдЯреА рдЗрд╕
рдирд┐рдпрдорд┐рдд рдХреЗ рдмрдЬрд╛рдп _ga=GA1.1.92283183.14264788986 рдЬреИрд╕реЗ рд╕рд╛рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛
рдмреЗрд╕ 64 рдПрдиреНрдХреЛрдбреЗрдб рдХреБрдХреА рдбреЗрдЯрд╛ред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдЬрдм рдпрд╣ рдЯреВрдЯ рдЧрдпрд╛ рддреЛ
рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ? рдзрдиреНрдпрд╡рд╛рдж!

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/gorilla/sessions/issues/48ред

рд╣реЗ рдореИрдЯ,

рдореИрдВ рдорд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рд╡рд┐рд╡рд░рдг рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдкреИрдХреЗрдЬ рдХреЛ рдЕрднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдХреБрдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдереА рдЬреЛ 30 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣реА рдереА, рднрд▓реЗ рд╣реА рд╣рдордиреЗ рдореИрдХреНрд╕рдПрдЬ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реЛред рдпрд╣рд╛рдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛрдб рд╣реИ рдЬреЛ рдЕрднреА рд▓рд╛рдЗрд╡ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ:

рд╕реНрдерд┐рд░рд╛рдВрдХ (
AUTH_SESSION_NAME = "рдкреНрд░рдорд╛рдгреАрдХрд░рдг-рд╕рддреНрд░"
)

рд╡рд░ (
config = jconfig.LoadConfig (global.CONFIG() + "securecookie.json")
authKey = []byte(config.GetString("authorization_key"))
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдирдХреА = [] рдмрд╛рдЗрдЯ (config.GetString ("рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди_рдХреА"))
рд╕рддреНрд░ = рд╕рддреНрд░ред рдиреНрдпреВрдХреБрдХреАрд╕реНрдЯреЛрд░ (рдСрдердХреА, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдирдХреА)
)

рдлрдВрдХ рдЗрдирд┐рдЯ () {

apiRouter.HandleFunc("/auth/"   , Authenticate      )
apiRouter.HandleFunc("/deauth/"  , Deauthenticate   )
apiRouter.HandleFunc("/reauth/" , ReAuthenticate    )

// register complex data types for saving in sessions
gob.Register(&models.Device{})
gob.Register(&models.Manager{})
gob.Register(&models.SalesRep{})

// modify the options of the session store so that the auth cookie never expires (this is set so it expires in 200 years...)
session.Options.MaxAge = 6307200000

}

// рдпрд╣ рд╣реИрдВрдбрд▓рд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
// рдпрджрд┐ рдЕрдиреБрд░реЛрдзрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХреГрдд рд╣реИ рддреЛ рдпрд╣ рдЙрдирдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдПрдХ рдбрд┐рдлрд░реЗрдВрдЯ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
// рдЦрд╛рддрд╛, рдкрд╣рд▓реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкреНрд░рдорд╛рдгреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
//
// рдкрд░рдо
// рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛:
//
// рдиреЛрдЯ: рдЗрд╕ рдСрде рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдХреЗрд╡рд▓ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ
// рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реА рдмрд╛рд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЙрдирдХреЗ рд╕рддреНрд░ рдореЗрдВ рдХреИрд╢реНрдб рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛
//
func рдкреНрд░рдорд╛рдгреАрдХрд░рдг (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ http.ResponseWriter, рдЕрдиреБрд░реЛрдз *http.Request) {

log.Println("Authenticate")

// open the session
auth_session, err :=  session.Get(request, AUTH_SESSION_NAME)
if err != nil {
    log.Println("there was an error retreiving the session:", err)
    InternalServerError(response, request)
    return
}

// already authroized as a manager
if manager, ok := auth_session.Values["manager"].(*models.Manager); ok {
    log.Printf("already logged in as manager %d", manager.Id)
    Success(response, request, manager)

// already authrorized as a device
} else if device, ok := auth_session.Values["device"].(*models.Device); ok {
    log.Printf("already logged in as device %d", device.Id)
    Success(response, request, device)

// attempt to gain authroization
} else {            
    fp  := parsers.FormParser(request)  

    // login as a manager
    if username, password := fp.GetString("user", ""), fp.GetString("pass", ""); username != "" && password != ""  {

        db := database.Open()
        defer db.Close()


        if manager := db.LoginAsManager(username, password); manager != nil {
            auth_session.Values["manager"] = manager

            // manager session error
            if err := auth_session.Save(request, response); err != nil {
                log.Printf("manager could not save session %s !\n", err.Error())
                InternalServerError(response, request)

            // manager login in success
            } else {
                log.Printf("logged in as manager %d !\n", manager.Id)
                Success(response, request, manager)     
            }

        // manager login failed
        } else {
            log.Printf("manager credentials not valid!")
            Unauthroized(response, request)
        }

    // login as a salesrep
    } else if username, password := fp.GetString("username", ""), fp.GetString("password", ""); username != "" && password != "" {

        db := database.Open()
        defer db.Close()


        if sales_rep_id := db.LoginAsSalesRep(username, password); sales_rep_id > 0 {

            sales_reps := db.GetSalesRep(&models.SalesRep{ Id: sales_rep_id });

            auth_session.Values["sales_rep"] = sales_reps[0];

            // sales rep session error
            if err := auth_session.Save(request, response); err != nil {
                log.Printf("sales rep could not save session %s !\n", err.Error())
                InternalServerError(response, request)

            // sales rep login in success
            } else {
                log.Printf("logged in as sales rep %d !\n", manager.Id)
                Success(response, request, manager)     
            }

        // sales rep login failed
        } else {
            log.Printf("sales rep credentials not valid!")
            Unauthroized(response, request)
        }

    // login as a device
    } else if pin_code := fp.GetInt32("PinCode", -1); pin_code > 0 {

        db := database.Open()
        defer db.Close()

        if devices := db.GetDevice(&models.Device{ PinCode:pin_code }, nil); len(devices) > 0 {
            auth_session.Values["device"] = &devices[0]

            // device session error
            if err := auth_session.Save(request, response); err != nil {
                log.Printf("device could not save session %s !\n", err.Error())
                InternalServerError(response, request)

            // device login in success
            } else {
                log.Printf("logged in as device %d !\n", devices[0].Id)
                Success(response, request, devices[0])      
            }

        // device login failed
        } else {
            log.Printf("device credentials not valid!")
            Unauthroized(response, request)
        }


    // no valid credentials were provided   
    } else {
        log.Println("no valid deivce or manager credentials")
        BadRequest(response, request)
    }

}

}

рдФрд░ 30 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рд▓реЙрдЧ рдореЗрдВ рдпрд╣реА рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ:

рдбрд┐рд╡рд╛рдЗрд╕ рдХреБрдХреА: рдкреНрд░рдорд╛рдгреАрдХрд░рдг-рд╕рддреНрд░=_KaJDVq4lIdQgeHiHcnSMw1IEPDyg3-9XEIBBPxw==; рдкрде =/; рд╕рдорд╛рдкреНрддрд┐ = рд╕реЛрдо, 15 рдордИ 2215 20:47:49 рдпреВрдЯреАрд╕реА; рдЕрдзрд┐рдХрддрдо рдЖрдпреБ = 6307200000

2015/07/10 15:56:04 /routers/api/Auth.go:70: Securecookie: рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХреБрдХреАрдЬрд╝ 30 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╣рдордиреЗ MaxAge рдХреЛ рдХрд┐рд╕ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реЛред рдЖрдкрдХреА рдХреЛрдИ рднреА рдорджрдж рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдПрдХ рдиреНрдпреВрдирддрдо рдбреЗрдореЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ рдкреВрд░реЗ рд╕реНрдЯреЛрд░ рдкрд░ MaxAge рдХреЛ 2 рдорд╣реАрдиреЗ (86400 * 60) рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ:

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/sessions"
)

var store = sessions.NewCookieStore([]byte("some-appropriately-auth-key"))

func SomeHandler(w http.ResponseWriter, r *http.Request) {
    session, err := store.Get(r, "example")
    if err != nil {
        http.Error(w, "No good!", 500)
        return
    }

    session.Values["gorilla"] = "sessions!"
    err = session.Save(r, w)
    if err != nil {
        http.Error(w, "No good!", 500)
        return
    }

    fmt.Fprintf(w, "%v", session.Values["gorilla"])
}

func main() {
    store.Options = &sessions.Options{
        MaxAge: 86400 * 60, // 2 months
    }

    http.HandleFunc("/", SomeHandler)
    log.Fatal(http.ListenAndServe(":8002", nil))
}

рдпрд╣ рдореБрдЭреЗ рд╡рд╣ рд╕рдорд╛рдкреНрддрд┐ рд╕рдордп рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЕрдкреЗрдХреНрд╖рд╛ рдереА:

Expiry time test

рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реА рдШрдбрд╝реА рдХреЛ рдЖрдЧреЗ ~ 33 рджрд┐рди рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ expired timestamp рддреНрд░реБрдЯрд┐ securecookie - рдЬреЛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╣реИред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХреБрдХреАрдЬрд╝ рд╕рд╛рдлрд╝ рдХрд░рдирд╛, рдШрдбрд╝реА рдХреЛ рд╡рд╛рдкрд╕ рдЕрднреА () рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ MaxAge рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд *securecookie.SecureCookie рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордЬрдмреВрд░ рдХрд░рдирд╛:

    store.Options = &sessions.Options{
        MaxAge: 86400 * 60, // 2 months
    }
    for _, s := range store.Codecs {
        if cookie, ok := s.(*securecookie.SecureCookie); ok {
            cookie.MaxAge(86400 * 90)
        }
    }

рдпрд╣ рдЕрднреА рднреА рдореБрдЭреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ +2 рдорд╣реАрдиреЗ рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреБрдХреА рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдбреЗрдХ рдХрд╛ maxAge рдлрд╝реАрд▓реНрдб рдЙрд╕ рдкрд░ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдбрд╛рд▓рддрд╛ рд╣реИ рдЬрдм рд╣рдо http.Cookie рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрд░реА рдШрдбрд╝реА +33 рджрд┐рдиреЛрдВ рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рддреЛ рдореИрдВрдиреЗ рдХреБрдЫ рдЦреБрджрд╛рдИ рдХреА:

  • рд╣рдорд╛рд░реА рддреНрд░реБрдЯрд┐ "рд╕рд┐рдХреНрдпреЛрд░рдХреНрдпреВрдХреА: рдПрдХреНрд╕рдкрд╛рдпрд░реНрдб рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк" https://github.com/gorilla/securecookie/blob/master/securecookie.go#L244 -L246 рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ
  • рдпрд╣ рд▓рд╛рдЗрди рдХреБрдХреАрд╕реНрдЯреЛрд░ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдореИрдХреНрд╕рдПрдЬ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ: https://github.com/gorilla/sessions/blob/master/store.go#L54 -L56
  • рдлреЛрди рдХрд░рдХреЗ CodecsFromPairs рд╡рд┐рдХрд▓реНрдк рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдареАрдХ рдХрд░рддрд╛ рд╣реИ s.MaxAge рдХреЗ рднреАрддрд░ рдкреНрд░рддреНрдпреЗрдХ *securecookie.SecureCookie securecookie рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрдВ (рдХреЛрдбреЗрдХ рдЯреБрдХрдбрд╝рд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк): 86400 * 30 ред
  • рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ sessions.CookieStore.Codecs (рдЙрдкрд░реЛрдХреНрдд рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рд╕реЗ рдЕрдзрд┐рдХ рд╕реАрдорд╛ рдореЗрдВ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреБрдХреА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ MaxAge рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

TL;DR : рдореВрд▓ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд▓рд┐рдЦреЗ рдЧрдП http.Cookie рдХреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реБрд░рдХреНрд╖рд┐рддрдХреБрдХреА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП HMAC date|value|mac рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ - рдЬрд╣рд╛рдВ date _default_ MaxAge рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рдареАрдХ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред HMAC рд╕рддреНрдпрд╛рдкрди рдмрд╛рдж рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдо> 30 рджрд┐рди рд╣рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВред

рдлрд┐рдХреНрд╕ sessions.NewCookieStore рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдмрдирд╛рдП рдЧрдП рдХреЛрдбреЗрдХреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ *securecookie.SecureCookie рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд╕рдПрдЬ рдЗрд╕реЗ рдХреБрдХреА рд╕рдорд╛рдкреНрддрд┐ рдФрд░ рдПрдЪрдПрдордПрд╕реА рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмреАрдЪ рдмреЗрдореЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

cc/ @kisielk рдореЗрд░реЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдХреЛрдИ рд╕реБрдзрд╛рд░ рдХрд░реВрдБ

рдкреАрдПрд╕: рдЗрд╕рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд, рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдПрдХ рдПрдХрд▓ рдбреАрдмреА рдкреВрд▓ рдЦреЛрд▓рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реЛ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рдХреЗред рдкреВрд▓ рдкреНрд░рддрд┐-рдЕрдиреБрд░реЛрдз рдХреЛ рдЦреЛрд▓рдирд╛ рдФрд░ рдмрдВрдж рдХрд░рдирд╛ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╣рд┐рдЯ рд╣реИред *sql.DB рд╕рдорд╡рд░реНрддреА рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдЯреЛрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдЕрдкрдиреЗ рдмреИрдХрдПрдВрдб рд╕реНрдЯреЛрд░ рдореЗрдВ рдЖрдИрдбреА рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдХреНрдпреЛрд░рдХреБрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ SetMaxAge рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ redistore рдХрд╛ рдЖрдзрд╛ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ (30 рджрд┐рди) рд╕реБрд░рдХреНрд╖рд┐рддрдХреБрдХреА рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реЛрддрд╛ рд╣реИред

рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рд╕реЗ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ _all_ рдЕрдиреНрдп рд╕реНрдЯреЛрд░ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВтАФрд╡рд┐рдХрд▓реНрдк рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ MaxAge рдХреА рд╕реНрдерд╛рдкрдирд╛ CodecsFromPairs рд╕реЗ рдЙрддреНрдкрдиреНрди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реБрд░рдХреНрд╖рд┐рддрдХреБрдХреА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдмрдЧ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓реЗ рд╣реЛрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐рдпрд╛рдВ _less_ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреБрдХреА рдПрдЪрдПрдордПрд╕реА рдореЗрдВ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдПрдореНрдмреЗрдб рдХрд░ рд░рд╣реА рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ: рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ "рджреВрд░ рднрд╡рд┐рд╖реНрдп" рдХреБрдХреА рд╕рдорд╛рдкреНрддрд┐ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдЯрд┐рдХрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╣реИред рдореИрдВ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдмреЗрд╕ 64 рдХреБрдХреА рдХреЛ рдбреАрдХреЛрдб рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдЯрд╛рдЗрдо рд╕реНрдЯреИрдореНрдк рдХреЛ рд╡рд░реНрддрдорд╛рди рджрд┐рди рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рдерд╛, рдмреЗрд╕ 64 рдХреБрдХреА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдореИрдХреНрд╕рдПрдЬ рд╕рдВрдкрддреНрддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреА, рднрд▓реЗ рд╣реА рдЖрдкрдиреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рд╣реЛред рдореИрдХреНрд╕рдПрдЬ рд╕рдорд╕реНрдпрд╛ред

рд╣рд╛рдБ "рджреВрд░ рднрд╡рд┐рд╖реНрдп" рдХреБрдХреА рд╕рд┐рд░реНрдл рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдереА, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ MaxAge 0 рдкрд░ рд╕реЗрдЯ рд╣реИред рд╣рдордиреЗ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╛рдпрд╛ рдФрд░ рдПрдХ рд╕рдорд╛рди рдлрд┐рдХреНрд╕ рд▓рд┐рдЦрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рд╕рдВрдХреНрд╖рд┐рдкреНрддред

рдореБрджреНрджреЗ рдкрд░ рдЧреМрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@wbaron - рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВред рд╣рдо рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдЕрдкрд╕реНрдЯреНрд░реАрдо рдкреИрдХреЗрдЬ рдореЗрдВ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗ рдФрд░
рдПрдХ рдмрд╛рд░ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рдореИрдВ рдЖрдкрдХреЛ рдкрд┐рдВрдЧ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдХрд╛рдВрдЯрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ (рдпрджрд┐ рдЖрдк
рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ)ред

@marksalpeter - рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣рд╛рдБ? рд╕рд┐рдХреНрдпреЛрд░рдХреБрдХреА рдПрдордПрд╕реАрдПрд╕
рдирд╛рдо | рджрд┐рдирд╛рдВрдХ | рдмреЗрд╕ 64 рд╕реЗ рдкрд╣рд▓реЗ рдорд╛рди рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░
рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдкрд░ рдбреАрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ рдЖрдк рд╡рд╣рд╛рдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рдпрд╣ рд╣реИ
MAC'ed- рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЙрдбрд┐рдлрд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА, рддреЛ
рдХреБрдХреА рдХреЛ рдбреАрдХреЛрдб (рдЕрдиреБрд░реЛрдз) рдкрд░ рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдореИрдХ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛
рд╣реИрд╢/рдСрде рдХреБрдВрдЬреА рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдВрджрд░реНрдн:
https://github.com/gorilla/securecookie/blob/master/securecookie.go#L185 -L191

рдордВрдЧрд▓, 14 рдЬреБрд▓рд╛рдИ, 2015 рдкрд░ wbaron 10:40 pm рдкрд░ [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

рд╣рд╛рдБ "рджреВрд░ рднрд╡рд┐рд╖реНрдп" рдХреБрдХреА рдХреЗрд╡рд▓ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдереА, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ MaxAge рдХреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
0 рдЕрдм рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ред рд╣рдореЗрдВ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рдФрд░
рдЖрдкрдХреЗ рдЬреИрд╕рд╛ рд╣реА рдПрдХ рдлрд┐рдХреНрд╕ рд▓рд┐рдЦрд╛ рд╣реИ, рдереЛрдбрд╝рд╛ рдХрдо рд╕рдВрдХреНрд╖реЗрдк рдХреЗ рд╕рд╛рдеред

рдореБрджреНрджреЗ рдкрд░ рдЧреМрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/gorilla/sessions/issues/48#issuecomment -121257995ред

@elithr рдореЗрд░реА рдЧрд▓рддреАред рдЬрдм рдореИрдВ рдХреБрдХреАрдЬрд╝ рдХреЛ рдбреАрдХреЛрдб рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ [рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк] | [рдореИрдХ'рдПрдб рдЬрд╛рдирдХрд╛рд░реА] рдореИрдВрдиреЗ рдЕрднреА рдорд╛рдирд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрддрдо рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рд╕рдордп рдЯрд┐рдХрдЯ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗред

@elithar рдЬреЛ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╣рд░ рджреБрдХрд╛рди рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ: /

@kisielk - рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИред рдореИрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рдЫреВрдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛
рд╕реНрдЯреЛрд░ рд▓реЗрдХрд┐рди рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕реНрдЯреЛрд░ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рдл рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛
Options.MaxAge рдлрд╝реАрд▓реНрдбреНрд╕ рд╕реБрд░рдХреНрд╖рд┐рддрдХреБрдХреА рдореЗрдВ s.MaxAge рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рдеред

рдореИрдВ рд╕реБрд░рдХреНрд╖рд┐рддрдХреБрдХреА рдореЗрдВ func CodecMaxAge(codecs []Codec, age int) []Codec рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖: рдПрдХ
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ + рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ) рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ
рдЕрднрд┐рдХрдерди + рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдбреЗрдХ рдкрд░ s.MaxAge (рдЖрдпреБ) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмреЗрдорд╛рдиреА рд░рд╣рддрд╛ рд╣реИ (рд▓реВрдк
рдУрд╡рд░ рд╕реНрд▓рд╛рдЗрд╕, рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдПрд╕реЗрдЯ рдЯреВ рдХреБрдХреА рдЯрд╛рдЗрдк) рдХреЛрдб рдерд░реНрдб рдкрд╛рд░реНрдЯреА рд╕реНрдЯреЛрд░ рд╕реЗ рдмрд╛рд╣рд░
рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ NewXXXXStore рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрд╕ securecookie.CodecMaxAge(mystore.Codecs, mystore.opts.MaxAge) рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд s.maxAge рдлрд╝реАрд▓реНрдбред

рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред

рд╢реБрдХреНрд░, рдЬреБрд▓рд╛рдИ резрен, реирежрезрел рдкреВрд░реНрд╡рд╛рд╣реНрди рео:режрей рдмрдЬреЗ рдХрд╛рдорд┐рд▓ рдХрд┐рд╕рд┐рдпрд▓ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@elithar https://github.com/elithar рдЬреЛ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ
рдореИрдВред рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╣рд░ рджреБрдХрд╛рди рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ: /

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/gorilla/sessions/issues/48#issuecomment -122133977ред

рд╣рд╛рдБ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдареАрдХ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдпрд╣рд╛рдВ рдмрджрд▓рд╛рд╡ рд▓рд╛рдПрдВрдЧреЗ рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреАрдЖрд░ рдЕрдиреНрдп рд╕реНрдЯреЛрд░реЛрдВ рдХреЛ рднреЗрдЬреВрдВрдЧрд╛ред

рдЯреНрд░реИрдХрд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП:

  • [x] [рдЧреЛрд░рд┐рд▓реНрд▓рд╛/рд╕рддреНрд░](https://github.com/gorilla/sessions)
  • [ ] [github.com/starJammer/gorilla-sessions-arangodb](https://github.com/starJammer/gorilla-sessions-arangodb) - ArangoDB
  • [ ] [github.com/yosssi/boltstore](https://github.com/yosssi/boltstore) - рдмреЛрд▓реНрдЯ
  • [ ] [github.com/srinathgs/couchbasestore](https://github.com/srinathgs/couchbasestore) - рдХрд╛рдЙрдЪрдмреЗрд╕
  • [ ] [github.com/denizeren/dynamostore](https://github.com/denizeren/dynamostore) - AWS рдкрд░ рдбрд╛рдпрдирд╛рдореЛрдбрдм
  • [ ] [github.com/bradleypeabody/gorilla-sessions-memcache](https://github.com/bradleypeabody/gorilla-sessions-memcache) - Memcache
  • [ ] [github.com/hnakamur/gaessions](https://github.com/hnakamur/gaessions) - рдЬреАрдПрдИ рдкрд░ рдореЗрдореНрдХреИрд╢
  • [x] [github.com/kidstuff/mongostore](https://github.com/kidstuff/mongostore) - MongoDB
  • [ ] [github.com/srinathgs/mysqlstore](https://github.com/srinathgs/mysqlstore) - MySQL
  • [x] [github.com/antonlindstrom/pgstore](https://github.com/antonlindstrom/pgstore) - PostgreSQL
  • [ ] [github.com/boj/redistore](https://github.com/boj/redistore) - рд░реЗрдбрд┐рд╕
  • [x] [github.com/boj/rethinkstore](https://github.com/boj/rethinkstore) - рд░реЗрдерд┐рдВрдХрдбреАрдмреА
  • [ ] [github.com/boj/riakstore](https://github.com/boj/riakstore) - рд░рд┐рдпрд╛рдХ
  • [ ] [github.com/michaeljs1990/sqlitestore](https://github.com/michaeljs1990/sqlitestore) - SQLite

рдПрдХ рдмрд╛рд░ рдкреАрдЖрд░ рдХрд╛ рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрдиреНрд╣реЗрдВ рдЯреНрд░реИрдХ рдХрд░ рд▓реВрдВрдЧрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдХрд╛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдХреЗрдЬ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ... @elithar рдХреА рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХреЛ рдЕрднреА рднреА 10 рдФрд░ рдЪреЗрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреБрд░рд╛рдиреА рди рд╣реЛред

рдпрд╣ рд╕рдЯреАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд▓реЗрдХрд┐рди рд╕рднреА рд╕реНрдЯреЛрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдирд╣реАрдВ рд╣реИрдВ рдпрд╛ рдкреАрдЖрд░ рдЬрдорд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдХрд╛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдХрд╛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕