Skip to content

Commit fe41d7b

Browse files
committed
Fixed optional for redirect_uri under code authorization
1 parent 770bbd9 commit fe41d7b

File tree

3 files changed

+54
-22
lines changed

3 files changed

+54
-22
lines changed

manage/manage_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func TestManager(t *testing.T) {
1818
manager.MustTokenStorage(store.NewMemoryTokenStore())
1919

2020
clientStore := store.NewClientStore()
21-
clientStore.Set("1", &models.Client{
21+
_ = clientStore.Set("1", &models.Client{
2222
ID: "1",
2323
Secret: "11",
2424
Domain: "http://localhost",

manage/manager.go

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,11 @@ func (m *Manager) GenerateAuthToken(rt oauth2.ResponseType, tgr *oauth2.TokenGen
144144
cli, err := m.GetClient(tgr.ClientID)
145145
if err != nil {
146146
return
147-
} else if verr := m.validateURI(cli.GetDomain(), tgr.RedirectURI); verr != nil {
148-
err = verr
149-
return
147+
} else if tgr.RedirectURI != "" {
148+
if verr := m.validateURI(cli.GetDomain(), tgr.RedirectURI); verr != nil {
149+
err = verr
150+
return
151+
}
150152
}
151153

152154
ti := models.NewToken()
@@ -236,17 +238,46 @@ func (m *Manager) delAuthorizationCode(code string) (err error) {
236238
return
237239
}
238240

241+
// get and delete authorization code data
242+
func (m *Manager) getAndDelAuthorizationCode(tgr *oauth2.TokenGenerateRequest) (info oauth2.TokenInfo, err error) {
243+
code := tgr.Code
244+
ti, err := m.getAuthorizationCode(code)
245+
if err != nil {
246+
return
247+
} else if ti.GetClientID() != tgr.ClientID {
248+
err = errors.ErrInvalidAuthorizeCode
249+
return
250+
} else if codeURI := ti.GetRedirectURI(); codeURI != "" && codeURI != tgr.RedirectURI {
251+
err = errors.ErrInvalidAuthorizeCode
252+
return
253+
}
254+
255+
err = m.delAuthorizationCode(code)
256+
if err != nil {
257+
return
258+
}
259+
info = ti
260+
return
261+
}
262+
239263
// GenerateAccessToken generate the access token
240264
func (m *Manager) GenerateAccessToken(gt oauth2.GrantType, tgr *oauth2.TokenGenerateRequest) (accessToken oauth2.TokenInfo, err error) {
241-
if gt == oauth2.AuthorizationCode {
242-
ti, terr := m.getAuthorizationCode(tgr.Code)
243-
if terr != nil {
244-
err = terr
245-
return
246-
} else if ti.GetRedirectURI() != tgr.RedirectURI || ti.GetClientID() != tgr.ClientID {
247-
err = errors.ErrInvalidAuthorizeCode
265+
cli, err := m.GetClient(tgr.ClientID)
266+
if err != nil {
267+
return
268+
} else if tgr.ClientSecret != cli.GetSecret() {
269+
err = errors.ErrInvalidClient
270+
return
271+
} else if tgr.RedirectURI != "" {
272+
if verr := m.validateURI(cli.GetDomain(), tgr.RedirectURI); verr != nil {
273+
err = verr
248274
return
249-
} else if verr := m.delAuthorizationCode(tgr.Code); verr != nil {
275+
}
276+
}
277+
278+
if gt == oauth2.AuthorizationCode {
279+
ti, verr := m.getAndDelAuthorizationCode(tgr)
280+
if verr != nil {
250281
err = verr
251282
return
252283
}
@@ -257,14 +288,6 @@ func (m *Manager) GenerateAccessToken(gt oauth2.GrantType, tgr *oauth2.TokenGene
257288
}
258289
}
259290

260-
cli, err := m.GetClient(tgr.ClientID)
261-
if err != nil {
262-
return
263-
} else if tgr.ClientSecret != cli.GetSecret() {
264-
err = errors.ErrInvalidClient
265-
return
266-
}
267-
268291
ti := models.NewToken()
269292
ti.SetClientID(tgr.ClientID)
270293
ti.SetUserID(tgr.UserID)

server/server.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,7 @@ func (s *Server) ValidationAuthorizeRequest(r *http.Request) (req *AuthorizeRequ
148148
redirectURI := r.FormValue("redirect_uri")
149149
clientID := r.FormValue("client_id")
150150
if !(r.Method == "GET" || r.Method == "POST") ||
151-
clientID == "" ||
152-
redirectURI == "" {
151+
clientID == "" {
153152
err = errors.ErrInvalidRequest
154153
return
155154
}
@@ -282,6 +281,16 @@ func (s *Server) HandleAuthorizeRequest(w http.ResponseWriter, r *http.Request)
282281
return
283282
}
284283

284+
// If the redirect URI is empty, the default domain provided by the client is used.
285+
if req.RedirectURI == "" {
286+
client, verr := s.Manager.GetClient(req.ClientID)
287+
if verr != nil {
288+
err = verr
289+
return
290+
}
291+
req.RedirectURI = client.GetDomain()
292+
}
293+
285294
err = s.redirect(w, req, s.GetAuthorizeData(req.ResponseType, ti))
286295
return
287296
}

0 commit comments

Comments
 (0)