Skip to content

Commit 5c03098

Browse files
committed
Add server tests
1 parent 794afb1 commit 5c03098

File tree

12 files changed

+348
-91
lines changed

12 files changed

+348
-91
lines changed

README.md

Lines changed: 29 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,78 @@
1-
基于Golang的OAuth2服务实现
2-
=======================
3-
4-
> 完全模块化、支持http/fasthttp的服务端处理、令牌存储支持redis/mongodb
1+
OAuth 2.0
2+
=========
3+
> [OAuth 2.0](http://oauth.net/2/) is the next evolution of the OAuth protocol which was originally created in late 2006.
54
65
[![GoDoc](https://godoc.org/gopkg.in/oauth2.v3?status.svg)](https://godoc.org/gopkg.in/oauth2.v3)
76
[![Go Report Card](https://goreportcard.com/badge/gopkg.in/oauth2.v3)](https://goreportcard.com/report/gopkg.in/oauth2.v3)
87

9-
获取
10-
----
8+
Quick Start
9+
-----------
10+
11+
### Download and install
1112

1213
``` bash
1314
$ go get -u gopkg.in/oauth2.v3/...
1415
```
1516

16-
HTTP服务端
17-
--------
17+
### Create file `server.go`
1818

1919
``` go
2020
package main
2121

2222
import (
23-
"log"
2423
"net/http"
2524

2625
"gopkg.in/oauth2.v3/manage"
2726
"gopkg.in/oauth2.v3/server"
28-
"gopkg.in/oauth2.v3/store/client"
2927
"gopkg.in/oauth2.v3/store/token"
3028
)
3129

3230
func main() {
3331
manager := manage.NewRedisManager(
3432
&token.RedisConfig{Addr: "192.168.33.70:6379"},
3533
)
36-
manager.MapClientStorage(client.NewTempStore())
3734
srv := server.NewServer(server.NewConfig(), manager)
38-
35+
srv.SetUserAuthorizationHandler(func(w http.ResponseWriter, r *http.Request) (userID string, err error) {
36+
// validation and to get the user id
37+
userID = "000000"
38+
return
39+
})
3940
http.HandleFunc("/authorize", func(w http.ResponseWriter, r *http.Request) {
40-
authReq, err := srv.GetAuthorizeRequest(r)
41-
if err != nil {
42-
http.Error(w, err.Error(), http.StatusBadRequest)
43-
return
44-
}
45-
// TODO: 登录验证、授权处理
46-
authReq.UserID = "000000"
47-
48-
err = srv.HandleAuthorizeRequest(w, authReq)
41+
err := srv.HandleAuthorizeRequest(w, r)
4942
if err != nil {
5043
http.Error(w, err.Error(), http.StatusBadRequest)
5144
}
5245
})
53-
5446
http.HandleFunc("/token", func(w http.ResponseWriter, r *http.Request) {
5547
err := srv.HandleTokenRequest(w, r)
5648
if err != nil {
5749
http.Error(w, err.Error(), http.StatusBadRequest)
5850
}
5951
})
60-
61-
log.Fatal(http.ListenAndServe(":9096", nil))
52+
http.ListenAndServe(":9096", nil)
6253
}
63-
64-
```
65-
66-
FastHTTP服务端
67-
-------------
68-
69-
``` go
70-
srv := server.NewFastServer(server.NewConfig(), manager)
71-
72-
fasthttp.ListenAndServe(":9096", func(ctx *fasthttp.RequestCtx) {
73-
switch string(ctx.Request.URI().Path()) {
74-
case "/authorize":
75-
authReq, err := srv.GetAuthorizeRequest(ctx)
76-
if err != nil {
77-
ctx.Error(err.Error(), 400)
78-
return
79-
}
80-
authReq.UserID = "000000"
81-
// TODO: 登录验证、授权处理
82-
err = srv.HandleAuthorizeRequest(ctx, authReq)
83-
if err != nil {
84-
ctx.Error(err.Error(), 400)
85-
}
86-
case "/token":
87-
err := srv.HandleTokenRequest(ctx)
88-
if err != nil {
89-
ctx.Error(err.Error(), 400)
90-
}
91-
}
92-
})
9354
```
9455

95-
测试
96-
----
97-
> [goconvey](https://github.com/smartystreets/goconvey)
56+
### Build and run
9857

9958
``` bash
100-
$ goconvey -port=9092
59+
$ go build server.go
60+
$ ./server
10161
```
10262

103-
范例
104-
----
63+
Features
64+
--------
65+
66+
* Based on the [RFC 6749](https://tools.ietf.org/html/rfc6749) implementation
67+
* Easy to use
68+
* Modularity
69+
* Flexible
70+
* Elegant
10571

106-
模拟授权码模式的测试范例,请查看[example](/example)
72+
Example
73+
-------
10774

75+
Simulation examples of authorization code model, please check [example](/example)
10876

10977
License
11078
-------

example/server/main.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package main
22

33
import (
4+
"fmt"
45
"log"
56
"net/http"
67

7-
"fmt"
8-
98
"gopkg.in/oauth2.v3"
109
"gopkg.in/oauth2.v3/manage"
1110
"gopkg.in/oauth2.v3/models"

generates/access_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
package generates
1+
package generates_test
22

33
import (
44
"testing"
55
"time"
66

77
"gopkg.in/oauth2.v3"
8+
"gopkg.in/oauth2.v3/generates"
89
"gopkg.in/oauth2.v3/models"
910

1011
. "github.com/smartystreets/goconvey/convey"
@@ -20,7 +21,7 @@ func TestAccess(t *testing.T) {
2021
UserID: "000000",
2122
CreateAt: time.Now(),
2223
}
23-
gen := NewAccessGenerate()
24+
gen := generates.NewAccessGenerate()
2425
access, refresh, err := gen.Token(data, true)
2526
So(err, ShouldBeNil)
2627
So(access, ShouldNotBeEmpty)

generates/authorize_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
package generates
1+
package generates_test
22

33
import (
44
"testing"
55
"time"
66

77
"gopkg.in/oauth2.v3"
8+
"gopkg.in/oauth2.v3/generates"
89
"gopkg.in/oauth2.v3/models"
910

1011
. "github.com/smartystreets/goconvey/convey"
@@ -20,7 +21,7 @@ func TestAuthorize(t *testing.T) {
2021
UserID: "000000",
2122
CreateAt: time.Now(),
2223
}
23-
gen := NewAuthorizeGenerate()
24+
gen := generates.NewAuthorizeGenerate()
2425
code, err := gen.Token(data)
2526
So(err, ShouldBeNil)
2627
So(code, ShouldNotBeEmpty)

manage/manage_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
package manage
1+
package manage_test
22

33
import (
44
"testing"
55

66
"gopkg.in/oauth2.v3"
77
"gopkg.in/oauth2.v3/generates"
8+
"gopkg.in/oauth2.v3/manage"
89
"gopkg.in/oauth2.v3/models"
910
"gopkg.in/oauth2.v3/store/client"
1011
"gopkg.in/oauth2.v3/store/token"
@@ -14,7 +15,7 @@ import (
1415

1516
func TestManager(t *testing.T) {
1617
Convey("Manager test", t, func() {
17-
manager := NewManager()
18+
manager := manage.NewManager()
1819

1920
manager.MapClientModel(models.NewClient())
2021
manager.MapTokenModel(models.NewToken())
@@ -51,11 +52,10 @@ func testManager(manager oauth2.Manager) {
5152
So(code, ShouldNotBeEmpty)
5253

5354
atParams := &oauth2.TokenGenerateRequest{
54-
ClientID: reqParams.ClientID,
55-
ClientSecret: "11",
56-
RedirectURI: reqParams.RedirectURI,
57-
Code: code,
58-
IsGenerateRefresh: true,
55+
ClientID: reqParams.ClientID,
56+
ClientSecret: "11",
57+
RedirectURI: reqParams.RedirectURI,
58+
Code: code,
5959
}
6060
ati, err := manager.GenerateAccessToken(oauth2.AuthorizationCode, atParams)
6161
So(err, ShouldBeNil)

manage/manager.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,10 @@ func (m *Manager) GenerateAccessToken(gt oauth2.GrantType, tgr *oauth2.TokenGene
223223
if gt == oauth2.AuthorizationCode {
224224
ti, terr := m.LoadAccessToken(tgr.Code)
225225
if terr != nil {
226+
if terr == errors.ErrInvalidAccessToken {
227+
err = errors.ErrInvalidAuthorizeCode
228+
return
229+
}
226230
err = terr
227231
return
228232
} else if ti.GetRedirectURI() != tgr.RedirectURI || ti.GetClientID() != tgr.ClientID {

manage/util_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
package manage
1+
package manage_test
22

33
import (
44
"testing"
55

6+
"gopkg.in/oauth2.v3/manage"
7+
68
. "github.com/smartystreets/goconvey/convey"
79
)
810

911
func TestUtil(t *testing.T) {
1012
Convey("Util Test", t, func() {
1113
Convey("ValidateURI Test", func() {
12-
err := ValidateURI("http://www.example.com", "http://www.example.com/cb?code=xxx")
14+
err := manage.ValidateURI("http://www.example.com", "http://www.example.com/cb?code=xxx")
1315
So(err, ShouldBeNil)
1416
})
1517
})

server/server.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,10 @@ func (s *Server) HandleAuthorizeRequest(w http.ResponseWriter, r *http.Request)
252252
ierr error
253253
)
254254
defer func() {
255+
if verr := recover(); verr != nil {
256+
err = fmt.Errorf("%v", verr)
257+
return
258+
}
255259
data := s.GetErrorData(rerr, ierr)
256260
if data != nil {
257261
if req == nil {
@@ -303,8 +307,10 @@ func (s *Server) ValidationTokenRequest(r *http.Request) (gt oauth2.GrantType, t
303307
ierr = err
304308
return
305309
}
306-
tgr.ClientID = clientID
307-
tgr.ClientSecret = clientSecret
310+
tgr = &oauth2.TokenGenerateRequest{
311+
ClientID: clientID,
312+
ClientSecret: clientSecret,
313+
}
308314
switch gt {
309315
case oauth2.AuthorizationCode:
310316
tgr.RedirectURI = r.Form.Get("redirect_uri")
@@ -425,7 +431,7 @@ func (s *Server) GetTokenData(ti oauth2.TokenInfo) (data map[string]interface{})
425431
data = map[string]interface{}{
426432
"access_token": ti.GetAccess(),
427433
"token_type": s.Config.TokenType,
428-
"expires_in": ti.GetAccessExpiresIn() / time.Second,
434+
"expires_in": int64(ti.GetAccessExpiresIn() / time.Second),
429435
}
430436
if scope := ti.GetScope(); scope != "" {
431437
data["scope"] = scope
@@ -444,6 +450,10 @@ func (s *Server) HandleTokenRequest(w http.ResponseWriter, r *http.Request) (err
444450
ierr error
445451
)
446452
defer func() {
453+
if verr := recover(); verr != nil {
454+
err = fmt.Errorf("%v", verr)
455+
return
456+
}
447457
data := s.GetErrorData(rerr, ierr)
448458
if data == nil {
449459
data = s.GetTokenData(ti)

0 commit comments

Comments
 (0)