simplify providers initialization

This commit is contained in:
Umputun
2018-05-24 17:49:06 -05:00
parent e54ab6778e
commit 1d3900ffa7
2 changed files with 19 additions and 23 deletions
+15 -19
View File
@@ -11,7 +11,7 @@ import (
"net/http"
"time"
jwt "github.com/dgrijalva/jwt-go"
"github.com/dgrijalva/jwt-go"
"github.com/go-chi/chi"
"github.com/go-chi/render"
"golang.org/x/oauth2"
@@ -23,26 +23,24 @@ import (
// Provider represents oauth2 provider
type Provider struct {
Params
Name string
RedirectURL string
InfoURL string
Endpoint oauth2.Endpoint
Scopes []string
MapUser func(userData, []byte) store.User // map info from InfoURL to User
Secret string
avatarProxy *proxy.Avatar
conf *oauth2.Config
jwtService *JWT
}
// Params to make initialized and ready to use provider
type Params struct {
Cid string
Csecret string
RemarkURL string
AvatarProxy *proxy.Avatar
JwtService *JWT
Secret string
Cid string
Csecret string
}
type userData map[string]interface{}
@@ -56,19 +54,17 @@ func (u userData) value(key string) string {
// newProvider makes auth for given provider
func initProvider(p Params, provider Provider) Provider {
log.Printf("[INFO] create %s auth, id=%s, redir: %s", provider.Name, p.Cid, provider.RedirectURL)
log.Printf("[INFO] create %s auth, id=%s, redir: %s", provider.Name, provider.Cid, provider.RedirectURL)
provider.Params = p
conf := oauth2.Config{
ClientID: p.Cid,
ClientSecret: p.Csecret,
ClientID: provider.Cid,
ClientSecret: provider.Csecret,
RedirectURL: provider.RedirectURL,
Scopes: provider.Scopes,
Endpoint: provider.Endpoint,
}
provider.conf = &conf
provider.avatarProxy = p.AvatarProxy
provider.jwtService = p.JwtService
return provider
}
@@ -98,7 +94,7 @@ func (p Provider) loginHandler(w http.ResponseWriter, r *http.Request) {
},
}
if err := p.jwtService.Set(w, &claims); err != nil {
if err := p.JwtService.Set(w, &claims); err != nil {
rest.SendErrorJSON(w, r, http.StatusInternalServerError, err, "failed to set jwt")
return
}
@@ -114,7 +110,7 @@ func (p Provider) loginHandler(w http.ResponseWriter, r *http.Request) {
// GET /callback
func (p Provider) authHandler(w http.ResponseWriter, r *http.Request) {
oauthClaims, err := p.jwtService.Get(r)
oauthClaims, err := p.JwtService.Get(r)
if err != nil {
rest.SendErrorJSON(w, r, http.StatusInternalServerError, err, "failed to get jwt")
return
@@ -160,8 +156,8 @@ func (p Provider) authHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("[DEBUG] got raw user info %+v", jData)
u := p.MapUser(jData, data)
if p.avatarProxy != nil {
if avatarURL, e := p.avatarProxy.Put(u); e == nil {
if p.AvatarProxy != nil {
if avatarURL, e := p.AvatarProxy.Put(u); e == nil {
u.Picture = avatarURL
} else {
log.Printf("[WARN] failed to proxy avatar, %s", e)
@@ -176,7 +172,7 @@ func (p Provider) authHandler(w http.ResponseWriter, r *http.Request) {
},
}
if err = p.jwtService.Set(w, authClaims); err != nil {
if err = p.JwtService.Set(w, authClaims); err != nil {
rest.SendErrorJSON(w, r, http.StatusInternalServerError, err, "failed to save user info")
return
}
@@ -193,7 +189,7 @@ func (p Provider) authHandler(w http.ResponseWriter, r *http.Request) {
// LogoutHandler - GET /logout
func (p Provider) LogoutHandler(w http.ResponseWriter, r *http.Request) {
p.jwtService.Reset(w)
p.JwtService.Reset(w)
log.Printf("[DEBUG] logout")
}
+4 -4
View File
@@ -78,8 +78,8 @@ func TestLogout(t *testing.T) {
}
func TestInitProvider(t *testing.T) {
params := Params{Cid: "cid", Csecret: "csecret", RemarkURL: "url"}
provider := Provider{Name: "test", RedirectURL: "redir", Secret: "123456"}
params := Params{RemarkURL: "url", Secret: "123456", Cid: "cid", Csecret: "csecret"}
provider := Provider{Name: "test", RedirectURL: "redir"}
res := initProvider(params, provider)
assert.Equal(t, "cid", res.conf.ClientID)
assert.Equal(t, "csecret", res.conf.ClientSecret)
@@ -108,8 +108,8 @@ func mockProvider(t *testing.T, loginPort, authPort int) (provider Provider, ts
return userInfo
},
}
provider = initProvider(Params{Cid: "cid", Csecret: "csecret", JwtService: NewJWT("12345", false, time.Hour)}, provider)
jwtServcie := NewJWT("12345", false, time.Hour)
provider = initProvider(Params{RemarkURL: "url", Secret: "123456", Cid: "cid", Csecret: "csecret", JwtService: jwtServcie}, provider)
ts = &http.Server{Addr: fmt.Sprintf(":%d", loginPort), Handler: provider.Routes()}