@@ -2899,59 +2899,6 @@ public function handle(Request $request): Response
2899
2899
2900
2900
}
2901
2901
2902
- // file: src/Tqdev/PhpCrudApi/Middleware/Auth0Middleware.php
2903
-
2904
- class Auth0Middleware extends Middleware
2905
- {
2906
-
2907
- private function getFullUrl (String $ path )
2908
- {
2909
- list ($ scheme , $ default ) = (isset ($ _SERVER ['HTTPS ' ]) && $ _SERVER ['HTTPS ' ] == 'on ' ) ? array ('https ' , 443 ) : array ('http ' , 80 );
2910
- $ port = ($ _SERVER ['SERVER_PORT ' ] == $ default ) ? '' : (': ' . $ _SERVER ['SERVER_PORT ' ]);
2911
- return $ scheme . ':// ' . $ _SERVER ['HTTP_HOST ' ] . $ _SERVER ['SCRIPT_NAME ' ] . $ path ;
2912
- }
2913
-
2914
- private function login (Request $ request ): Response
2915
- {
2916
- $ domain = $ this ->getProperty ('domain ' , '' );
2917
- $ clientId = $ this ->getProperty ('clientId ' , '' );
2918
- $ redirectUri = $ this ->getFullUrl ('/callback ' );
2919
- $ url = "https:// $ domain/authorize?response_type=token&client_id= $ clientId&redirect_uri= $ redirectUri " ;
2920
- return $ this ->responder ->redirect ($ url );
2921
- }
2922
-
2923
- private function callback (Request $ request ): Response
2924
- {
2925
- $ response = $ this ->responder ->success ('<h1>test</h1> ' );
2926
- $ response ->addHeader ('Content-Type ' , 'text/html ' );
2927
- return $ response ;
2928
- }
2929
-
2930
- private function logout (Request $ request ): Response
2931
- {
2932
- session_destroy ();
2933
- $ url = $ this ->getFullUrl ('/login ' );
2934
- return $ this ->responder ->redirect ($ url );
2935
- }
2936
-
2937
- public function handle (Request $ request ): Response
2938
- {
2939
- if (session_status () == PHP_SESSION_NONE ) {
2940
- session_start ();
2941
- }
2942
- $ path = $ request ->getPathSegment (1 );
2943
- switch ($ path ) {
2944
- case 'login ' :
2945
- return $ this ->login ($ request );
2946
- case 'callback ' :
2947
- return $ this ->callback ($ request );
2948
- case 'logout ' :
2949
- return $ this ->logout ($ request );
2950
- }
2951
- return $ this ->next ->handle ($ request );
2952
- }
2953
- }
2954
-
2955
2902
// file: src/Tqdev/PhpCrudApi/Middleware/AuthorizationMiddleware.php
2956
2903
2957
2904
class AuthorizationMiddleware extends Middleware
@@ -3116,6 +3063,9 @@ public function handle(Request $request): Response
3116
3063
if (!$ validUser ) {
3117
3064
return $ this ->responder ->error (ErrorCode::AUTHENTICATION_FAILED , $ username );
3118
3065
}
3066
+ if (!headers_sent ()) {
3067
+ session_regenerate_id ();
3068
+ }
3119
3069
}
3120
3070
if (!isset ($ _SESSION ['username ' ]) || !$ _SESSION ['username ' ]) {
3121
3071
$ authenticationMode = $ this ->getProperty ('mode ' , 'required ' );
@@ -3158,19 +3108,33 @@ public function handle(Request $request): Response
3158
3108
} elseif ($ method == 'OPTIONS ' ) {
3159
3109
$ response = new Response (Response::OK , '' );
3160
3110
$ allowHeaders = $ this ->getProperty ('allowHeaders ' , 'Content-Type, X-XSRF-TOKEN ' );
3161
- $ response ->addHeader ('Access-Control-Allow-Headers ' , $ allowHeaders );
3111
+ if ($ allowHeaders ) {
3112
+ $ response ->addHeader ('Access-Control-Allow-Headers ' , $ allowHeaders );
3113
+ }
3162
3114
$ allowMethods = $ this ->getProperty ('allowMethods ' , 'OPTIONS, GET, PUT, POST, DELETE, PATCH ' );
3163
- $ response ->addHeader ('Access-Control-Allow-Methods ' , $ allowMethods );
3115
+ if ($ allowMethods ) {
3116
+ $ response ->addHeader ('Access-Control-Allow-Methods ' , $ allowMethods );
3117
+ }
3164
3118
$ allowCredentials = $ this ->getProperty ('allowCredentials ' , 'true ' );
3165
- $ response ->addHeader ('Access-Control-Allow-Credentials ' , $ allowCredentials );
3119
+ if ($ allowCredentials ) {
3120
+ $ response ->addHeader ('Access-Control-Allow-Credentials ' , $ allowCredentials );
3121
+ }
3166
3122
$ maxAge = $ this ->getProperty ('maxAge ' , '1728000 ' );
3167
- $ response ->addHeader ('Access-Control-Max-Age ' , $ maxAge );
3123
+ if ($ maxAge ) {
3124
+ $ response ->addHeader ('Access-Control-Max-Age ' , $ maxAge );
3125
+ }
3126
+ $ exposeHeaders = $ this ->getProperty ('exposeHeaders ' , '' );
3127
+ if ($ exposeHeaders ) {
3128
+ $ response ->addHeader ('Access-Control-Expose-Headers ' , $ exposeHeaders );
3129
+ }
3168
3130
} else {
3169
3131
$ response = $ this ->next ->handle ($ request );
3170
3132
}
3171
3133
if ($ origin ) {
3172
3134
$ allowCredentials = $ this ->getProperty ('allowCredentials ' , 'true ' );
3173
- $ response ->addHeader ('Access-Control-Allow-Credentials ' , $ allowCredentials );
3135
+ if ($ allowCredentials ) {
3136
+ $ response ->addHeader ('Access-Control-Allow-Credentials ' , $ allowCredentials );
3137
+ }
3174
3138
$ response ->addHeader ('Access-Control-Allow-Origin ' , $ origin );
3175
3139
}
3176
3140
return $ response ;
@@ -3359,6 +3323,9 @@ public function handle(Request $request): Response
3359
3323
if (empty ($ claims )) {
3360
3324
return $ this ->responder ->error (ErrorCode::AUTHENTICATION_FAILED , 'JWT ' );
3361
3325
}
3326
+ if (!headers_sent ()) {
3327
+ session_regenerate_id ();
3328
+ }
3362
3329
}
3363
3330
if (empty ($ _SESSION ['claims ' ])) {
3364
3331
$ authenticationMode = $ this ->getProperty ('mode ' , 'required ' );
@@ -3573,6 +3540,39 @@ public function handle(Request $request): Response
3573
3540
}
3574
3541
}
3575
3542
3543
+ // file: src/Tqdev/PhpCrudApi/Middleware/XsrfMiddleware.php
3544
+
3545
+ class XsrfMiddleware extends Middleware
3546
+ {
3547
+ private function getToken (): String
3548
+ {
3549
+ $ cookieName = $ this ->getProperty ('cookieName ' , 'XSRF-TOKEN ' );
3550
+ if (isset ($ _COOKIE [$ cookieName ])) {
3551
+ $ token = $ _COOKIE [$ cookieName ];
3552
+ } else {
3553
+ $ secure = isset ($ _SERVER ['HTTPS ' ]) && $ _SERVER ['HTTPS ' ] == 'on ' ;
3554
+ $ token = bin2hex (random_bytes (8 ));
3555
+ if (!headers_sent ()) {
3556
+ setcookie ($ cookieName , $ token , 0 , '' , '' , $ secure );
3557
+ }
3558
+ }
3559
+ return $ token ;
3560
+ }
3561
+
3562
+ public function handle (Request $ request ): Response
3563
+ {
3564
+ $ token = $ this ->getToken ();
3565
+ $ method = $ request ->getMethod ();
3566
+ if (!in_array ($ method , ['OPTIONS ' , 'GET ' ])) {
3567
+ $ headerName = $ this ->getProperty ('headerName ' , 'X-XSRF-TOKEN ' );
3568
+ if ($ token != $ request ->getHeader ($ headerName )) {
3569
+ return $ this ->responder ->error (ErrorCode::BAD_OR_MISSING_XSRF_TOKEN , '' );
3570
+ }
3571
+ }
3572
+ return $ this ->next ->handle ($ request );
3573
+ }
3574
+ }
3575
+
3576
3576
// file: src/Tqdev/PhpCrudApi/OpenApi/OpenApiBuilder.php
3577
3577
3578
3578
class OpenApiBuilder
@@ -4236,6 +4236,7 @@ class ErrorCode
4236
4236
const OPERATION_FORBIDDEN = 1014 ;
4237
4237
const OPERATION_NOT_SUPPORTED = 1015 ;
4238
4238
const TEMPORARY_OR_PERMANENTLY_BLOCKED = 1016 ;
4239
+ const BAD_OR_MISSING_XSRF_TOKEN = 1017 ;
4239
4240
4240
4241
private $ values = [
4241
4242
9999 => ["%s " , Response::INTERNAL_SERVER_ERROR ],
@@ -4256,6 +4257,7 @@ class ErrorCode
4256
4257
1014 => ["Operation forbidden " , Response::FORBIDDEN ],
4257
4258
1015 => ["Operation '%s' not supported " , Response::METHOD_NOT_ALLOWED ],
4258
4259
1016 => ["Temporary or permanently blocked " , Response::FORBIDDEN ],
4260
+ 1017 => ["Bad or missing XSRF token " , Response::FORBIDDEN ],
4259
4261
];
4260
4262
4261
4263
public function __construct (int $ code )
@@ -5029,8 +5031,8 @@ public function __construct(Config $config)
5029
5031
case 'authorization ' :
5030
5032
new AuthorizationMiddleware ($ router , $ responder , $ properties , $ reflection );
5031
5033
break ;
5032
- case 'auth0 ' :
5033
- new Auth0Middleware ($ router , $ responder , $ properties, $ reflection );
5034
+ case 'xsrf ' :
5035
+ new XsrfMiddleware ($ router , $ responder , $ properties );
5034
5036
break ;
5035
5037
case 'customization ' :
5036
5038
new CustomizationMiddleware ($ router , $ responder , $ properties , $ reflection );
@@ -5395,7 +5397,7 @@ public function getHeader(String $key): String
5395
5397
return $ this ->headers [$ key ];
5396
5398
}
5397
5399
if ($ this ->highPerformance ) {
5398
- $ serverKey = 'HTTP_ ' . strtoupper (str_replace ('_ ' , '- ' , $ key ));
5400
+ $ serverKey = 'HTTP_ ' . strtoupper (str_replace ('- ' , '_ ' , $ key ));
5399
5401
if (isset ($ _SERVER [$ serverKey ])) {
5400
5402
return $ _SERVER [$ serverKey ];
5401
5403
}
@@ -5522,6 +5524,7 @@ public function __toString(): String
5522
5524
'username ' => 'php-crud-api ' ,
5523
5525
'password ' => 'php-crud-api ' ,
5524
5526
'database ' => 'php-crud-api ' ,
5527
+ 'middlewares ' => 'xsrf ' ,
5525
5528
]);
5526
5529
$ request = new Request ();
5527
5530
$ api = new Api ($ config );
0 commit comments