Go×GAE×Docker로 만드는 GoogleOAuth 인증 앱

14855 단어 5GAE도커
Docker로 로컬 환경을 편하게 정리하면서 GAE를 기반으로 한 앱 개발이 가능하면 최고다. 라고 항상 생각하고 있었으므로, 이번은 그것에 대해 쓰면서, 실천적인 GoogleOAuth 인증의 앱을 만들어 가고 싶습니다.

곧바로도 코드를 보고 싶은 분은 이쪽을 부디.

GAE와 dep의 Docker 환경 정돈



먼저 DockerCompose를 설치합시다.

공식 사이트 를 참고로 설치해 주세요.

설치가 끝나면 Docker 이미지와 Compose 파일을 준비합니다.

이번에는 GAE 기반 애플리케이션을 만들고 싶기 때문에 mercari 씨가 제공해 주는 GEA의 Docker 이미지를 이용합니다.

게다가, 벤더링의 툴에는 「dep」를 이용하므로, 좋은 느낌의 Docker 이미지를 찾아 와 Compose 파일에 추가합니다.

docker-compose.yaml
version: '2'
services:
  app:
    image: mercari/appengine-go:1.8
    working_dir: /go/src/github.com/gotokatsuya/gae-google
    command: make serve-dev
    ports:
      - 8080:8080
      - 8000:8000
    volumes:
      - .:/go/src/github.com/gotokatsuya/gae-google
  dep:
    image: instrumentisto/dep:0.3.2
    working_dir: /go/src/github.com/gotokatsuya/gae-google
    volumes:
      - .:/go/src/github.com/gotokatsuya/gae-google

이러한 docker-compose.yml을 준비하는 것만으로 로컬 개발이 최고로 편해집니다.

GoogleOAuth 인증 앱 만들기



GoogleOAuth 인증 설정



코드를 작성하기 전에 GoogleOAuth를 설정하여 ClientID와 ClientSecret을 가져오고 RedirectURL을 설정합니다. 설정 방법은 공식 사이트 가 참고가 됩니다.

이 응용 프로그램에서 RedirectURL은 http://localhost:8080/auth/google/callback를 지정하십시오. ClientID와 ClientSecret는 app.yaml에 환경 변수로 설명합니다.

app.yml
application: gae-google
version: 1
runtime: go
api_version: go1.8
handlers:
- url: /.*
  script: _go_app
  secure: always
env_variables:
  AUTH_GOOGLE_CLIENT_ID: "xxx"
  AUTH_GOOGLE_CLIENT_SECRET: "xxx"
  AUTH_GOOGLE_REDIRECT_URL: "http://localhost:8080/auth/google/callback"

실제로 코드를 작성합니다.



우선은 Routing에서 만듭니다.

routes.go
package routes

import (
    "net/http"

    "github.com/gorilla/mux"
    "github.com/urfave/negroni"

    "github.com/gotokatsuya/gae-google/app/controllers"
)

var (
    App = negroni.New(negroni.NewRecovery())
)

func init() {
    router := mux.NewRouter()

    authRouter := router.PathPrefix("/auth").Subrouter()
    authRouter.Path("/login").HandlerFunc(controllers.AuthLoginHandler).Methods(http.MethodGet)
    authRouter.Path("/google").HandlerFunc(controllers.AuthGoogleHandler).Methods(http.MethodGet)
    authRouter.Path("/google/callback").HandlerFunc(controllers.AuthGoogleCallbackHandler).Methods(http.MethodGet)

    App.UseHandler(router)
}

Contoller를 만들어갑니다.

controller.go
package controllers

import (
    "net/http"

    "google.golang.org/appengine"

    "github.com/gotokatsuya/gae-google/lib/template"

    "github.com/gotokatsuya/gae-google/app/services/auth"
)

// AuthLoginHandler HTMLをレンダリングする
func AuthLoginHandler(w http.ResponseWriter, r *http.Request) {
    template.Render.HTML(w, http.StatusOK, "auth/login", nil)
}

// AuthGoogleHandler Googleログイン
func AuthGoogleHandler(w http.ResponseWriter, r *http.Request) {
    svc := auth.NewService()
    // ランダム値を生成する
    state := svc.GenerateState()
    // CallbackするURLを生成する
    url := svc.GoogleAuthURL(state)
    // 生成したランダム値ををセッションに保存する
    svc.SaveState(state, r, w)
    http.Redirect(w, r, url, http.StatusFound)
}

// AuthGoogleCallbackHandler Googleログイン認証結果
func AuthGoogleCallbackHandler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    svc := auth.NewService()
    // セッションに保存されているランダム値と比較して一致するかどうか確認
    if r.URL.Query().Get("state") != svc.State(r) {
        http.Error(w, "invalid state", http.StatusUnauthorized)
        return
    }
    // GoogleログインしたユーザーのメールアドレスやIDを取得する
    if err := svc.GoogleLogin(ctx, r.URL.Query().Get("code")); err != nil {
        http.Error(w, err.Error(), http.StatusUnauthorized)
        return
    }

    // 適当な画面に飛ばす
    http.Redirect(w, r, "https://eure.jp", http.StatusFound)
}

DockerCompose로 시작하기



먼저 언급했듯이 이번에는 dep를 사용하여 종속 라이브러리를 벤더링합니다. 이번에는 vendor 폴더를 git 관리하고 있으므로 실행할 필요는 없습니다만, init를 실행하면 vendor 폴더가 만들어져 라이브러리를 벤더링해 줍니다.
// $ docker-compose run --rm dep init

GAE에 올리는 응용 프로그램을 시작합니다.
$ docker-compose up app

부팅 후 http://localhost:8080/auth/login에 액세스하면 이러한 간단한 화면이 렌더링됩니다.



'Google 로그인' 버튼을 누르면 로그인 화면이 시작됩니다. 로그인에 성공하면, 적당하게 설정한 eureka의 HP로 천이합니다.

좋은 웹페이지 즐겨찾기