Skip to content

Commit a0ff18c

Browse files
田念收田念收
authored andcommitted
Fixed server implementation;Improve the example
1 parent c22d6a9 commit a0ff18c

File tree

4 files changed

+181
-54
lines changed

4 files changed

+181
-54
lines changed

example/server/main.go

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,26 @@ import (
55
"log"
66
"net/http"
77

8-
"gopkg.in/oauth2.v3"
8+
"net/url"
9+
10+
"os"
11+
12+
"github.com/gorilla/sessions"
913
"gopkg.in/oauth2.v3/manage"
1014
"gopkg.in/oauth2.v3/models"
1115
"gopkg.in/oauth2.v3/server"
1216
"gopkg.in/oauth2.v3/store/client"
1317
"gopkg.in/oauth2.v3/store/token"
1418
)
1519

20+
var (
21+
sessionStore *sessions.CookieStore
22+
)
23+
1624
func main() {
25+
// Create the session store
26+
sessionStore = sessions.NewCookieStore([]byte("123456"))
27+
1728
manager := manage.NewRedisManager(
1829
&token.RedisConfig{Addr: "192.168.33.70:6379"},
1930
)
@@ -25,15 +36,15 @@ func main() {
2536
}))
2637

2738
srv := server.NewServer(server.NewConfig(), manager)
28-
srv.SetAllowedResponseType(oauth2.Code)
29-
srv.SetAllowedGrantType(oauth2.AuthorizationCode)
39+
40+
srv.SetUserAuthorizationHandler(userAuthorizeHandler)
41+
3042
srv.SetErrorHandler(func(err error) {
3143
fmt.Println("OAuth2 Error:", err.Error())
3244
})
33-
srv.SetUserAuthorizationHandler(func(w http.ResponseWriter, r *http.Request) (userID string, err error) {
34-
userID = "000000"
35-
return
36-
})
45+
46+
http.HandleFunc("/login", loginHandler)
47+
http.HandleFunc("/auth", authHandler)
3748

3849
http.HandleFunc("/authorize", func(w http.ResponseWriter, r *http.Request) {
3950
err := srv.HandleAuthorizeRequest(w, r)
@@ -52,3 +63,60 @@ func main() {
5263
log.Println("Server is running at 9096 port.")
5364
log.Fatal(http.ListenAndServe(":9096", nil))
5465
}
66+
67+
func userAuthorizeHandler(w http.ResponseWriter, r *http.Request) (userID string, err error) {
68+
us, err := sessionStore.Get(r, "user")
69+
if err != nil {
70+
return
71+
}
72+
if us.IsNew {
73+
r.ParseForm()
74+
fs, _ := sessionStore.Get(r, "form")
75+
fs.Values["Form"] = r.Form
76+
w.Header().Set("Location", "/login")
77+
w.WriteHeader(http.StatusFound)
78+
return
79+
}
80+
userID = us.Values["UserID"].(string)
81+
return
82+
}
83+
84+
func loginHandler(w http.ResponseWriter, r *http.Request) {
85+
if r.Method == "POST" {
86+
us, _ := sessionStore.Get(r, "user")
87+
us.Values["UserID"] = "000000"
88+
us.Save(r, w)
89+
w.Header().Set("Location", "/auth")
90+
w.WriteHeader(http.StatusFound)
91+
return
92+
}
93+
outputHTML(w, r, "static/login.html")
94+
}
95+
96+
func authHandler(w http.ResponseWriter, r *http.Request) {
97+
us, _ := sessionStore.Get(r, "user")
98+
if us.IsNew {
99+
w.Header().Set("Location", "/login")
100+
w.WriteHeader(http.StatusFound)
101+
return
102+
}
103+
if r.Method == "POST" {
104+
fs, _ := sessionStore.Get(r, "form")
105+
values := fs.Values["Form"].(url.Values)
106+
w.Header().Set("Location", "/authorize?"+values.Encode())
107+
w.WriteHeader(http.StatusFound)
108+
return
109+
}
110+
outputHTML(w, r, "static/auth.html")
111+
}
112+
113+
func outputHTML(w http.ResponseWriter, req *http.Request, filename string) {
114+
file, err := os.Open(filename)
115+
if err != nil {
116+
http.Error(w, err.Error(), 500)
117+
return
118+
}
119+
defer file.Close()
120+
fi, _ := file.Stat()
121+
http.ServeContent(w, req, file.Name(), fi.ModTime(), file)
122+
}

example/server/static/auth.html

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8">
6+
<title>Auth</title>
7+
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
8+
<script src="//code.jquery.com/jquery-2.2.4.min.js"></script>
9+
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
10+
</head>
11+
12+
<body>
13+
<div class="container">
14+
<div class="jumbotron">
15+
<form action="/auth" method="POST">
16+
<h1>The user authorization!</h1>
17+
<p>...</p>
18+
<p><button type="submit" class="btn btn-danger btn-lg">Authorize</button></p>
19+
</form>
20+
</div>
21+
</div>
22+
</body>
23+
24+
</html>

example/server/static/login.html

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8">
6+
<title>Login</title>
7+
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
8+
<script src="//code.jquery.com/jquery-2.2.4.min.js"></script>
9+
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
10+
</head>
11+
12+
<body>
13+
<div class="container">
14+
<h1>Login</h1>
15+
<form action="/login" method="POST">
16+
<div class="form-group">
17+
<label for="username">User Name</label>
18+
<input type="text" class="form-control" name="username" placeholder="Please enter your user name">
19+
</div>
20+
<div class="form-group">
21+
<label for="password">Password</label>
22+
<input type="password" class="form-control" name="password" placeholder="Please enter your password">
23+
</div>
24+
<button type="submit" class="btn btn-primary">Submit</button>
25+
</form>
26+
</div>
27+
</body>
28+
29+
</html>

server/server.go

Lines changed: 53 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,7 @@ func (s *Server) ValidationAuthorizeRequest(r *http.Request) (req *AuthorizeRequ
126126
// GetAuthorizeToken Get authorization token(code)
127127
func (s *Server) GetAuthorizeToken(req *AuthorizeRequest) (ti oauth2.TokenInfo, rerr, ierr error) {
128128
if req.RedirectURI == "" ||
129-
req.ClientID == "" ||
130-
req.UserID == "" {
129+
req.ClientID == "" {
131130
rerr = errors.ErrInvalidRequest
132131
return
133132
} else if req.ResponseType == "" {
@@ -231,9 +230,6 @@ func (s *Server) GetErrorData(rerr, ierr error) (data map[string]interface{}) {
231230
err = rerr
232231
ierr = rerr
233232
}
234-
if err == nil {
235-
return
236-
}
237233
if fn := s.ErrorHandler; fn != nil {
238234
s.ErrorHandler(err)
239235
}
@@ -243,47 +239,52 @@ func (s *Server) GetErrorData(rerr, ierr error) (data map[string]interface{}) {
243239
return
244240
}
245241

242+
func (s *Server) resRedirectError(w http.ResponseWriter, req *AuthorizeRequest, rerr, ierr error) (err error) {
243+
if req == nil {
244+
err = ierr
245+
return
246+
}
247+
err = s.resRedirect(w, req, s.GetErrorData(rerr, ierr))
248+
return
249+
}
250+
251+
func (s *Server) resRedirect(w http.ResponseWriter, req *AuthorizeRequest, data map[string]interface{}) (err error) {
252+
uri, verr := s.GetRedirectURI(req, data)
253+
if verr != nil {
254+
err = verr
255+
return
256+
}
257+
w.Header().Set("Location", uri)
258+
w.WriteHeader(302)
259+
return
260+
}
261+
246262
// HandleAuthorizeRequest The authorization request handling
247263
func (s *Server) HandleAuthorizeRequest(w http.ResponseWriter, r *http.Request) (err error) {
248-
var (
249-
ti oauth2.TokenInfo
250-
req *AuthorizeRequest
251-
rerr error
252-
ierr error
253-
)
254264
defer func() {
255265
if verr := recover(); verr != nil {
256266
err = fmt.Errorf("%v", verr)
257-
return
258-
}
259-
data := s.GetErrorData(rerr, ierr)
260-
if data != nil {
261-
if req == nil {
262-
err = ierr
263-
return
264-
}
265-
} else {
266-
data = s.GetAuthorizeData(req.ResponseType, ti)
267267
}
268-
uri, verr := s.GetRedirectURI(req, data)
269-
if verr != nil {
270-
err = verr
271-
return
272-
}
273-
w.Header().Set("Location", uri)
274-
w.WriteHeader(302)
275268
}()
276-
req, rerr, ierr = s.ValidationAuthorizeRequest(r)
269+
req, rerr, ierr := s.ValidationAuthorizeRequest(r)
277270
if rerr != nil || ierr != nil {
271+
err = s.resRedirectError(w, req, rerr, ierr)
278272
return
279273
}
280274
userID, err := s.UserAuthorizationHandler(w, r)
281275
if err != nil {
282-
ierr = err
276+
err = s.resRedirectError(w, req, nil, err)
277+
return
278+
} else if userID == "" {
283279
return
284280
}
285281
req.UserID = userID
286-
ti, rerr, ierr = s.GetAuthorizeToken(req)
282+
ti, rerr, ierr := s.GetAuthorizeToken(req)
283+
if rerr != nil || ierr != nil {
284+
err = s.resRedirectError(w, req, rerr, ierr)
285+
return
286+
}
287+
err = s.resRedirect(w, req, s.GetAuthorizeData(req.ResponseType, ti))
287288
return
288289
}
289290

@@ -442,32 +443,37 @@ func (s *Server) GetTokenData(ti oauth2.TokenInfo) (data map[string]interface{})
442443
return
443444
}
444445

446+
func (s *Server) resTokenError(w http.ResponseWriter, rerr, ierr error) (err error) {
447+
err = s.resToken(w, s.GetErrorData(rerr, ierr))
448+
return
449+
}
450+
451+
func (s *Server) resToken(w http.ResponseWriter, data map[string]interface{}) (err error) {
452+
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
453+
w.Header().Set("Cache-Control", "no-store")
454+
w.Header().Set("Pragma", "no-cache")
455+
w.WriteHeader(http.StatusOK)
456+
err = json.NewEncoder(w).Encode(data)
457+
return
458+
}
459+
445460
// HandleTokenRequest The token request handling
446461
func (s *Server) HandleTokenRequest(w http.ResponseWriter, r *http.Request) (err error) {
447-
var (
448-
ti oauth2.TokenInfo
449-
rerr error
450-
ierr error
451-
)
452462
defer func() {
453463
if verr := recover(); verr != nil {
454464
err = fmt.Errorf("%v", verr)
455-
return
456465
}
457-
data := s.GetErrorData(rerr, ierr)
458-
if data == nil {
459-
data = s.GetTokenData(ti)
460-
}
461-
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
462-
w.Header().Set("Cache-Control", "no-store")
463-
w.Header().Set("Pragma", "no-cache")
464-
w.WriteHeader(http.StatusOK)
465-
err = json.NewEncoder(w).Encode(data)
466466
}()
467467
gt, tgr, rerr, ierr := s.ValidationTokenRequest(r)
468468
if rerr != nil || ierr != nil {
469+
err = s.resTokenError(w, rerr, ierr)
470+
return
471+
}
472+
ti, rerr, ierr := s.GetAccessToken(gt, tgr)
473+
if rerr != nil || ierr != nil {
474+
err = s.resTokenError(w, rerr, ierr)
469475
return
470476
}
471-
ti, rerr, ierr = s.GetAccessToken(gt, tgr)
477+
err = s.resToken(w, s.GetTokenData(ti))
472478
return
473479
}

0 commit comments

Comments
 (0)