simplify providers initialization
This commit is contained in:
+15
-19
@@ -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")
|
||||
}
|
||||
|
||||
|
||||
@@ -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()}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user