mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
@@ -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()
|
||||
}
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user