Skip to content

Commit ca939d3

Browse files
committed
improve basic auth experience
1 parent de0fcb9 commit ca939d3

File tree

4 files changed

+58
-6
lines changed

4 files changed

+58
-6
lines changed

api/v1/auth/auth.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ func oauth2URL(c *gin.Context) {
6868
redirect_uri = os.Getenv("OAUTH2_AGENT_REDIRECT_URL")
6969

7070
cacheDb.Set(clientId, state, 1*time.Hour)
71+
cacheDb.Set(state, state, 1*time.Hour)
7172
} else {
7273

7374
state, err = util.GenerateRandomString(32)
@@ -89,6 +90,7 @@ func oauth2URL(c *gin.Context) {
8990
}
9091
// save clientId and state so we can retrieve for verification
9192
cacheDb.Set(clientId, state, 1*time.Hour)
93+
cacheDb.Set(state, state, 1*time.Hour)
9294
codeUrl = oauth2Client.CodeUrl(state)
9395
if referer != "" {
9496
codeUrl = codeUrl + "&referer=" + referer
@@ -136,6 +138,10 @@ func oauth2Exchange(c *gin.Context) {
136138
cacheDb := c.MustGet("cache").(*cache.Cache)
137139
savedState, exists := cacheDb.Get(loginVals.ClientId)
138140

141+
if !exists {
142+
savedState, exists = cacheDb.Get(loginVals.State)
143+
}
144+
139145
if loginVals.State != "basic_auth" {
140146
if !exists || savedState != loginVals.State {
141147
log.WithFields(log.Fields{
@@ -198,6 +204,10 @@ func token(c *gin.Context) {
198204
cacheDb := c.MustGet("cache").(*cache.Cache)
199205
savedState, exists := cacheDb.Get(loginVals.Code)
200206

207+
if !exists {
208+
savedState, exists = cacheDb.Get(loginVals.State)
209+
}
210+
201211
if !exists || savedState != loginVals.State {
202212
log.WithFields(log.Fields{
203213
"state": loginVals.State,
@@ -259,6 +269,10 @@ func login(c *gin.Context) {
259269
cacheDb := c.MustGet("cache").(*cache.Cache)
260270
savedState, exists := cacheDb.Get(loginVals.ClientId)
261271

272+
if !exists {
273+
savedState, exists = cacheDb.Get(loginVals.State)
274+
}
275+
262276
if loginVals.State != "basic_auth" {
263277
if !exists || savedState != loginVals.State {
264278
log.WithFields(log.Fields{
@@ -296,13 +310,18 @@ func login(c *gin.Context) {
296310
user := parts[0]
297311
pass := parts[1]
298312

313+
x := strings.Split(user, "@")
314+
if len(x) > 0 {
315+
user = x[0]
316+
}
317+
299318
// validate the username and password
300319
err = shadow.ShadowAuthPlain(user, pass)
301320
if err != nil {
302321
log.WithFields(log.Fields{
303322
"err": err,
304-
}).Error("shadow: invalid username or password")
305-
c.AbortWithStatus(http.StatusBadRequest)
323+
}).Error("invalid username or password")
324+
c.JSON(http.StatusForbidden, gin.H{"error": "invalid username or password"})
306325
return
307326
}
308327

@@ -440,7 +459,7 @@ func logout(c *gin.Context) {
440459
return
441460
}
442461

443-
cacheDb.Delete(c.Request.Header.Get(util.AuthTokenHeaderName))
462+
cacheDb.Delete(util.GetCleanAuthToken(c))
444463

445464
var logoutUrl string
446465

auth/basic/basic.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,29 @@ func (o *Oauth2Basic) Exchange2(code string) (*oauth2.Token, error) {
9393
return token, err
9494
}
9595

96+
func getServerName() string {
97+
// compute the name of the server
98+
server := os.Getenv("SERVER")
99+
server = strings.Replace(server, "http://", "", -1)
100+
server = strings.Replace(server, "https://", "", -1)
101+
parts := strings.SplitN(server, ".", 2)
102+
if len(parts) == 2 {
103+
server = parts[1]
104+
} else {
105+
server = parts[0]
106+
}
107+
parts = strings.SplitN(server, ":", 2)
108+
if len(parts) > 0 {
109+
server = parts[0]
110+
}
111+
112+
if server == "" {
113+
server = "localhost"
114+
}
115+
116+
return server
117+
}
118+
96119
// UserInfo get token user
97120
func (o *Oauth2Basic) UserInfo(oauth2Token *oauth2.Token) (*model.User, error) {
98121
rawIDToken, ok := oauth2Token.Extra("id_token").(string)
@@ -109,11 +132,18 @@ func (o *Oauth2Basic) UserInfo(oauth2Token *oauth2.Token) (*model.User, error) {
109132
return nil, err
110133
}
111134

135+
server := getServerName()
136+
137+
email := idToken.Subject
138+
if !strings.Contains(email, "@") {
139+
email = email + "@" + server
140+
}
141+
email = strings.ToLower(email)
142+
112143
// get some infos about user
113144
user := &model.User{}
114145
user.Sub = idToken.Subject
115-
user.Email = idToken.Subject + "@localhost"
116-
user.Email = strings.ToLower(user.Email)
146+
user.Email = email
117147
user.Picture = os.Getenv("SERVER") + "/account-circle.png"
118148
user.Issuer = idToken.Issuer
119149
user.IssuedAt = idToken.IssuedAt

ui/src/store/modules/auth.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ const actions = {
107107

108108
})
109109
.catch(err => {
110+
console.log("login error", err);
110111
commit('authStatus', 'error')
111-
commit('error', err);
112+
commit('error', err.response.data.error);
112113
commit('logout')
113114
})
114115
},

ui/src/views/Login.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
label="Username"
1818
:rules="[ v => !!v || 'username is required', ]"
1919
required
20+
@keyup.enter="login"
2021
/>
2122
<v-text-field
2223
v-model="password"
@@ -27,6 +28,7 @@
2728
label="Password"
2829
:rules="[ v => !!v || 'password is required', ]"
2930
required
31+
@keyup.enter="login"
3032
/>
3133

3234
</v-form>

0 commit comments

Comments
 (0)