From b2188bbb007056263cd9899b851e86f88f11187a Mon Sep 17 00:00:00 2001 From: Sergey Yakubov <sergey.yakubov@desy.de> Date: Tue, 9 Mar 2021 17:00:42 +0100 Subject: [PATCH] use separate secrets for user and admi tokens --- .../authorization/authorization.go | 19 ++++++++------ .../src/asapo_authorizer/cli/command_test.go | 2 +- .../src/asapo_authorizer/cli/create_token.go | 14 +++++----- .../asapo_authorizer/cli/create_token_test.go | 26 ++++++++++++------- .../src/asapo_authorizer/server/authorize.go | 4 +-- .../asapo_authorizer/server/authorize_test.go | 3 ++- .../asapo_authorizer/server/folder_token.go | 2 +- .../asapo_authorizer/server/issue_token.go | 2 +- .../server/issue_token_test.go | 5 ++-- .../server/server_nottested.go | 2 +- 10 files changed, 46 insertions(+), 33 deletions(-) diff --git a/authorizer/src/asapo_authorizer/authorization/authorization.go b/authorizer/src/asapo_authorizer/authorization/authorization.go index ba8e08114..89cb04564 100644 --- a/authorizer/src/asapo_authorizer/authorization/authorization.go +++ b/authorizer/src/asapo_authorizer/authorization/authorization.go @@ -8,21 +8,21 @@ import ( ) type Auth struct { - authHMAC utils.Auth + authUser utils.Auth authAdmin utils.Auth authJWT utils.Auth } -func NewAuth(authHMAC,authHMACAdmin,authJWT utils.Auth) *Auth { - return &Auth{authHMAC,authHMACAdmin,authJWT} +func NewAuth(authUser,authAdmin,authJWT utils.Auth) *Auth { + return &Auth{authUser,authAdmin,authJWT} } func (auth *Auth) AdminAuth() utils.Auth { return auth.authAdmin } -func (auth *Auth) HmacAuth() utils.Auth { - return auth.authHMAC +func (auth *Auth) UserAuth() utils.Auth { + return auth.authUser } func (auth *Auth) JWTAuth() utils.Auth { @@ -43,7 +43,7 @@ func subjectFromRequest(request TokenRequest) string { return "" } -func (auth *Auth) PrepareAccessToken(request TokenRequest) (string, error) { +func (auth *Auth) PrepareAccessToken(request TokenRequest, userToken bool) (string, error) { var claims utils.CustomClaims var extraClaim utils.AccessTokenExtraClaim @@ -55,8 +55,11 @@ func (auth *Auth) PrepareAccessToken(request TokenRequest) (string, error) { uid := xid.New() claims.Id = uid.String() - return auth.authAdmin.GenerateToken(&claims) - + if userToken { + return auth.UserAuth().GenerateToken(&claims) + } else { + return auth.AdminAuth().GenerateToken(&claims) + } } func UserTokenResponce(request TokenRequest, token string) []byte { diff --git a/authorizer/src/asapo_authorizer/cli/command_test.go b/authorizer/src/asapo_authorizer/cli/command_test.go index 5fb4e423a..d1aad81b7 100644 --- a/authorizer/src/asapo_authorizer/cli/command_test.go +++ b/authorizer/src/asapo_authorizer/cli/command_test.go @@ -20,7 +20,7 @@ var CommandTests = []struct { func TestCommand(t *testing.T) { outBuf = new(bytes.Buffer) - server.Auth = authorization.NewAuth(utils.NewHMACAuth("secret"),utils.NewJWTAuth("secret_admin"),utils.NewJWTAuth("secret")) + server.Auth = authorization.NewAuth(utils.NewJWTAuth("secret"),utils.NewJWTAuth("secret_admin"),utils.NewJWTAuth("secret")) for _, test := range CommandTests { outBuf.(*bytes.Buffer).Reset() diff --git a/authorizer/src/asapo_authorizer/cli/create_token.go b/authorizer/src/asapo_authorizer/cli/create_token.go index 2dc031019..b1eba14c9 100644 --- a/authorizer/src/asapo_authorizer/cli/create_token.go +++ b/authorizer/src/asapo_authorizer/cli/create_token.go @@ -63,12 +63,12 @@ func (cmd *command) CommandCreate_token() (err error) { return err } - request, err := getTokenRequest(flags) + request, userToken, err := getTokenRequest(flags) if err != nil { return err } - token, err := server.Auth.PrepareAccessToken(request) + token, err := server.Auth.PrepareAccessToken(request,userToken) if err != nil { return err } @@ -78,19 +78,21 @@ func (cmd *command) CommandCreate_token() (err error) { return nil } -func getTokenRequest(flags tokenFlags) (request authorization.TokenRequest, err error) { +func getTokenRequest(flags tokenFlags) (request authorization.TokenRequest, userToken bool, err error) { switch flags.Type { case "user-token": request, err = userTokenRequest(flags) + userToken = true case "admin-token": request, err = adminTokenRequest(flags) + userToken = false default: - return authorization.TokenRequest{}, errors.New("wrong token type") + return authorization.TokenRequest{}, false, errors.New("wrong token type") } if err != nil { - return authorization.TokenRequest{}, err + return authorization.TokenRequest{},false, err } - return request, err + return request, userToken, err } diff --git a/authorizer/src/asapo_authorizer/cli/create_token_test.go b/authorizer/src/asapo_authorizer/cli/create_token_test.go index e12102017..3b26cc8d8 100644 --- a/authorizer/src/asapo_authorizer/cli/create_token_test.go +++ b/authorizer/src/asapo_authorizer/cli/create_token_test.go @@ -13,6 +13,7 @@ import ( var tokenTests = []struct { cmd command + key string ok bool tokenAccessType string tokenSubject string @@ -21,24 +22,24 @@ var tokenTests = []struct { }{ // good {command{args: []string{"-type", "user-token", "-beamtime","123","-access-type","read","-duration-days","10"}}, - true, "read", "bt_123", true,"user token beamtime ok"}, + "secret_user",true, "read", "bt_123", true,"user token beamtime ok"}, {command{args: []string{"-type", "user-token", "-beamline","123","-access-type","read","-duration-days","10"}}, - true, "read", "bl_123", true,"user token beamline ok"}, + "secret_user", true, "read", "bl_123", true,"user token beamline ok"}, {command{args: []string{"-type", "admin-token","-access-type","create"}}, - true, "create", "admin", false,"admin token ok"}, + "secret_admin",true, "create", "admin", false,"admin token ok"}, // bad {command{args: []string{"-type", "user-token", "-beamtime","123","-access-type","create","-duration-days","10"}}, - false, "", "", true,"user token wrong type"}, + "secret_user",false, "", "", true,"user token wrong type"}, {command{args: []string{"-type", "user-token", "-access-type","create","-duration-days","10"}}, - false, "", "", true,"user token no beamtime or beamline"}, + "secret_user",false, "", "", true,"user token no beamtime or beamline"}, {command{args: []string{"-type", "user-token", "-beamtime","123","-beamline","1234", "-access-type","create","-duration-days","10"}}, - false, "", "", true,"user token both beamtime and beamline"}, + "secret_user",false, "", "", true,"user token both beamtime and beamline"}, {command{args: []string{"-type", "admin-token","-access-type","bla"}}, - false, "", "", false,"admin token wrong type"}, + "secret_admin",false, "", "", false,"admin token wrong type"}, } func TestGenerateToken(t *testing.T) { - server.Auth = authorization.NewAuth(utils.NewHMACAuth("secret"),utils.NewJWTAuth("secret_admin"),utils.NewJWTAuth("secret")) + server.Auth = authorization.NewAuth(utils.NewJWTAuth("secret_user"),utils.NewJWTAuth("secret_admin"),utils.NewJWTAuth("secret")) for _, test := range tokenTests { outBuf = new(bytes.Buffer) err := test.cmd.CommandCreate_token() @@ -49,8 +50,13 @@ func TestGenerateToken(t *testing.T) { assert.Nil(t, err, test.msg) var token authorization.TokenResponce json.Unmarshal(outBuf.(*bytes.Buffer).Bytes(), &token) - assert.Equal(t, test.tokenSubject, token.Sub, test.msg) - assert.Equal(t, test.tokenAccessType, token.AccessType, test.msg) + + claims,_ := utils.CheckJWTToken(token.Token,test.key) + cclaims,_:= claims.(*utils.CustomClaims) + var extra_claim utils.AccessTokenExtraClaim + utils.MapToStruct(cclaims.ExtraClaims.(map[string]interface{}), &extra_claim) + assert.Equal(t, test.tokenSubject, cclaims.Subject, test.msg) + assert.Equal(t, test.tokenAccessType, extra_claim.AccessType, test.msg) if test.tokenExpires { assert.Equal(t, true, len(token.Expires)>0, test.msg) } else { diff --git a/authorizer/src/asapo_authorizer/server/authorize.go b/authorizer/src/asapo_authorizer/server/authorize.go index 89020bf12..160229223 100644 --- a/authorizer/src/asapo_authorizer/server/authorize.go +++ b/authorizer/src/asapo_authorizer/server/authorize.go @@ -155,10 +155,10 @@ func needHostAuthorization(creds SourceCredentials) bool { func authorizeByToken(creds SourceCredentials) error { var token_expect string if (creds.BeamtimeId != "auto") { - token_expect, _ = Auth.HmacAuth().GenerateToken(&creds.BeamtimeId) + token_expect, _ = Auth.UserAuth().GenerateToken(&creds.BeamtimeId) } else { key := "bl_" + creds.Beamline - token_expect, _ = Auth.HmacAuth().GenerateToken(&key) + token_expect, _ = Auth.UserAuth().GenerateToken(&key) } var err_string string diff --git a/authorizer/src/asapo_authorizer/server/authorize_test.go b/authorizer/src/asapo_authorizer/server/authorize_test.go index c813c38dc..185bf0d7a 100644 --- a/authorizer/src/asapo_authorizer/server/authorize_test.go +++ b/authorizer/src/asapo_authorizer/server/authorize_test.go @@ -15,9 +15,10 @@ import ( "testing" ) + func prepareToken(payload string) string{ Auth = authorization.NewAuth(utils.NewHMACAuth("secret"),nil,nil) - token, _ := Auth.HmacAuth().GenerateToken(&payload) + token, _ := Auth.UserAuth().GenerateToken(&payload) return token } diff --git a/authorizer/src/asapo_authorizer/server/folder_token.go b/authorizer/src/asapo_authorizer/server/folder_token.go index be3d6b7ec..cd6dd8380 100644 --- a/authorizer/src/asapo_authorizer/server/folder_token.go +++ b/authorizer/src/asapo_authorizer/server/folder_token.go @@ -39,7 +39,7 @@ func folderTokenResponce(token string) []byte{ } func checkBeamtimeToken(request folderTokenRequest) error { - token_expect, _ := Auth.HmacAuth().GenerateToken(&request.BeamtimeId) + token_expect, _ := Auth.UserAuth().GenerateToken(&request.BeamtimeId) var err_string string if request.Token != token_expect { err_string = "wrong token for beamtime " + request.BeamtimeId diff --git a/authorizer/src/asapo_authorizer/server/issue_token.go b/authorizer/src/asapo_authorizer/server/issue_token.go index 0623bff1a..b86888446 100644 --- a/authorizer/src/asapo_authorizer/server/issue_token.go +++ b/authorizer/src/asapo_authorizer/server/issue_token.go @@ -59,7 +59,7 @@ func issueUserToken(w http.ResponseWriter, r *http.Request) { return } - token, err := Auth.PrepareAccessToken(request) + token, err := Auth.PrepareAccessToken(request,true) if err != nil { utils.WriteServerError(w, err, http.StatusInternalServerError) return diff --git a/authorizer/src/asapo_authorizer/server/issue_token_test.go b/authorizer/src/asapo_authorizer/server/issue_token_test.go index 2a49803d5..a6d86446b 100644 --- a/authorizer/src/asapo_authorizer/server/issue_token_test.go +++ b/authorizer/src/asapo_authorizer/server/issue_token_test.go @@ -35,7 +35,8 @@ var IssueTokenTests = [] struct { func TestIssueToken(t *testing.T) { authJWT := utils.NewJWTAuth("secret") authAdmin := utils.NewJWTAuth("secret_admin") - Auth = authorization.NewAuth(nil,authAdmin,authJWT) + authUser := utils.NewJWTAuth("secret_user") + Auth = authorization.NewAuth(authUser,authAdmin,authJWT) for _, test := range IssueTokenTests { request := makeRequest(authorization.TokenRequest{test.requestSubject,test.validDays,test.role}) w := doPostRequest("/admin/issue",request,authAdmin.Name()+" "+test.adminToken) @@ -43,7 +44,7 @@ func TestIssueToken(t *testing.T) { body, _ := ioutil.ReadAll(w.Body) var token authorization.TokenResponce json.Unmarshal(body,&token) - claims,_ := utils.CheckJWTToken(token.Token,"secret_admin") + claims,_ := utils.CheckJWTToken(token.Token,"secret_user") cclaims,_:= claims.(*utils.CustomClaims) var extra_claim utils.AccessTokenExtraClaim utils.MapToStruct(claims.(*utils.CustomClaims).ExtraClaims.(map[string]interface{}), &extra_claim) diff --git a/authorizer/src/asapo_authorizer/server/server_nottested.go b/authorizer/src/asapo_authorizer/server/server_nottested.go index 20b5da298..2f428370f 100644 --- a/authorizer/src/asapo_authorizer/server/server_nottested.go +++ b/authorizer/src/asapo_authorizer/server/server_nottested.go @@ -30,7 +30,7 @@ func createAuth() (*authorization.Auth,error) { if err != nil { return nil, err } - return authorization.NewAuth(utils.NewHMACAuth(secret), utils.NewJWTAuth(adminSecret), utils.NewJWTAuth(secret)),nil + return authorization.NewAuth(utils.NewJWTAuth(secret), utils.NewJWTAuth(adminSecret), utils.NewJWTAuth(secret)),nil } func ReadConfig(fname string) (log.Level, error) { -- GitLab