Google App EngineでGoogle認証

Contents
  1. はじめに
  2. hello.go
  3. どうなる
  4. デプロイすると

はじめに

前回 の続きで Google 認証をさせるアプリを作る チュートリアル をやりました 💪

hello.go
package hello

import (
    "fmt"
    "net/http"

    "appengine"
    "appengine/user"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    u := user.Current(c)
    if u == nil {
        url, err := user.LoginURL(c, r.URL.String())
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        w.Header().Set("Location", url)
        w.WriteHeader(http.StatusFound)
        return
    }
    fmt.Fprintf(w, "Hello, %v!", u)
}

appengine.Context は現在のリクエストに関連する context.Context を返す。

どうでもいいけど ソース 読んでたらコメントがナイスだった。in-flight HTTP request ✈️

// NewContext returns a context for an in-flight HTTP request.
// This function is cheap.
func NewContext(req *http.Request) context.Context {
	return WithContext(context.Background(), req)
}

user.Current は現在ログインしてるユーザが取れるらしい。ほう。

user.LoginURL はログイン URL を返す。第 2 引数はログイン後のリダイレクト先。

どうなる

起動して http://localhost:8080/にアクセスしてみると、こうなった。

スクリーンショット 2016-10-05 21.40.10.png (54.9 kB)

Login してみるとこんな感じ。

スクリーンショット 2016-10-05 21.40.57.png (17.7 kB)

デプロイすると

いやいやさすがにこれは、と思ったけど、やっぱりこれは開発用の機能らしい。

デプロイすると Google のアカウントを選ぶ画面にリダイレクトされた。

スクリーンショット_2016-10-05_21_44_19.png (172.4 kB)

アカウントを選ぶとこうなる。

スクリーンショット 2016-10-05 21.44.33.png (20.2 kB)

Google にログインしてない状態でアクセスすると、Google のおなじみのログイン画面がでてくる。

なんかよくわからんまま Google 認証できた。すごい 😳