diff --git a/routers/authz_filter.go b/routers/authz_filter.go index 223e73b5..1ad10d99 100644 --- a/routers/authz_filter.go +++ b/routers/authz_filter.go @@ -35,14 +35,14 @@ type Object struct { func getUsername(ctx *context.Context) (username string) { defer func() { if r := recover(); r != nil { - username = getUsernameByClientIdSecret(ctx) + username, _ = getUsernameByClientIdSecret(ctx) } }() username = ctx.Input.Session("username").(string) if username == "" { - username = getUsernameByClientIdSecret(ctx) + username, _ = getUsernameByClientIdSecret(ctx) } if username == "" { diff --git a/routers/auto_signin_filter.go b/routers/auto_signin_filter.go index fd0c6cd1..a5a9e120 100644 --- a/routers/auto_signin_filter.go +++ b/routers/auto_signin_filter.go @@ -45,19 +45,21 @@ func AutoSigninFilter(ctx *context.Context) { } if token == nil { - responseError(ctx, "Access token doesn't exist") + responseError(ctx, "Access token doesn't exist in database") return } - if util.IsTokenExpired(token.CreatedTime, token.ExpiresIn) { - responseError(ctx, "Access token has expired") + isExpired, expireTime := util.IsTokenExpired(token.CreatedTime, token.ExpiresIn) + if isExpired { + responseError(ctx, fmt.Sprintf("Access token has expired, expireTime = %s", expireTime)) return } userId := util.GetId(token.Organization, token.User) application, err := object.GetApplicationByUserId(fmt.Sprintf("app/%s", token.Application)) if err != nil { - panic(err) + responseError(ctx, err.Error()) + return } setSessionUser(ctx, userId) @@ -66,7 +68,11 @@ func AutoSigninFilter(ctx *context.Context) { } // "/page?clientId=123&clientSecret=456" - userId := getUsernameByClientIdSecret(ctx) + userId, err := getUsernameByClientIdSecret(ctx) + if err != nil { + responseError(ctx, err.Error()) + return + } if userId != "" { setSessionUser(ctx, userId) return diff --git a/routers/base.go b/routers/base.go index d92572ed..4e246285 100644 --- a/routers/base.go +++ b/routers/base.go @@ -66,7 +66,7 @@ func denyRequest(ctx *context.Context) { responseError(ctx, T(ctx, "auth:Unauthorized operation")) } -func getUsernameByClientIdSecret(ctx *context.Context) string { +func getUsernameByClientIdSecret(ctx *context.Context) (string, error) { clientId, clientSecret, ok := ctx.Request.BasicAuth() if !ok { clientId = ctx.Input.Query("clientId") @@ -74,19 +74,22 @@ func getUsernameByClientIdSecret(ctx *context.Context) string { } if clientId == "" || clientSecret == "" { - return "" + return "", nil } application, err := object.GetApplicationByClientId(clientId) if err != nil { - panic(err) + return "", err + } + if application == nil { + return "", fmt.Errorf("Application not found for client ID: %s", clientId) } - if application == nil || application.ClientSecret != clientSecret { - return "" + if application.ClientSecret != clientSecret { + return "", fmt.Errorf("Incorrect client secret for application: %s", application.Name) } - return fmt.Sprintf("app/%s", application.Name) + return fmt.Sprintf("app/%s", application.Name), nil } func getUsernameByKeys(ctx *context.Context) string { diff --git a/util/time.go b/util/time.go index c386a3d3..f3ee60d6 100644 --- a/util/time.go +++ b/util/time.go @@ -58,8 +58,10 @@ func Time2String(timestamp time.Time) string { return timestamp.Format(time.RFC3339) } -func IsTokenExpired(createdTime string, expiresIn int) bool { +func IsTokenExpired(createdTime string, expiresIn int) (bool, string) { createdTimeObj, _ := time.Parse(time.RFC3339, createdTime) expiresAtObj := createdTimeObj.Add(time.Duration(expiresIn) * time.Second) - return time.Now().After(expiresAtObj) + isExpired := time.Now().After(expiresAtObj) + expireTime := expiresAtObj.Local().Format(time.RFC3339) + return isExpired, expireTime } diff --git a/util/time_test.go b/util/time_test.go index 0a801a3b..900ff195 100644 --- a/util/time_test.go +++ b/util/time_test.go @@ -102,7 +102,7 @@ func Test_IsTokenExpired(t *testing.T) { }, } { t.Run(scenario.description, func(t *testing.T) { - result := IsTokenExpired(scenario.input.createdTime, scenario.input.expiresIn) + result, _ := IsTokenExpired(scenario.input.createdTime, scenario.input.expiresIn) assert.Equal(t, scenario.expected, result, fmt.Sprintf("Expected %t, but was founded %t", scenario.expected, result)) }) }