
우선 signin html 과 css 파일을 다른 레퍼런스를 참조하여 대충 만들어두었다. (Github 파일 참고)
다음은 라우팅을 해주기 위해 app 폴더 안에 app.go 파일의 MakeHandler() 함수에 아래와 같이 추가해주었다.
func MakeHandler(filepath string) *AppHandler {
router := mux.NewRouter()
a := &AppHandler{
Handler: router,
db: model.NewDBHandler(filepath),
}
router.HandleFunc("/todos", a.getTodoListHandler).Methods("GET")
router.HandleFunc("/todos", a.addTodoHandler).Methods("POST")
router.HandleFunc("/todos/{id:[0-9]+}", a.removeTodoHandler).Methods("DELETE")
router.HandleFunc("/complete-todo/{id:[0-9]+}", a.completeTodoHandler).Methods("GET")
**router.HandleFunc("/auth/google/login", googleLoginHandler)
router.HandleFunc("/auth/google/callback", googleAuthCallback)**
router.HandleFunc("/", a.indexHandler)
return a
}
사용자가 구글 로그인을 하면, stateless 한 브라우저의 특성으로 인해 쿠키나 세션을 통해 로그인 상태를 지속시켜야 한다.
로그인은 OAuth 2.0 을 이용하고, 로그인 상태 저장은 세션을 통해 구현하기로 했다.
세션은 session ID 를 서버에서 발급하고, 쿠키에 넣어 클라이언트에 저장함으로써 사용자의 로그인 여부를 확인한다.
또한 쿠키는 해킹에 취약하기 때문에 쿠키의 내용은 암호화를 하여 전송한다. 마치 node 서버에서 jwt 패키지를 사용하는 것과 같은 원리이다.
세션 정보의 암호화 및 복호화를 위해 Gorilla/sessions 라는 패키지를 사용한다.
$ go get github.com/gorilla/sessions
package app
import ...
var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))