Skip to content

Commit ce752c9

Browse files
author
Duke
committed
change oauth library, add and tests oauth callback
1 parent dc2fa10 commit ce752c9

File tree

5 files changed

+79
-57
lines changed

5 files changed

+79
-57
lines changed

auth_test.go

+24-7
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package auth
22

33
import (
44
"bytes"
5-
"log"
65
"net/http"
6+
"net/http/httptest"
77
"net/url"
88
"strings"
99
"testing"
1010

11+
"github.com/stretchr/testify/mock"
12+
1113
. "gopkg.in/check.v1"
1214
)
1315

@@ -18,17 +20,18 @@ type AuthSuite struct{}
1820
var _ = Suite(&AuthSuite{})
1921

2022
func (s *AuthSuite) TestNewAuth(c *C) {
21-
providers := []Provider{Provider{Name: "Duke", Key: "CsE34", Secret: "Aeee", Scope: "email", RedirectURL: "/d"}}
23+
providers := []Provider{Provider{Name: "Duke", Key: "CsE34", Secret: "Aeee", Scopes: []string{"email"}, RedirectURL: "/d"}}
24+
2225
auth := NewAuth()
2326
auth.NewProviders(providers)
2427

2528
client := *auth.Providers["Duke"]
2629

27-
c.Assert(client.Auth.ClientId, Equals, providers[0].Key)
30+
c.Assert(client.Auth.ClientID, Equals, providers[0].Key)
2831
}
2932

3033
func (s *AuthSuite) TestAuthorizerOAuthRedirect(c *C) {
31-
provider := Provider{Name: "facebook", Key: "CsE34", Secret: "Aeee", Scope: "email", RedirectURL: "/d"}
34+
provider := Provider{Name: "facebook", Key: "CsE34", Secret: "Aeee", Scopes: []string{"email"}, RedirectURL: "/d"}
3235
providerRedirectTo := "/?client_id=CsE34&redirect_uri=%2Fd&response_type=code&scope=email"
3336

3437
auth := NewAuth()
@@ -107,18 +110,32 @@ func (s *AuthSuite) TestOAuthCallbackWithoutCode(c *C) {
107110

108111
func (s *AuthSuite) TestOAuthCallback(c *C) {
109112
oauthServer := mockHTTP(func(w http.ResponseWriter, r *http.Request) {
110-
log.Println(r.URL)
111113
w.WriteHeader(200)
112-
w.Write([]byte(`{"access_token": "abc123", "refresh_token": "323", "expires_in": 0}`))
114+
if r.URL.String() == "/token" {
115+
w.Write([]byte("access_token=90d64460d14870c08c81352a05dedd3465940a7c&scope=user&token_type=bearer"))
116+
} else {
117+
w.Write([]byte(`{"name": "Test"}`))
118+
}
113119
})
114120

121+
h := mockUserHelper()
122+
115123
provider := Provider{Name: "facebook", UserInfoURL: oauthServer.URL, TokenURL: oauthServer.URL + "/token"}
116124
auth := NewAuth()
117125
auth.NewProvider(provider)
126+
auth.Helper = h
118127

119128
data := url.Values{}
120129
data.Set("code", "123")
121-
r := httpTest(auth.OAuthCallback("facebook"), "POST", strings.NewReader(data.Encode()), "application/x-www-form-urlencoded")
130+
131+
h.On("FindUserFromOAuth", "facebook", mock.AnythingOfType("*auth.User"), mock.AnythingOfType("*http.Response")).Return("e3123", nil)
132+
handle := func(w http.ResponseWriter, r *http.Request) {
133+
id, err := auth.OAuthCallback("facebook", w, r)
134+
c.Assert(id, Equals, "e3123")
135+
c.Assert(err, Not(NotNil))
136+
}
137+
138+
r := httpTest(handle, "POST", strings.NewReader(data.Encode()), "application/x-www-form-urlencoded")
122139
c.Assert(r.Code, Equals, http.StatusOK)
123140
}
124141

helper_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ func (h *userHelper) FindUserDataByEmail(email string) (string, bool) {
3030
return args.String(0), args.Bool(1)
3131
}
3232

33+
func (h *userHelper) FindUserByToken(token string) (string, bool) {
34+
args := h.Called(token)
35+
return args.String(0), args.Bool(1)
36+
}
37+
38+
func (h *userHelper) FindUserFromOAuth(provider string, user *User, r *http.Response) (string, error) {
39+
args := h.Called(provider, user, r)
40+
return args.String(0), args.Error(1)
41+
}
42+
3343
func mockUserHelper() *userHelper {
3444
return new(userHelper)
3545
}

http.go

+28-44
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ package auth
22

33
import (
44
"encoding/json"
5-
"log"
65
"net/http"
76

8-
"code.google.com/p/goauth2/oauth"
7+
oauth "golang.org/x/oauth2"
98
)
109

1110
type emailPasswordParams struct {
@@ -70,53 +69,38 @@ func (a *Auth) SignIn(w http.ResponseWriter, r *http.Request) {
7069
}
7170
}
7271

73-
// The oauth endpoint callback, configured on provider, Send provider name as params and method will return http handle
72+
// The oauth endpoint callback, configured on provider, Send provider name as params
73+
// OAuthCallback will receive code params from provider and get user information
7474
//
7575
// ```
76-
// GET /auth/callback/google auth.OAuthCallback("google")
77-
// GET /auth/callback/facebook auth.OAuthCallback("facebook")
76+
// GET /auth/google/callback http.HandlerFunc -> auth.OAuthCallback("google", w, r)
77+
78+
// GET /auth/facebook/callback http.HandlerFunc -> auth.OAuthCallback("facebook", w, r)
7879
// ```
79-
func (a *Auth) OAuthCallback(providerName string) http.HandlerFunc {
80-
return func(w http.ResponseWriter, r *http.Request) {
81-
// userId, err := a.oAuthUser(providerName, request)
82-
a.oAuthUser(providerName, w, r)
83-
//if err != nil {
84-
//http.Redirect(w, request, b.URLS.SignIn, http.StatusTemporaryRedirect)
85-
//} else {
86-
//b.login(request, w, strconv.FormatInt(userId, 10))
87-
//}
88-
}
80+
func (a *Auth) OAuthCallback(providerName string, w http.ResponseWriter, r *http.Request) (string, error) {
81+
return a.oAuthUser(providerName, w, r)
8982
}
9083

91-
// OAuthCallback receive code params from provider and get user information
92-
func (a *Auth) oAuthUser(providerName string, w http.ResponseWriter, r *http.Request) {
93-
provider := a.Providers[providerName]
84+
func (a *Auth) oAuthUser(providerName string, w http.ResponseWriter, r *http.Request) (userID string, err error) {
9485
code := r.FormValue("code")
95-
t := &oauth.Transport{Config: provider.Auth}
96-
97-
token, errx := t.Exchange(code)
98-
log.Println(t.Token)
99-
log.Println(t.TokenCache)
100-
log.Println("TOKEN", code, token, errx)
101-
102-
// response, err := t.Client().Get(provider.UserInfoURL)
103-
//if err != nil {
104-
// log.Println(err)
105-
106-
// w.WriteHeader(http.StatusBadRequest)
107-
// return
108-
//}
109-
//defer response.Body.Close()
86+
provider := a.Providers[providerName]
87+
token, err := provider.Auth.Exchange(oauth.NoContext, code)
88+
if err != nil {
89+
return
90+
}
91+
client := provider.Auth.Client(oauth.NoContext, token)
92+
response, err := client.Get(provider.UserInfoURL)
93+
if err != nil {
94+
return
95+
}
96+
defer response.Body.Close()
11097

111-
//log.Println(ioutil.ReadAll(response.Body))
112-
//
113-
// var user User
114-
// decoder := json.NewDecoder(responseAuth.Body)
115-
// user.Token = NewUserToken()
116-
// err := decoder.Decode(&user)
117-
// if err != nil {
118-
// panic(err)
119-
// }
120-
//
121-
// return b.UserSetupFn(provider, &user, responseAuth)
98+
var user User
99+
decoder := json.NewDecoder(response.Body)
100+
err = decoder.Decode(&user)
101+
// user.Token = NewUserToken()
102+
if err != nil {
103+
return
104+
}
105+
return a.Helper.FindUserFromOAuth(providerName, &user, response)
122106
}

provider.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package auth
22

3-
import "code.google.com/p/goauth2/oauth"
3+
import oauth "golang.org/x/oauth2"
44

55
// Provider is a oauth2 provider, like facebook or google
66
// Name is the provider name, the package use it as a index.
@@ -19,7 +19,7 @@ type Provider struct {
1919
TokenURL string
2020
AuthURL string
2121
UserInfoURL string
22-
Scope string
22+
Scopes []string
2323
}
2424

2525
// Email/Password default provider
@@ -41,12 +41,14 @@ func (b *Auth) NewProviders(providers []Provider) {
4141

4242
func (a *Auth) NewProvider(p Provider) {
4343
config := &oauth.Config{
44-
ClientId: p.Key,
44+
ClientID: p.Key,
4545
ClientSecret: p.Secret,
4646
RedirectURL: p.RedirectURL,
47-
Scope: p.Scope,
48-
AuthURL: p.AuthURL,
49-
TokenURL: p.TokenURL,
47+
Scopes: p.Scopes,
48+
Endpoint: oauth.Endpoint{
49+
AuthURL: p.AuthURL,
50+
TokenURL: p.TokenURL,
51+
},
5052
}
5153

5254
provider := new(builderConfig)

user.go

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
package auth
22

3+
import (
4+
"encoding/base64"
5+
"math/rand"
6+
"net/http"
7+
"strconv"
8+
"strings"
9+
"time"
10+
)
11+
312
// UserHelper interface has some important method to auth works
413
//
514
// PasswordByEmail func(email string) (string, bool)

0 commit comments

Comments
 (0)