Skip to content

Commit 70b64bc

Browse files
fix(GIST-26): fix some auth quirks about providers and cookies (#10)
* wip(GIST-26): fixed cookie rewrite middleware * wip(GIST-26): fixed user creation strategy
1 parent 996818e commit 70b64bc

File tree

6 files changed

+88
-56
lines changed

6 files changed

+88
-56
lines changed

server/middleware.go

+1-20
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,14 @@
11
package server
22

33
import (
4-
"github.com/gistapp/api/user"
54
"github.com/gofiber/fiber/v2"
65
)
76

87
func AuthorizationCookieMiddleware(ctx *fiber.Ctx) error {
9-
cookie := ctx.Cookies("auth")
8+
cookie := ctx.Cookies("gists.access_token")
109
if cookie == "" {
1110
return ctx.Next()
1211
}
1312
ctx.Request().Header.Set("Authorization", "Bearer "+cookie)
1413
return ctx.Next()
1514
}
16-
17-
func AuthNeededMiddleware(ctx *fiber.Ctx) error {
18-
if ctx.Get("Authorization") == "" {
19-
return ctx.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
20-
"error": "Unauthorized",
21-
})
22-
}
23-
raw_token := string(ctx.Request().Header.Peek("Authorization")[7:])
24-
claims, err := user.AuthService.IsAuthenticated(raw_token)
25-
if err != nil {
26-
return ctx.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
27-
"error": "Unauthorized",
28-
})
29-
}
30-
ctx.Locals("pub", claims.Pub)
31-
ctx.Locals("email", claims.Email)
32-
return ctx.Next()
33-
}

server/server.go

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ func (s *Server) Setup(routers ...DomainRouter) {
4949
AllowOrigins: utils.Get("FRONTEND_URL"),
5050
}))
5151

52+
s.App.Use(AuthorizationCookieMiddleware)
53+
5254
s.App.Use(logger.New())
5355

5456
custom_router := s.App.Group("/")

tests/mock/auth_service.go

+38-23
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func (m *MockAuthService) VerifyLocalAuthToken(token string, email string) (stri
6464
return jwt_token, nil
6565
}
6666

67-
user, err := m.Register(goth_user)
67+
user, err := m.Register(withEmailPrefix(goth_user))
6868

6969
if err != nil {
7070
return "", err
@@ -83,19 +83,48 @@ func (a *MockAuthService) GetUser(auth_user goth.User) (*user.User, *user.AuthId
8383
return user.AuthService.GetUser(auth_user)
8484
}
8585

86-
func (m *MockAuthService) Register(auth_user goth.User) (*user.User, error) {
87-
data, err := json.Marshal(auth_user)
86+
func (a *MockAuthService) IsAuthenticated(token string) (*user.JWTClaim, error) {
87+
claims, err := utils.VerifyJWT(token)
88+
8889
if err != nil {
89-
return nil, errors.New("couldn't marshal user")
90+
return nil, err
9091
}
9192

92-
user_model := user.UserSQL{
93-
ID: sql.NullString{String: auth_user.UserID, Valid: true},
94-
Email: sql.NullString{String: auth_user.Email, Valid: true},
95-
Name: sql.NullString{String: auth_user.Name, Valid: true},
96-
Picture: sql.NullString{String: auth_user.AvatarURL, Valid: true},
93+
jwtClaim := new(user.JWTClaim)
94+
jwtClaim.Pub = claims["pub"].(string)
95+
jwtClaim.Email = claims["email"].(string)
96+
97+
return jwtClaim, nil
98+
}
99+
100+
func withEmailPrefix(auth_user goth.User) *user.RegistrationOptions {
101+
return &user.RegistrationOptions{
102+
SqlUser: &user.UserSQL{
103+
ID: sql.NullString{String: auth_user.UserID, Valid: true},
104+
Email: sql.NullString{String: auth_user.Email, Valid: true},
105+
Name: sql.NullString{String: strings.Split(auth_user.Email, "@")[0], Valid: true},
106+
Picture: sql.NullString{String: auth_user.AvatarURL, Valid: true},
107+
},
108+
AuthUser: auth_user,
97109
}
110+
}
98111

112+
func withGithubUsername(auth_user goth.User) *user.RegistrationOptions {
113+
return &user.RegistrationOptions{SqlUser: &user.UserSQL{
114+
ID: sql.NullString{String: auth_user.UserID, Valid: true},
115+
Email: sql.NullString{String: auth_user.Email, Valid: true},
116+
Name: sql.NullString{String: auth_user.RawData["login"].(string), Valid: true},
117+
}, AuthUser: auth_user}
118+
}
119+
120+
func (a *MockAuthService) Register(options *user.RegistrationOptions) (*user.User, error) {
121+
auth_user := options.AuthUser
122+
data, err := json.Marshal(auth_user)
123+
if err != nil {
124+
return nil, errors.New("couldn't marshal user")
125+
}
126+
127+
user_model := options.SqlUser
99128
user_data, err := user_model.Save()
100129

101130
if err != nil {
@@ -113,19 +142,5 @@ func (m *MockAuthService) Register(auth_user goth.User) (*user.User, error) {
113142
return user_data, err
114143
}
115144

116-
func (a *MockAuthService) IsAuthenticated(token string) (*user.JWTClaim, error) {
117-
claims, err := utils.VerifyJWT(token)
118-
119-
if err != nil {
120-
return nil, err
121-
}
122-
123-
jwtClaim := new(user.JWTClaim)
124-
jwtClaim.Pub = claims["pub"].(string)
125-
jwtClaim.Email = claims["email"].(string)
126-
127-
return jwtClaim, nil
128-
}
129-
130145
func (a *MockAuthService) RegisterProviders() {
131146
}

user/auth_middleware.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package user
22

3-
import "github.com/gofiber/fiber/v2"
3+
import (
4+
"github.com/gofiber/fiber/v2"
5+
"github.com/gofiber/fiber/v2/log"
6+
)
47

58
func AuthNeededMiddleware(ctx *fiber.Ctx) error {
69
if ctx.Get("Authorization") == "" {
@@ -11,6 +14,7 @@ func AuthNeededMiddleware(ctx *fiber.Ctx) error {
1114
raw_token := string(ctx.Request().Header.Peek("Authorization")[7:])
1215
claims, err := AuthService.IsAuthenticated(raw_token)
1316
if err != nil {
17+
log.Info(err)
1418
return ctx.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
1519
"error": "Unauthorized",
1620
})

user/auth_service.go

+39-11
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type IAuthService interface {
2121
VerifyLocalAuthToken(token string, email string) (string, error)
2222
Callback(c *fiber.Ctx) (string, error)
2323
GetUser(auth_user goth.User) (*User, *AuthIdentity, error)
24-
Register(auth_user goth.User) (*User, error)
24+
Register(options *RegistrationOptions) (*User, error)
2525
RegisterProviders()
2626
IsAuthenticated(token string) (*JWTClaim, error)
2727
}
@@ -89,7 +89,7 @@ func (a *AuthServiceImpl) VerifyLocalAuthToken(token string, email string) (stri
8989
return jwt_token, nil
9090
}
9191

92-
user, err := a.Register(goth_user)
92+
user, err := a.Register(withEmailPrefix(goth_user))
9393

9494
if err != nil {
9595
return "", err
@@ -101,6 +101,7 @@ func (a *AuthServiceImpl) VerifyLocalAuthToken(token string, email string) (stri
101101
}
102102

103103
func (a *AuthServiceImpl) Callback(c *fiber.Ctx) (string, error) {
104+
provider := c.Params("provider")
104105
auth_user, err := goth_fiber.CompleteUserAuth(c)
105106
if err != nil {
106107
log.Error(err)
@@ -117,7 +118,12 @@ func (a *AuthServiceImpl) Callback(c *fiber.Ctx) (string, error) {
117118
return token, nil
118119
}
119120

120-
user_md, err = a.Register(auth_user)
121+
log.Info(auth_user.NickName)
122+
if provider == "github" {
123+
user_md, err = a.Register(withGithubUsername(auth_user))
124+
} else {
125+
user_md, err = a.Register(withEmailPrefix(auth_user))
126+
}
121127

122128
if err != nil {
123129
return "", err
@@ -140,19 +146,41 @@ func (a *AuthServiceImpl) GetUser(auth_user goth.User) (*User, *AuthIdentity, er
140146
return &auth_and_user.User, &auth_and_user.AuthIdentity, nil
141147
}
142148

143-
func (a *AuthServiceImpl) Register(auth_user goth.User) (*User, error) {
149+
type RegistrationOptions struct {
150+
AuthUser goth.User
151+
SqlUser *UserSQL
152+
}
153+
154+
func withEmailPrefix(user goth.User) *RegistrationOptions {
155+
return &RegistrationOptions{
156+
SqlUser: &UserSQL{
157+
ID: sql.NullString{String: user.UserID, Valid: true},
158+
Email: sql.NullString{String: user.Email, Valid: true},
159+
Name: sql.NullString{String: strings.Split(user.Email, "@")[0], Valid: true},
160+
Picture: sql.NullString{String: user.AvatarURL, Valid: true},
161+
},
162+
AuthUser: user,
163+
}
164+
}
165+
166+
func withGithubUsername(user goth.User) *RegistrationOptions {
167+
return &RegistrationOptions{SqlUser: &UserSQL{
168+
ID: sql.NullString{String: user.UserID, Valid: true},
169+
Email: sql.NullString{String: user.Email, Valid: true},
170+
Name: sql.NullString{String: user.NickName, Valid: true},
171+
Picture: sql.NullString{String: user.AvatarURL, Valid: true},
172+
}, AuthUser: user}
173+
}
174+
175+
func (a *AuthServiceImpl) Register(options *RegistrationOptions) (*User, error) {
176+
log.Info(options)
177+
auth_user := options.AuthUser
144178
data, err := json.Marshal(auth_user)
145179
if err != nil {
146180
return nil, errors.New("couldn't marshal user")
147181
}
148182

149-
user_model := UserSQL{
150-
ID: sql.NullString{String: auth_user.UserID, Valid: true},
151-
Email: sql.NullString{String: auth_user.Email, Valid: true},
152-
Name: sql.NullString{String: auth_user.Name, Valid: true},
153-
Picture: sql.NullString{String: auth_user.AvatarURL, Valid: true},
154-
}
155-
183+
user_model := options.SqlUser
156184
user_data, err := user_model.Save()
157185

158186
if err != nil {

user/user_controller.go

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

3-
import "github.com/gofiber/fiber/v2"
3+
import (
4+
"github.com/gofiber/fiber/v2"
5+
)
46

57
type UserControllerImpl struct{}
68

0 commit comments

Comments
 (0)