k01ken’s b10g

He110 W0r1d!

IrisでセッションIDを作成しCookieに追加/除去する方法

開発環境は、Windows 10 Pro(64bit) + go version go1.15.3 windows/amd64

1.以下のコードをmain.goという名前で保存してください

package main

import (
  "github.com/kataras/iris/v12"
  "github.com/kataras/iris/v12/sessions"
  "net/http"
  "time"
)

var (
  cookieNameForSessionID = "mycookiesession"
  sess = sessions.New(sessions.Config{Cookie: cookieNameForSessionID})
)

func main(){
  app := iris.New()
  tmpl := iris.HTML("./views", ".html")
  app.RegisterView(tmpl)
  app.Get("/", func(ctx iris.Context){
    if auth, _ := sess.Start(ctx).GetBoolean("authenticated"); !auth {
      ctx.ViewData("data", "ログインしてません")
    }else{
      ctx.ViewData("data", "ログインしています")
    }
    ctx.View("index.html")
  })

  app.Get("/login", login)
  app.Get("/logout", logout)

  app.Listen(":8080")
}

func login(ctx iris.Context){
  session := sess.Start(ctx)
  // HTTP Cookieオプションを変更したい場合は、ここで上書きします。
  // NameとValueを同じにすれば上書きできます。
  ctx.SetCookie(&http.Cookie{
    Name: cookieNameForSessionID,
    Value: session.ID(),
    HttpOnly: true,
    MaxAge: 3600,
    Path: "/",
    Domain: "localhost",
    Expires: time.Now().Add(time.Minute * 3600),
    SameSite:2, // 2:Lax 3:Strict 4:None
  })
  session.Set("authenticated", true)
  ctx.ViewData("data", "ログインページ")
  ctx.View("index.html")
}

func logout(ctx iris.Context){
  session := sess.Start(ctx)
  session.Set("authenticated", false)
  session.Delete("authenticated")
  session.Destroy()
  // HTTP Cookieを削除する。これがないと、HTTP Cookieがなぜか消えない。
  ctx.RemoveCookie(cookieNameForSessionID)
  ctx.ViewData("data", "ログアウトページ")
  ctx.View("index.html")
}

2. 同じディレクトリにviewsディレクトリを作成し、その中に、以下のコードをindex.htmlという名前で保存してください。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1">
  </head>
  <body>
    <div>
      <a href="./">TOP</a> <a href="./login">LOGIN</a> <a href="./logout">LOGOUT</a>
    </div>
    <h1>Hello Iris!</h1>
    <h2>{{ .data }}</h2>
  </body>
</html>

3. go run main.goでサーバーを立ち上げて、localhost:8080にアクセスすると、最初は、ログインしていませんというメッセージが出現しますが、一度、LOGINへアクセスしてから、再び、TOPにアクセスすると、ログインしていますと表示されます。次に、LOGOUTにアクセスしてから、TOPにアクセスすると、また、ログインしていませんと表示されます。
f:id:k01ken:20210503231904p:plain

ログイン/ログアウト状態を判別できるんですが、なぜか、ログアウトした後に、Cookieが削除されずに、残ったままなのはなぜなんだろうか?
【追記】
iris.Context.RemoveCookie("HTTP CookieのName")で消去できました。