Skip to content

Commit 222cdc9

Browse files
committed
Add server package
1 parent 6491a6a commit 222cdc9

File tree

11 files changed

+349
-31
lines changed

11 files changed

+349
-31
lines changed

generates/access_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestAccess(t *testing.T) {
2222
gen := NewAccessGenerate()
2323
access, refresh, err := gen.Token(data, true)
2424
So(err, ShouldBeNil)
25-
Println("\nAccess:", access)
26-
Println("Refresh:", refresh)
25+
So(access, ShouldNotBeEmpty)
26+
So(refresh, ShouldNotBeEmpty)
2727
})
2828
}

generates/authorize_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ func TestAuthorize(t *testing.T) {
2222
gen := NewAuthorizeGenerate()
2323
code, err := gen.Token(data)
2424
So(err, ShouldBeNil)
25-
Println("\nCode:", code)
25+
So(code, ShouldNotBeEmpty)
2626
})
2727
}

manage.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ type TokenGenerateRequest struct {
88
RedirectURI string // 重定向URI
99
Scope string // 授权范围
1010
Code string // 授权码(授权码模式使用)
11+
Refresh string // 刷新令牌
1112
IsGenerateRefresh bool // 是否生成更新令牌
1213
}
1314

@@ -20,17 +21,17 @@ type Manager interface {
2021
// GenerateAuthToken 生成授权令牌
2122
// rt 授权类型
2223
// tgr 生成令牌的请求参数
23-
GenerateAuthToken(rt ResponseType, tgr *TokenGenerateRequest) (token string, err error)
24+
GenerateAuthToken(rt ResponseType, tgr *TokenGenerateRequest) (authToken TokenInfo, err error)
2425

2526
// GenerateAccessToken 生成访问令牌、更新令牌
2627
// rt 授权模式
2728
// tgr 生成令牌的请求参数
28-
GenerateAccessToken(rt GrantType, tgr *TokenGenerateRequest) (access, refresh string, err error)
29+
GenerateAccessToken(rt GrantType, tgr *TokenGenerateRequest) (accessToken TokenInfo, err error)
2930

3031
// RefreshAccessToken 更新访问令牌
3132
// refresh 更新令牌
3233
// scope 作用域
33-
RefreshAccessToken(refresh, scope string) (access string, err error)
34+
RefreshAccessToken(refresh, scope string) (accessToken TokenInfo, err error)
3435

3536
// RemoveAccessToken 删除访问令牌
3637
// access 访问令牌

manage/error.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ var (
1212
// ErrClientInvalid Client invalid
1313
ErrClientInvalid = errors.New("client invalid")
1414

15-
// ErrAuthTokenInvalid Authorize token invalid
16-
ErrAuthTokenInvalid = errors.New("authorize token invalid")
15+
// ErrAuthCodeInvalid Authorize token invalid
16+
ErrAuthCodeInvalid = errors.New("authorize code invalid")
1717

1818
// ErrAccessInvalid Access token expired
1919
ErrAccessInvalid = errors.New("access token invalid")

manage/manage_test.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,23 @@ func testManager(manager oauth2.Manager) {
5151
RedirectURI: "http://localhost/oauth2",
5252
Scope: "all",
5353
}
54-
code, err := manager.GenerateAuthToken(oauth2.Code, reqParams)
54+
cti, err := manager.GenerateAuthToken(oauth2.Code, reqParams)
5555
So(err, ShouldBeNil)
56+
57+
code := cti.GetAccess()
5658
So(code, ShouldNotBeEmpty)
5759

5860
atParams := &oauth2.TokenGenerateRequest{
59-
ClientID: "1",
60-
RedirectURI: "http://localhost/oauth2",
61+
ClientID: reqParams.ClientID,
62+
ClientSecret: "11",
63+
RedirectURI: reqParams.RedirectURI,
6164
Code: code,
6265
IsGenerateRefresh: true,
6366
}
64-
accessToken, refreshToken, err := manager.GenerateAccessToken(oauth2.AuthorizationCodeCredentials, atParams)
67+
ati, err := manager.GenerateAccessToken(oauth2.AuthorizationCodeCredentials, atParams)
6568
So(err, ShouldBeNil)
69+
70+
accessToken, refreshToken := ati.GetAccess(), ati.GetRefresh()
6671
So(accessToken, ShouldNotBeEmpty)
6772
So(refreshToken, ShouldNotBeEmpty)
6873

@@ -77,8 +82,10 @@ func testManager(manager oauth2.Manager) {
7782
So(err, ShouldBeNil)
7883
So(rinfo.GetClientID(), ShouldEqual, atParams.ClientID)
7984

80-
refreshAT, err := manager.RefreshAccessToken(refreshToken, "owner")
85+
rti, err := manager.RefreshAccessToken(refreshToken, "owner")
8186
So(err, ShouldBeNil)
87+
88+
refreshAT := rti.GetAccess()
8289
So(refreshAT, ShouldNotBeEmpty)
8390

8491
_, err = manager.LoadAccessToken(accessToken)

manage/manager.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func (m *Manager) GetClient(clientID string) (cli oauth2.ClientInfo, err error)
146146
// GenerateAuthToken 生成授权令牌
147147
// rt 授权类型
148148
// tgr 生成令牌的配置参数
149-
func (m *Manager) GenerateAuthToken(rt oauth2.ResponseType, tgr *oauth2.TokenGenerateRequest) (token string, err error) {
149+
func (m *Manager) GenerateAuthToken(rt oauth2.ResponseType, tgr *oauth2.TokenGenerateRequest) (authToken oauth2.TokenInfo, err error) {
150150
cli, err := m.GetClient(tgr.ClientID)
151151
if err != nil {
152152
return
@@ -177,7 +177,7 @@ func (m *Manager) GenerateAuthToken(rt oauth2.ResponseType, tgr *oauth2.TokenGen
177177
if err != nil {
178178
return
179179
}
180-
token = tv
180+
authToken = ti
181181
})
182182
if ierr != nil && err == nil {
183183
err = ierr
@@ -188,14 +188,14 @@ func (m *Manager) GenerateAuthToken(rt oauth2.ResponseType, tgr *oauth2.TokenGen
188188
// GenerateAccessToken 生成访问令牌、更新令牌
189189
// gt 授权模式
190190
// tgr 生成令牌的参数
191-
func (m *Manager) GenerateAccessToken(gt oauth2.GrantType, tgr *oauth2.TokenGenerateRequest) (access, refresh string, err error) {
191+
func (m *Manager) GenerateAccessToken(gt oauth2.GrantType, tgr *oauth2.TokenGenerateRequest) (accessToken oauth2.TokenInfo, err error) {
192192
if gt == oauth2.AuthorizationCodeCredentials { // 授权码模式
193193
ti, terr := m.LoadAccessToken(tgr.Code)
194194
if terr != nil {
195195
err = terr
196196
return
197197
} else if ti.GetRedirectURI() != tgr.RedirectURI || ti.GetClientID() != tgr.ClientID {
198-
err = ErrAuthTokenInvalid
198+
err = ErrAuthCodeInvalid
199199
return
200200
} else if verr := m.RemoveAccessToken(tgr.Code); verr != nil { // 删除授权码
201201
err = verr
@@ -239,8 +239,7 @@ func (m *Manager) GenerateAccessToken(gt oauth2.GrantType, tgr *oauth2.TokenGene
239239
if err != nil {
240240
return
241241
}
242-
access = av
243-
refresh = rv
242+
accessToken = ti
244243
})
245244
if ierr != nil && err == nil {
246245
err = ierr
@@ -249,16 +248,25 @@ func (m *Manager) GenerateAccessToken(gt oauth2.GrantType, tgr *oauth2.TokenGene
249248
}
250249

251250
// RefreshAccessToken 更新访问令牌
252-
func (m *Manager) RefreshAccessToken(refresh, scope string) (token string, err error) {
253-
ti, err := m.LoadRefreshToken(refresh)
251+
func (m *Manager) RefreshAccessToken(tgr *oauth2.TokenGenerateRequest) (accessToken oauth2.TokenInfo, err error) {
252+
cli, err := m.GetClient(tgr.ClientID)
254253
if err != nil {
255254
return
255+
} else if tgr.ClientSecret != "" && tgr.ClientSecret != cli.GetSecret() {
256+
err = ErrClientInvalid
257+
return
258+
}
259+
ti, err := m.LoadRefreshToken(tgr.Refresh)
260+
if err != nil {
261+
return
262+
} else if ti.GetClientID() != tgr.ClientID {
263+
err = ErrRefreshInvalid
264+
return
256265
}
257-
access := ti.GetAccess()
258266
_, ierr := m.injector.Invoke(func(stor oauth2.TokenStore, gen oauth2.AccessGenerate) {
259-
cli, cerr := m.GetClient(ti.GetClientID())
260-
if cerr != nil {
261-
err = cerr
267+
// 移除旧的访问令牌
268+
if verr := stor.RemoveByAccess(ti.GetAccess()); verr != nil {
269+
err = verr
262270
return
263271
}
264272
td := &oauth2.GenerateBasic{
@@ -273,18 +281,14 @@ func (m *Manager) RefreshAccessToken(refresh, scope string) (token string, err e
273281
}
274282
ti.SetAccess(tv)
275283
ti.SetAccessCreateAt(td.CreateAt)
276-
if scope != "" {
284+
if scope := tgr.Scope; scope != "" {
277285
ti.SetScope(scope)
278286
}
279-
if verr := stor.RemoveByAccess(access); verr != nil {
280-
err = verr
281-
return
282-
}
283287
if verr := stor.Create(ti); verr != nil {
284288
err = verr
285289
return
286290
}
287-
token = tv
291+
accessToken = ti
288292
})
289293
if ierr != nil && err == nil {
290294
err = ierr

server/.gitkeep

Whitespace-only changes.

server/authorize.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package server
2+
3+
import (
4+
"encoding/base64"
5+
"net/http"
6+
"strings"
7+
8+
"gopkg.in/oauth2.v2"
9+
)
10+
11+
// AuthorizeRequest 授权请求
12+
type AuthorizeRequest struct {
13+
Type oauth2.ResponseType
14+
ClientID string
15+
Scope string
16+
RedirectURI string
17+
State string
18+
UserID string
19+
}
20+
21+
// ClientHandler 获取客户端信息
22+
type ClientHandler func(r *http.Request) (clientID, clientSecret string, err error)
23+
24+
// UserHandler 获取用户信息
25+
type UserHandler func(username, password string) (userID string, err error)
26+
27+
// ClientFormHandler 客户端表单信息
28+
func ClientFormHandler(r *http.Request) (clientID, clientSecret string, err error) {
29+
clientID = r.Form.Get("client_id")
30+
clientSecret = r.Form.Get("client_secret")
31+
return
32+
}
33+
34+
// ClientBasicHandler 客户端基础认证信息
35+
func ClientBasicHandler(r *http.Request) (clientID, clientSecret string, err error) {
36+
s := strings.SplitN(r.Header.Get("Authorization"), " ", 2)
37+
if len(s) != 2 || s[0] != "Basic" {
38+
err = ErrAuthorizationHeaderInvalid
39+
return
40+
}
41+
b, err := base64.StdEncoding.DecodeString(s[1])
42+
if err != nil {
43+
return
44+
}
45+
pair := strings.SplitN(string(b), ":", 2)
46+
if len(pair) != 2 {
47+
err = ErrAuthorizationHeaderInvalid
48+
return
49+
}
50+
clientID = pair[0]
51+
clientSecret = pair[1]
52+
return
53+
}

server/config.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package server
2+
3+
import "gopkg.in/oauth2.v2"
4+
5+
// Config 配置参数
6+
type Config struct {
7+
// TokenType 令牌类型(默认为Bearer)
8+
TokenType string
9+
// AllowedResponseType 允许的授权类型(默认code)
10+
AllowedResponseType []oauth2.ResponseType
11+
// AllowedGrantType 允许的授权模式(默认authorization_code)
12+
AllowedGrantType []oauth2.GrantType
13+
}
14+
15+
// NewConfig 创建默认的配置参数
16+
func NewConfig() *Config {
17+
return &Config{
18+
TokenType: "Bearer",
19+
AllowedResponseType: []oauth2.ResponseType{oauth2.Code},
20+
AllowedGrantType: []oauth2.GrantType{oauth2.AuthorizationCodeCredentials},
21+
}
22+
}

server/error.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package server
2+
3+
import "errors"
4+
5+
var (
6+
// ErrRequestMethodInvalid Request method invalid
7+
ErrRequestMethodInvalid = errors.New("request method invalid")
8+
9+
// ErrResponseTypeInvalid Response type invalid
10+
ErrResponseTypeInvalid = errors.New("response type invalid")
11+
12+
// ErrGrantTypeInvalid Grant type invalid
13+
ErrGrantTypeInvalid = errors.New("grant type invalid")
14+
15+
// ErrClientInvalid Client invalid
16+
ErrClientInvalid = errors.New("client invalid")
17+
18+
// ErrUserInvalid User invalid
19+
ErrUserInvalid = errors.New("user invalid")
20+
21+
// ErrAuthorizationHeaderInvalid Authorization header invalid
22+
ErrAuthorizationHeaderInvalid = errors.New("authorization header invalid")
23+
)

0 commit comments

Comments
 (0)