Skip to content
This repository was archived by the owner on Sep 2, 2024. It is now read-only.

Commit 20253be

Browse files
committed
removed membership local volatile and better use os state in OAuth flow
1 parent c3d10b8 commit 20253be

File tree

3 files changed

+32
-17
lines changed

3 files changed

+32
-17
lines changed

membership.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
)
1919

2020
type membership struct {
21-
volatile internal.Volatilizer
21+
//volatile internal.Volatilizer
2222
}
2323

2424
func (m *membership) emailExists(w http.ResponseWriter, r *http.Request) {
@@ -83,11 +83,11 @@ func (m *membership) login(w http.ResponseWriter, r *http.Request) {
8383

8484
//TODO: find a good way to find all occurences of those two
8585
// and make them easily callable via a shared function
86-
if err := m.volatile.SetTyped(token, auth); err != nil {
86+
if err := volatile.SetTyped(token, auth); err != nil {
8787
http.Error(w, err.Error(), http.StatusInternalServerError)
8888
return
8989
}
90-
if err := m.volatile.SetTyped("base:"+token, conf); err != nil {
90+
if err := volatile.SetTyped("base:"+token, conf); err != nil {
9191
http.Error(w, err.Error(), http.StatusInternalServerError)
9292
return
9393
}
@@ -151,11 +151,11 @@ func (m *membership) register(w http.ResponseWriter, r *http.Request) {
151151
Token: tok.Token,
152152
}
153153

154-
if err := m.volatile.SetTyped(token, auth); err != nil {
154+
if err := volatile.SetTyped(token, auth); err != nil {
155155
http.Error(w, err.Error(), http.StatusInternalServerError)
156156
return
157157
}
158-
if err := m.volatile.SetTyped("base:"+token, conf); err != nil {
158+
if err := volatile.SetTyped("base:"+token, conf); err != nil {
159159
http.Error(w, err.Error(), http.StatusInternalServerError)
160160
return
161161
}
@@ -212,7 +212,7 @@ func (m *membership) createUser(dbName, accountID, email, password string, role
212212
Role: role,
213213
Token: tok.Token,
214214
}
215-
if err := m.volatile.SetTyped(token, auth); err != nil {
215+
if err := volatile.SetTyped(token, auth); err != nil {
216216
return nil, tok, err
217217
}
218218

@@ -394,7 +394,7 @@ func (m *membership) sudoGetTokenFromAccountID(w http.ResponseWriter, r *http.Re
394394
Role: tok.Role,
395395
Token: tok.Token,
396396
}
397-
if err := m.volatile.SetTyped(token, auth); err != nil {
397+
if err := volatile.SetTyped(token, auth); err != nil {
398398
http.Error(w, err.Error(), http.StatusInternalServerError)
399399
return
400400
}

oauth.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (el *ExternalLogins) login() http.Handler {
7676
}
7777

7878
next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
79-
sess, err := p.BeginAuth(reqID)
79+
sess, err := p.BeginAuth(el.toState(provider, reqID, conf.ID))
8080
if err != nil {
8181
http.Error(w, err.Error(), http.StatusInternalServerError)
8282
return
@@ -102,13 +102,15 @@ func (el *ExternalLogins) login() http.Handler {
102102

103103
func (el *ExternalLogins) callback() http.Handler {
104104
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
105-
provider := r.URL.Query().Get("provider")
106-
reqID := r.URL.Query().Get("reqid")
105+
provider, reqID, baseID := el.fromState(el.getState(r))
107106

108107
var conf internal.BaseConfig
109108
if err := volatile.GetTyped("oauth_"+reqID, &conf); err != nil {
110109
http.Error(w, err.Error(), http.StatusBadRequest)
111110
return
111+
} else if conf.ID != baseID {
112+
http.Error(w, "invalid request", http.StatusBadRequest)
113+
return
112114
}
113115

114116
customer, err := datastore.FindAccount(conf.CustomerID)
@@ -237,7 +239,7 @@ func (el *ExternalLogins) signIn(dbName, email string) (sessionToken string, err
237239
func (el *ExternalLogins) signUp(dbName, provider, email, accessToken string) (sessionToken string, err error) {
238240
pw := fmt.Sprintf("%s:%s", provider, accessToken)
239241

240-
b, _, err := el.membership.createAccountAndUser(dbName, email, pw, 100)
242+
b, _, err := el.membership.createAccountAndUser(dbName, email, pw, 0)
241243
if err != nil {
242244
return
243245
}
@@ -248,11 +250,8 @@ func (el *ExternalLogins) signUp(dbName, provider, email, accessToken string) (s
248250

249251
func (el *ExternalLogins) getProvider(dbID, provider, reqID string, info internal.OAuthConfig) (p goth.Provider, err error) {
250252
callbackURL := fmt.Sprintf(
251-
"%s/oauth/callback?provider=%s&reqid=%s&sbpk=%s",
253+
"%s/oauth/callback",
252254
config.Current.AppURL,
253-
provider,
254-
reqID,
255-
dbID,
256255
)
257256

258257
if provider == OAuthProviderTwitter {
@@ -272,3 +271,19 @@ func (*ExternalLogins) getState(r *http.Request) string {
272271
}
273272
return params.Get("state")
274273
}
274+
275+
func (*ExternalLogins) toState(provider, reqID, baseID string) string {
276+
return fmt.Sprintf("%s_%s_%s", provider, reqID, baseID)
277+
}
278+
279+
func (*ExternalLogins) fromState(state string) (provider, reqID, baseID string) {
280+
parts := strings.Split(state, "_")
281+
if len(parts) != 3 {
282+
return
283+
}
284+
285+
provider = parts[0]
286+
reqID = parts[1]
287+
baseID = parts[2]
288+
return
289+
}

server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func Start(c config.AppConfig) {
138138
middleware.RequireRoot(datastore),
139139
}
140140

141-
m := &membership{volatile: volatile}
141+
m := &membership{}
142142

143143
http.Handle("/login", middleware.Chain(http.HandlerFunc(m.login), pubWithDB...))
144144
http.Handle("/register", middleware.Chain(http.HandlerFunc(m.register), pubWithDB...))
@@ -151,7 +151,7 @@ func Start(c config.AppConfig) {
151151
// oauth handlers
152152
el := &ExternalLogins{}
153153
http.Handle("/oauth/login", middleware.Chain(el.login(), pubWithDB...))
154-
http.Handle("/oauth/callback/", middleware.Chain(el.callback(), pubWithDB...))
154+
http.Handle("/oauth/callback/", middleware.Chain(el.callback(), stdPub...))
155155
http.Handle("/oauth/get-user", middleware.Chain(http.HandlerFunc(el.getUser), pubWithDB...))
156156

157157
http.Handle("/sudogettoken/", middleware.Chain(http.HandlerFunc(m.sudoGetTokenFromAccountID), stdRoot...))

0 commit comments

Comments
 (0)