간단한 Chat App 구현하기 (2) - 인증 처리(세션 관리)
14 Mar 2018 | Go세션 관리
다음 패키지들을 이용해서 세션을 관리합니다.
각 패키지 설치는 다음 명령어를 이용해서 할 수 있습니다.
$ go get github.com/goincremental/negroni-sessions $ go get github.com/stretchr/gomniauth $ go get github.com/stretchr/gomniauth/providers/google
main.go
세션 관리를 위해 세션 핸들러를 등록합니다.
package main
import (
"github.com/unrolled/render"
"github.com/julienschmidt/httprouter"
"net/http"
"github.com/urfave/negroni"
"github.com/goincremental/negroni-sessions/cookiestore"
"github.com/goincremental/negroni-sessions"
)
var renderer *render.Render
func init() {
renderer = render.New()
}
const (
sessionKey = "simple-chat-app-session"
sessionSecret = "simple-chat-app-session-secret"
)
func main() {
router := httprouter.New()
router.GET("/", func(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
renderer.HTML(w, http.StatusOK, "index", map[string]string{"title": "Simple Chat App"})
})
n := negroni.Classic()
store := cookiestore.New([]byte(sessionSecret))
n.Use(sessions.Sessions(sessionKey, store))
n.UseHandler(router)
n.Run(":3000")
}
session.go
package main
import (
"time"
"net/http"
"github.com/goincremental/negroni-sessions"
"encoding/json"
)
const (
currentUserKey = "oauth2_current_user"
sessionDuration = time.Hour
)
type User struct {
Uid string `json:"uid"`
Name string `json:"name"`
Email string `json:"user"`
AvatarUrl string `json:"avatar_url"`
Expired time.Time `json:"expired"'`
}
func (u *User) Valid() bool {
return u.Expired.Sub(time.Now()) > 0
}
func (u *User) Refresh() {
u.Expired = time.Now().Add(sessionDuration)
}
func GetCurrentUser(r *http.Request) *User {
s := sessions.GetSession(r)
if s.Get(currentUserKey) == nil {
return nil
}
data := s.Get(currentUserKey).([]byte)
var u User
json.Unmarshal(data, &u)
return &u
}
func SetCurrentUser(r *http.Request, u *User) {
if u != nil {
u.Refresh()
}
s := sessions.GetSession(r)
val, _ := json.Marshal(u)
s.Set(currentUserKey, val)
}