LoginSignup
8
5

More than 5 years have passed since last update.

Go Web Examplesの和訳(Sessions)

Last updated at Posted at 2018-12-09

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!

参照

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5