セッション

やあ、フィリップです!
プラットフォーム Go Web Example コース をリリースしたことをお知らせします。Go の Web 開発に関する、わかりやすい動画コースをお楽しみください。早期にご参加いただいた方への特別なオファーもご用意しています。ぜひご確認ください。
お待ちしております! :)
詳細を確認

セッション

この例では、人気のある gorilla/sessions パッケージを使用して、Go のセッション cookie にデータを格納する方法を紹介します。

Cookie とは、ユーザーのブラウザに格納される小さなデータの断片で、各リクエストでサーバーに送信されます。ここには、ユーザーが当社の Web サイトにログインしているかどうかや、実際にユーザーが誰であるか (システム内) などを格納できます。

この例では、認証されたユーザーのみが /secret ページで秘密のメッセージを表示できるようにします。アクセスするには、最初に /login にアクセスして、ログインするための有効なセッション Cookie を取得する必要があります。さらに /logout を使用して、秘密のメッセージへのアクセスを取り消すことができます。

// sessions.go
package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/sessions"
)

var (
    // key must be 16, 24 or 32 bytes long (AES-128, AES-192 or AES-256)
    key = []byte("super-secret-key")
    store = sessions.NewCookieStore(key)
)

func secret(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Check if user is authenticated
    if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
        http.Error(w, "Forbidden", http.StatusForbidden)
        return
    }

    // Print secret message
    fmt.Fprintln(w, "The cake is a lie!")
}

func login(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Authentication goes here
    // ...

    // Set user as authenticated
    session.Values["authenticated"] = true
    session.Save(r, w)
}

func logout(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Revoke users authentication
    session.Values["authenticated"] = false
    session.Save(r, w)
}

func main() {
    http.HandleFunc("/secret", secret)
    http.HandleFunc("/login", login)
    http.HandleFunc("/logout", logout)

    http.ListenAndServe(":8080", nil)
}
$ go run sessions.go

$ curl -s http://localhost:8080/secret
Forbidden

$ curl -s -I http://localhost:8080/login
Set-Cookie: cookie-name=MTQ4NzE5Mz...

$ curl -s --cookie "cookie-name=MTQ4NzE5Mz..." http://localhost:8080/secret
The cake is a lie!