간단한 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)
}
  