@@ -2,28 +2,20 @@ package opaauthorizerequest
2
2
3
3
import (
4
4
"fmt"
5
+ opasdktest "github.com/open-policy-agent/opa/sdk/test"
6
+ "github.com/stretchr/testify/assert"
5
7
"github.com/stretchr/testify/require"
8
+ "github.com/zalando/skipper/eskip"
9
+ "github.com/zalando/skipper/filters"
6
10
"github.com/zalando/skipper/filters/builtin"
11
+ "github.com/zalando/skipper/proxy/proxytest"
12
+ "github.com/zalando/skipper/tracing/tracingtest"
7
13
"io"
8
- "log"
9
14
"net/http"
10
15
"net/http/httptest"
11
- "net/url"
12
- "os"
13
16
"strings"
14
17
"testing"
15
- "time"
16
-
17
- "github.com/golang-jwt/jwt/v4"
18
- opasdktest "github.com/open-policy-agent/opa/sdk/test"
19
- "github.com/stretchr/testify/assert"
20
- "github.com/zalando/skipper/eskip"
21
- "github.com/zalando/skipper/filters"
22
- "github.com/zalando/skipper/metrics/metricstest"
23
- "github.com/zalando/skipper/proxy/proxytest"
24
- "github.com/zalando/skipper/tracing/tracingtest"
25
18
26
- "github.com/zalando/skipper/filters/filtertest"
27
19
"github.com/zalando/skipper/filters/openpolicyagent"
28
20
)
29
21
@@ -791,231 +783,3 @@ func isHeadersAbsent(t *testing.T, unwantedHeaders http.Header, headers http.Hea
791
783
}
792
784
return true
793
785
}
794
-
795
- const (
796
- tokenExp = 2 * time .Hour
797
-
798
- certPath = "../../../skptesting/cert.pem"
799
- keyPath = "../../../skptesting/key.pem"
800
- )
801
-
802
- func BenchmarkAuthorizeRequest (b * testing.B ) {
803
- b .Run ("authorize-request-minimal" , func (b * testing.B ) {
804
- opaControlPlane := opasdktest .MustNewServer (
805
- opasdktest .MockBundle ("/bundles/somebundle.tar.gz" , map [string ]string {
806
- "main.rego" : `
807
- package envoy.authz
808
-
809
- default allow = false
810
-
811
- allow {
812
- input.parsed_path = [ "allow" ]
813
- }
814
- ` ,
815
- }),
816
- )
817
-
818
- f , err := createOpaFilter (opaControlPlane )
819
- assert .NoError (b , err )
820
-
821
- url , err := url .Parse ("http://opa-authorized.test/somepath" )
822
- assert .NoError (b , err )
823
-
824
- ctx := & filtertest.Context {
825
- FStateBag : map [string ]interface {}{},
826
- FResponse : & http.Response {},
827
- FRequest : & http.Request {
828
- Header : map [string ][]string {
829
- "Authorization" : {"Bearer FOOBAR" },
830
- },
831
- URL : url ,
832
- },
833
- FMetrics : & metricstest.MockMetrics {},
834
- }
835
-
836
- b .ResetTimer ()
837
- b .ReportAllocs ()
838
-
839
- for i := 0 ; i < b .N ; i ++ {
840
- f .Request (ctx )
841
- }
842
- })
843
-
844
- b .Run ("authorize-request-with-body" , func (b * testing.B ) {
845
- opaControlPlane := opasdktest .MustNewServer (
846
- opasdktest .MockBundle ("/bundles/somebundle.tar.gz" , map [string ]string {
847
- "main.rego" : `
848
- package envoy.authz
849
-
850
- import rego.v1
851
-
852
- default allow = false
853
-
854
- allow if {
855
- endswith(input.parsed_body.email, "@zalando.de")
856
- }
857
- ` ,
858
- }),
859
- )
860
-
861
- f , err := createBodyBasedOpaFilter (opaControlPlane )
862
- assert .NoError (b , err )
863
-
864
- url , err := url .Parse ("http://opa-authorized.test/somepath" )
865
- assert .NoError (b , err )
866
-
867
- body := `{"email": "[email protected] "}`
868
- ctx := & filtertest.Context {
869
- FStateBag : map [string ]interface {}{},
870
- FResponse : & http.Response {},
871
- FRequest : & http.Request {
872
- Method : "POST" ,
873
- Header : map [string ][]string {
874
- "Authorization" : {"Bearer FOOBAR" },
875
- "Content-Type" : {"application/json" },
876
- },
877
- URL : url ,
878
- Body : io .NopCloser (strings .NewReader (body )),
879
- ContentLength : int64 (len (body )),
880
- },
881
- FMetrics : & metricstest.MockMetrics {},
882
- }
883
-
884
- b .ResetTimer ()
885
- b .ReportAllocs ()
886
-
887
- for i := 0 ; i < b .N ; i ++ {
888
- f .Request (ctx )
889
- }
890
- })
891
-
892
- b .Run ("authorize-request-jwt-validation" , func (b * testing.B ) {
893
-
894
- publicKey , err := os .ReadFile (certPath )
895
- if err != nil {
896
- log .Fatalf ("Failed to read public key: %v" , err )
897
- }
898
-
899
- opaControlPlane := opasdktest .MustNewServer (
900
- opasdktest .MockBundle ("/bundles/somebundle.tar.gz" , map [string ]string {
901
- "main.rego" : fmt .Sprintf (`
902
- package envoy.authz
903
-
904
- import future.keywords.if
905
-
906
- default allow = false
907
-
908
- public_key_cert := %q
909
-
910
- bearer_token := t if {
911
- v := input.attributes.request.http.headers.authorization
912
- startswith(v, "Bearer ")
913
- t := substring(v, count("Bearer "), -1)
914
- }
915
-
916
- allow if {
917
- [valid, _, payload] := io.jwt.decode_verify(bearer_token, {
918
- "cert": public_key_cert,
919
- "aud": "nqz3xhorr5"
920
- })
921
-
922
- valid
923
-
924
- payload.sub == "5974934733"
925
- }
926
- ` , publicKey ),
927
- }),
928
- )
929
-
930
- f , err := createOpaFilter (opaControlPlane )
931
- assert .NoError (b , err )
932
-
933
- url , err := url .Parse ("http://opa-authorized.test/somepath" )
934
- assert .NoError (b , err )
935
-
936
- claims := jwt.MapClaims {
937
- "iss" : "https://some.identity.acme.com" ,
938
- "sub" : "5974934733" ,
939
- "aud" : "nqz3xhorr5" ,
940
- "iat" : time .Now ().Add (- time .Minute ).UTC ().Unix (),
941
- "exp" : time .Now ().Add (tokenExp ).UTC ().Unix (),
942
-
943
- }
944
-
945
- token := jwt .NewWithClaims (jwt .SigningMethodRS256 , claims )
946
-
947
- privKey , err := os .ReadFile (keyPath )
948
- if err != nil {
949
- log .Fatalf ("Failed to read priv key: %v" , err )
950
- }
951
-
952
- key , err := jwt .ParseRSAPrivateKeyFromPEM ([]byte (privKey ))
953
- if err != nil {
954
- log .Fatalf ("Failed to parse RSA PEM: %v" , err )
955
- }
956
-
957
- // Sign and get the complete encoded token as a string using the secret
958
- signedToken , err := token .SignedString (key )
959
- if err != nil {
960
- log .Fatalf ("Failed to sign token: %v" , err )
961
- }
962
-
963
- ctx := & filtertest.Context {
964
- FStateBag : map [string ]interface {}{},
965
- FResponse : & http.Response {},
966
- FRequest : & http.Request {
967
- Header : map [string ][]string {
968
- "Authorization" : {fmt .Sprintf ("Bearer %s" , signedToken )},
969
- },
970
- URL : url ,
971
- },
972
- FMetrics : & metricstest.MockMetrics {},
973
- }
974
-
975
- b .ResetTimer ()
976
- b .ReportAllocs ()
977
-
978
- for i := 0 ; i < b .N ; i ++ {
979
- f .Request (ctx )
980
- assert .False (b , ctx .FServed )
981
- }
982
- })
983
- }
984
-
985
- func createOpaFilter (opaControlPlane * opasdktest.Server ) (filters.Filter , error ) {
986
- config := generateConfig (opaControlPlane , "envoy/authz/allow" )
987
- opaFactory := openpolicyagent .NewOpenPolicyAgentRegistry ()
988
- spec := NewOpaAuthorizeRequestSpec (opaFactory , openpolicyagent .WithConfigTemplate (config ))
989
- return spec .CreateFilter ([]interface {}{"somebundle.tar.gz" })
990
- }
991
-
992
- func createBodyBasedOpaFilter (opaControlPlane * opasdktest.Server ) (filters.Filter , error ) {
993
- config := generateConfig (opaControlPlane , "envoy/authz/allow" )
994
- opaFactory := openpolicyagent .NewOpenPolicyAgentRegistry ()
995
- spec := NewOpaAuthorizeRequestWithBodySpec (opaFactory , openpolicyagent .WithConfigTemplate (config ))
996
- return spec .CreateFilter ([]interface {}{"somebundle.tar.gz" })
997
- }
998
-
999
- func generateConfig (opaControlPlane * opasdktest.Server , path string ) []byte {
1000
- return []byte (fmt .Sprintf (`{
1001
- "services": {
1002
- "test": {
1003
- "url": %q
1004
- }
1005
- },
1006
- "bundles": {
1007
- "test": {
1008
- "resource": "/bundles/{{ .bundlename }}"
1009
- }
1010
- },
1011
- "labels": {
1012
- "environment": "test"
1013
- },
1014
- "plugins": {
1015
- "envoy_ext_authz_grpc": {
1016
- "path": %q,
1017
- "dry-run": false
1018
- }
1019
- }
1020
- }` , opaControlPlane .URL (), path ))
1021
- }
0 commit comments