diff --git a/authorizer/src/asapo_authorizer/server/authorize.go b/authorizer/src/asapo_authorizer/server/authorize.go index 1b984a9c456a3f56e4d4793b3cecdaf9ffcc27eb..295a29ed29390ce31500c6a3e0cf7231bbeac432 100644 --- a/authorizer/src/asapo_authorizer/server/authorize.go +++ b/authorizer/src/asapo_authorizer/server/authorize.go @@ -372,7 +372,7 @@ func routeAuthorize(w http.ResponseWriter, r *http.Request) { } w.WriteHeader(http.StatusOK) - w.Write([]byte(res)) + w.Write(res) } func checkRole(w http.ResponseWriter, r *http.Request, role string) error { diff --git a/authorizer/src/asapo_authorizer/server/authorize_test.go b/authorizer/src/asapo_authorizer/server/authorize_test.go index 1c6e6400554b5ee6fe8fbc6dd324b8ad1ae7d346..e3bb6c11e23b699adc034354b57ced49ca63143e 100644 --- a/authorizer/src/asapo_authorizer/server/authorize_test.go +++ b/authorizer/src/asapo_authorizer/server/authorize_test.go @@ -387,3 +387,21 @@ func TestGetBeamtimeInfo(t *testing.T) { } } + +func TestExpiredToken(t *testing.T) { + Auth = authorization.NewAuth(utils.NewJWTAuth("secret_user"), utils.NewJWTAuth("secret_admin"), utils.NewJWTAuth("secret")) + token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MzU3NTMxMDksImp0aSI6ImMyOTR0NWFodHY1am9vZHVoaGNnIiwic3ViIjoiYnRfMTEwMTIxNzEiLCJFeHRyYUNsYWltcyI6eyJBY2Nlc3NUeXBlcyI6WyJyZWFkIiwid3JpdGUiXX19.kITePbv_dXY2ACxpAQ-PeQJPQtnR02bMoFrXq0Pbcm0" + request := authorizationRequest{"asapo_test%%"+token, "host"} + creds, _ := getSourceCredentials(request) + + creds.Token = token + creds.DataSource = "test" + creds.BeamtimeId = "11012171" + creds.Beamline = "p21.2" + _, err := authorizeByToken(creds) + assert.Error(t, err, "") + if (err!=nil) { + assert.Contains(t, err.Error(), "expired") + } + +} diff --git a/broker/src/asapo_broker/server/authorizer_test.go b/broker/src/asapo_broker/server/authorizer_test.go index a58681460c80b6a412091f6982afca7c6eecdc14..f854b224667b1fc004a9e36ef229ad20fa15b5bd 100644 --- a/broker/src/asapo_broker/server/authorizer_test.go +++ b/broker/src/asapo_broker/server/authorizer_test.go @@ -47,7 +47,7 @@ func responseOk() (*http.Response, error) { } func responseUnauth() (*http.Response, error) { - r := ioutil.NopCloser(bytes.NewReader([]byte("wrong JWT token"))) + r := ioutil.NopCloser(bytes.NewReader([]byte("wrong or expired JWT token"))) return &http.Response{ StatusCode: http.StatusUnauthorized, Body: r, diff --git a/broker/src/asapo_broker/server/process_request_test.go b/broker/src/asapo_broker/server/process_request_test.go index f62d12814f0e933aa0ec6a549e008d774628d2c0..a9c5f53f36bd0e760ee7bcb1d9bf624b0d50d9a0 100644 --- a/broker/src/asapo_broker/server/process_request_test.go +++ b/broker/src/asapo_broker/server/process_request_test.go @@ -45,7 +45,7 @@ func (a *MockAuthServer) AuthorizeToken(tokenJWT string) (token Token, err error }, nil } - return Token{}, AuthorizationError{errors.New("wrong JWT token"),http.StatusUnauthorized} + return Token{}, &AuthorizationError{errors.New("wrong or expired JWT token"),http.StatusUnauthorized} } func prepareTestAuth() { @@ -148,7 +148,7 @@ func TestProcessRequestTestSuite(t *testing.T) { func (suite *ProcessRequestTestSuite) TestProcessRequestWithWrongToken() { - logger.MockLog.On("WithFields", mock.MatchedBy(containsMatcherMap("wrong JWT token"))) + logger.MockLog.On("WithFields", mock.MatchedBy(containsMatcherMap("wrong or expired JWT token"))) logger.MockLog.On("Error", mock.MatchedBy(containsMatcherStr("cannot authorize request"))) w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + suffixWithWrongToken) diff --git a/broker/src/asapo_broker/server/request_common.go b/broker/src/asapo_broker/server/request_common.go index 42c34e4a08b9bc06fe788615047725b8deee7795..cda3a09951c417368a5db5320f3823cc2ae2ff4b 100644 --- a/broker/src/asapo_broker/server/request_common.go +++ b/broker/src/asapo_broker/server/request_common.go @@ -10,9 +10,8 @@ import ( func writeAuthAnswer(w http.ResponseWriter, requestOp string, db_name string, err error) { logger.WithFields(map[string]interface{}{"operation": requestOp, "cause": err.Error()}).Error("cannot authorize request") - switch er := err.(type) { - case AuthorizationError: + case *AuthorizationError: w.WriteHeader(er.statusCode) default: w.WriteHeader(http.StatusServiceUnavailable) @@ -53,7 +52,7 @@ func authorize(r *http.Request, beamtime_id string, needWriteAccess bool) error tokenJWT := r.URL.Query().Get("token") if len(tokenJWT) == 0 { - return AuthorizationError{errors.New("cannot extract token from request"), http.StatusBadRequest} + return &AuthorizationError{errors.New("cannot extract token from request"), http.StatusBadRequest} } token, err := auth.AuthorizeToken(tokenJWT) @@ -71,18 +70,18 @@ func authorize(r *http.Request, beamtime_id string, needWriteAccess bool) error func checkSubject(subject string, beamtime_id string) error { if subject != utils.SubjectFromBeamtime(beamtime_id) { - return AuthorizationError{errors.New("wrong token subject"), http.StatusUnauthorized} + return &AuthorizationError{errors.New("wrong token subject"), http.StatusUnauthorized} } return nil } func checkAccessType(accessTypes []string, needWriteAccess bool) error { if needWriteAccess && !utils.StringInSlice("write", accessTypes) { - return AuthorizationError{errors.New("wrong token access type"), http.StatusUnauthorized} + return &AuthorizationError{errors.New("wrong token access type"), http.StatusUnauthorized} } if !utils.StringInSlice("read", accessTypes) { - return AuthorizationError{errors.New("wrong token access type"), http.StatusUnauthorized} + return &AuthorizationError{errors.New("wrong token access type"), http.StatusUnauthorized} } return nil } diff --git a/common/go/src/asapo_common/logger/logrus_logger.go b/common/go/src/asapo_common/logger/logrus_logger.go index d41432252033ee351827494990efc9c6b36bf5a8..88b41114303b39f073050cb86753c101f6122af9 100644 --- a/common/go/src/asapo_common/logger/logrus_logger.go +++ b/common/go/src/asapo_common/logger/logrus_logger.go @@ -15,8 +15,11 @@ func (l *logRusLogger) SetSource(source string) { func (l *logRusLogger) WithFields(args map[string]interface{}) Logger { - l.logger_entry = l.entry().WithFields(args) - return l + new_log:= &logRusLogger{ + logger_entry: l.entry().WithFields(args), + source: l.source, + } + return new_log } @@ -25,6 +28,7 @@ func (l *logRusLogger) entry() *log.Entry { return l.logger_entry } + formatter := &log.JSONFormatter{ FieldMap: log.FieldMap{ log.FieldKeyMsg: "message", diff --git a/common/go/src/asapo_common/logger/logrus_test.go b/common/go/src/asapo_common/logger/logrus_test.go index 0587dff3c031c64cb85a0fada301784ae5d9a586..d6997f88845eb14da5ebb17cd1111f2d50647e45 100644 --- a/common/go/src/asapo_common/logger/logrus_test.go +++ b/common/go/src/asapo_common/logger/logrus_test.go @@ -1,7 +1,6 @@ package logger import ( - "fmt" "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" "testing" @@ -19,8 +18,11 @@ func logStr(hook *test.Hook) string { func TestLog(t *testing.T) { l := &logRusLogger{} hook := test.NewLocal(l.entry().Logger) - l.WithFields(map[string]interface{}{"testmap":1}).Info("aaa") - fmt.Println(logStr(hook)) - assert.Contains(t, logStr(hook),"testmap") + l.WithFields(map[string]interface{}{"testmap1":1}).Info("aaa") + assert.Contains(t, logStr(hook),"testmap1") + + hook.Reset() + l.WithFields(map[string]interface{}{"testmap2":1}).Info("bbb") + assert.NotContains(t, logStr(hook),"testmap1") } diff --git a/common/go/src/asapo_common/utils/authorization.go b/common/go/src/asapo_common/utils/authorization.go index d707819b9d11758a87f5f3538b204e8d76ed5ee3..8a1b11bb253e16da88b47834816a6235cd4e72f5 100644 --- a/common/go/src/asapo_common/utils/authorization.go +++ b/common/go/src/asapo_common/utils/authorization.go @@ -151,7 +151,7 @@ func (a *JWTAuth) CheckAndGetContent(token string, extraClaims interface{}, payl // payload ignored c, ok := CheckJWTToken(token,a.Key) if !ok { - return nil,errors.New("wrong JWT token") + return nil,errors.New("wrong or expired JWT token") } claim,ok := c.(*CustomClaims) if !ok { diff --git a/common/go/src/asapo_common/utils/authorization_test.go b/common/go/src/asapo_common/utils/authorization_test.go index cda7f43b091bfba5dc5f8228199e6ae125f01933..b0add6be7436fdb17708243a900dddd5846a013d 100644 --- a/common/go/src/asapo_common/utils/authorization_test.go +++ b/common/go/src/asapo_common/utils/authorization_test.go @@ -1,11 +1,11 @@ package utils import ( + "github.com/stretchr/testify/assert" "net/http" - "testing" "net/http/httptest" + "testing" "time" - "github.com/stretchr/testify/assert" ) type authorizationResponse struct { diff --git a/receiver/src/request_handler/authorization_client.cpp b/receiver/src/request_handler/authorization_client.cpp index cb5c737f421783871b05d0d8f83e4ae98b96248d..2a4ab650ee005ebc3bc949e60409bed9f96e99f6 100644 --- a/receiver/src/request_handler/authorization_client.cpp +++ b/receiver/src/request_handler/authorization_client.cpp @@ -22,15 +22,16 @@ Error ErrorFromAuthorizationServerResponse(Error err, const std::string response if (err) { return_err = asapo::ReceiverErrorTemplates::kInternalServerError.Generate( "cannot authorize request"); + return_err->AddDetails("response", response); return_err->SetCause(std::move(err)); } else { if (code != HttpCode::Unauthorized) { return_err = asapo::ReceiverErrorTemplates::kInternalServerError.Generate(); - return_err->AddDetails("response", response)->AddDetails("errorCode", std::to_string(int( - code))); } else { return_err = asapo::ReceiverErrorTemplates::kAuthorizationFailure.Generate(); } + return_err->AddDetails("response", response)->AddDetails("errorCode", std::to_string(int( + code))); } return return_err; } @@ -56,6 +57,7 @@ Error ParseServerResponse(const std::string &response, std::vector<std::string> *access_types, AuthorizationData *data) { Error err; + AuthorizationData creds; JsonStringParser parser{response}; std::string stype; @@ -69,7 +71,7 @@ Error ParseServerResponse(const std::string &response, (err = GetSourceTypeFromString(stype, &data->source_type)) || (err = parser.GetString("beamline", &data->beamline)); if (err) { - return ErrorFromAuthorizationServerResponse(std::move(err), "", code); + return ErrorFromAuthorizationServerResponse(std::move(err), response, code); } return nullptr; } @@ -82,7 +84,7 @@ Error UpdateDataFromServerResponse(const std::string &response, HttpCode code, A err = ParseServerResponse(response, code, &access_types, data); if (err) { *data = old_data; - return ErrorFromAuthorizationServerResponse(std::move(err), response, code); + return err; } err = CheckAccessType(data->source_type, access_types);