Login: handle custom token creation error messages (#31283)

* Login: handle custom token creation errors

* Login: handle external error for OAuth responses
This commit is contained in:
Agnès Toulet
2021-02-25 15:30:51 +01:00
committed by GitHub
parent 8379f36a68
commit 663d44fe82
2 changed files with 31 additions and 3 deletions

View File

@@ -225,7 +225,12 @@ func (hs *HTTPServer) LoginPost(c *models.ReqContext, cmd dtos.LoginCommand) res
err = hs.loginUserWithUser(user, c)
if err != nil {
resp = response.Error(http.StatusInternalServerError, "Error while signing in user", err)
var createTokenErr *models.CreateTokenErr
if errors.As(err, &createTokenErr) {
resp = response.Error(createTokenErr.StatusCode, createTokenErr.ExternalErr, createTokenErr.InternalErr)
} else {
resp = response.Error(http.StatusInternalServerError, "Error while signing in user", err)
}
return resp
}
@@ -321,7 +326,7 @@ func (hs *HTTPServer) trySetEncryptedCookie(ctx *models.ReqContext, cookieName s
func (hs *HTTPServer) redirectWithError(ctx *models.ReqContext, err error, v ...interface{}) {
ctx.Logger.Error(err.Error(), v...)
if err := hs.trySetEncryptedCookie(ctx, loginErrorCookieName, err.Error(), 60); err != nil {
if err := hs.trySetEncryptedCookie(ctx, loginErrorCookieName, getLoginExternalError(err), 60); err != nil {
hs.log.Error("Failed to set encrypted cookie", "err", err)
}
@@ -330,9 +335,18 @@ func (hs *HTTPServer) redirectWithError(ctx *models.ReqContext, err error, v ...
func (hs *HTTPServer) RedirectResponseWithError(ctx *models.ReqContext, err error, v ...interface{}) *response.RedirectResponse {
ctx.Logger.Error(err.Error(), v...)
if err := hs.trySetEncryptedCookie(ctx, loginErrorCookieName, err.Error(), 60); err != nil {
if err := hs.trySetEncryptedCookie(ctx, loginErrorCookieName, getLoginExternalError(err), 60); err != nil {
hs.log.Error("Failed to set encrypted cookie", "err", err)
}
return response.Redirect(setting.AppSubUrl + "/login")
}
func getLoginExternalError(err error) string {
var createTokenErr *models.CreateTokenErr
if errors.As(err, &createTokenErr) {
return createTokenErr.ExternalErr
}
return err.Error()
}

View File

@@ -11,6 +11,20 @@ var (
ErrUserTokenNotFound = errors.New("user token not found")
)
// CreateTokenErr represents a token creation error; used in Enterprise
type CreateTokenErr struct {
StatusCode int
InternalErr error
ExternalErr string
}
func (e *CreateTokenErr) Error() string {
if e.InternalErr != nil {
return e.InternalErr.Error()
}
return "failed to create token"
}
type TokenExpiredError struct {
UserID int64
TokenID int64