Go×GAE×Docker로 만드는 GoogleOAuth 인증 앱
곧바로도 코드를 보고 싶은 분은 이쪽을 부디.
GAE와 dep의 Docker 환경 정돈
먼저 DockerCompose를 설치합시다.
공식 사이트 를 참고로 설치해 주세요.
설치가 끝나면 Docker 이미지와 Compose 파일을 준비합니다.
이번에는 GAE 기반 애플리케이션을 만들고 싶기 때문에 mercari 씨가 제공해 주는 GEA의 Docker 이미지를 이용합니다.
게다가, 벤더링의 툴에는 「dep」를 이용하므로, 좋은 느낌의 Docker 이미지를 찾아 와 Compose 파일에 추가합니다.
docker-compose.yamlversion: '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.ymlapplication: 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.gopackage 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.gopackage 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로 천이합니다.
Reference
이 문제에 관하여(Go×GAE×Docker로 만드는 GoogleOAuth 인증 앱), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gotokatsuya/items/7f3bd1f71aa825264851
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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로 천이합니다.
Reference
이 문제에 관하여(Go×GAE×Docker로 만드는 GoogleOAuth 인증 앱), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gotokatsuya/items/7f3bd1f71aa825264851
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// $ docker-compose run --rm dep init
$ docker-compose up app
Reference
이 문제에 관하여(Go×GAE×Docker로 만드는 GoogleOAuth 인증 앱), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gotokatsuya/items/7f3bd1f71aa825264851텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)