Go勉強会 Webアプリケーション編 #3 でやろうと思っている Go Web Examples: Sessions の和訳です。前の二つに比べればそんなに難しくないですね。
Sessions
この例では人気のある gorilla/sessions を使って Go でセッションクッキーにデータを保存する方法を見ていきましょう。
クッキーはユーザーのブラウザに保存され私たちのサーバーに送られてくる小さなデータです。クッキーの中には例えばユーザーが私たちのウェブサイトにログインしているかどうかを保存することができ、そのユーザーが(私たちのシステム内において)誰なのかわかります。
この例では認証済みのユーザーにだけ /secret
にある秘密のメッセージを見ることを許可します。そこへアクセスしたいユーザーは初めに有効なセッションクッキーを取得するため /login
にアクセスしなければなりません。セッションクッキーにはそのユーザーがログインしたことが記録されます。加えて、秘密のメッセージへのアクセスを無効にするため /logout
にアクセスすることができます。
// sessions.go
package main
import (
"fmt"
"net/http"
"github.com/gorilla/sessions"
)
var (
// キーの長さは 16, 24, 32 バイトのいずれかでなければならない。
// (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")
// 認証済みかどうかチェックする。
if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
// 秘密のメッセージを表示する。
fmt.Fprintln(w, "The cake is a lie!")
}
func login(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "cookie-name")
// ここで認証を行う。
// ...
// ユーザーを認証済みに設定する。
session.Values["authenticated"] = true
session.Save(r, w)
}
func logout(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "cookie-name")
// 認証を無効にする。
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!