Skip to content

Commit 5a8e8c1

Browse files
authored
Merge pull request #15
Jwt auth
2 parents f36e8fb + bfb5e98 commit 5a8e8c1

File tree

14 files changed

+307
-82
lines changed

14 files changed

+307
-82
lines changed

app/Controllers/BlockController.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\Models\Block;
66
use Core\Http\Controllers\Controller;
77
use Core\Http\Request;
8+
use Exception;
89

910
use function array_map;
1011
use function is_null;
@@ -30,8 +31,7 @@ public function create(Request $request): void
3031
{
3132
$image = ($_FILES['photo'] ?? null);
3233
$params = $request->getBody();
33-
unset($params['PHPSESSID']);
34-
$block = new Block($params);
34+
$block = new Block(['name' => $params['name']]);
3535

3636
if ($block->isValid()) {
3737
if ($block->save()) {
@@ -111,10 +111,20 @@ public function imageUpdate(Request $request): void
111111

112112
public function destroy(Request $request): void
113113
{
114-
$params = $request->getParams();
115-
$block = Block::findById($params['id']);
116-
$block->destroy();
114+
try {
115+
$params = $request->getParams();
116+
$block = Block::findById($params['id']);
117+
118+
if (!$block) {
119+
echo json_encode(['error' => 'Bloco não encontrado']);
120+
return;
121+
}
122+
123+
$block->destroy();
117124

118-
echo json_encode(['success' => 'deletado com sucesso']);
125+
echo json_encode(['success' => 'Deletado com sucesso']);
126+
} catch (Exception $e) {
127+
echo json_encode(['error' => $e->getMessage()]);
128+
}
119129
}
120130
}

app/Controllers/ClassRoomController.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
use Core\Database\Database;
99
use Core\Http\Controllers\Controller;
1010
use Core\Http\Request;
11+
use Exception;
1112
use PDO;
13+
use PDOException;
1214

1315
use function is_null;
1416
use function json_encode;
@@ -88,10 +90,20 @@ public function update(Request $request): void
8890

8991
public function destroy(Request $request): void
9092
{
91-
$params = $request->getParams();
92-
$block = Block::findById($params['id']);
93-
$block->destroy();
93+
try {
94+
$params = $request->getParams();
95+
$classroom = ClassRoom::findById($params['id']);
96+
97+
if (!$classroom) {
98+
echo json_encode(['error' => 'Bloco não encontrado']);
99+
return;
100+
}
94101

95-
echo json_encode(['success' => 'deletado com sucesso']);
102+
$classroom->destroy();
103+
104+
echo json_encode(['success' => 'Deletado com sucesso']);
105+
} catch (Exception $e) {
106+
echo json_encode(['error' => $e->getMessage()]);
107+
}
96108
}
97109
}

app/Controllers/HomeController.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ class HomeController extends Controller
2121
{
2222
public function index(Request $request): void
2323
{
24-
2524
$params = $request->getParams();
2625
$date = date('Y-m-d');
2726
if (isset($params['date'])) {

app/Controllers/SchedulesController.php

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Controllers;
44

55
use App\Enums\RolesEnum;
6+
use App\Models\Block;
67
use App\Models\ClassRoom;
78
use App\Models\Roles;
89
use App\Models\Schedules;
@@ -52,9 +53,8 @@ public function index(): void
5253

5354
public function byProfessorId(Request $request): void
5455
{
55-
56-
$id = $request->getParams()['id'];
57-
$allSchedules = Schedules::byProfessorId($id);
56+
$userId = (Auth::user()->id);
57+
$allSchedules = Schedules::byProfessorId($userId);
5858
$schedulesArray = array_map(function ($schedule) {
5959
return [
6060
'id' => $schedule->id,
@@ -259,9 +259,21 @@ public function roomChange(Request $request): void
259259

260260
public function delete(Request $request): void
261261
{
262-
$params = $request->getParams();
263-
$subject = Schedules::findById($params['id']);
264-
$subject->destroy();
262+
try {
263+
$params = $request->getParams();
264+
$schedule = Schedules::findById($params['id']);
265+
266+
if (!$schedule) {
267+
echo json_encode(['error' => 'Bloco não encontrado']);
268+
return;
269+
}
270+
271+
$schedule->destroy();
272+
273+
echo json_encode(['success' => 'Deletado com sucesso']);
274+
} catch (Exception $e) {
275+
echo json_encode(['error' => $e->getMessage()]);
276+
}
265277
}
266278

267279
public function validatesDateConflict(Schedules $schedule): bool

app/Controllers/SubjectController.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
namespace App\Controllers;
44

5+
use App\Models\Block;
56
use App\Models\Subject;
67
use Core\Http\Controllers\Controller;
78
use Core\Http\Request;
9+
use Exception;
810

911
use function array_map;
1012
use function is_null;
@@ -84,10 +86,20 @@ public function update(Request $request): void
8486

8587
public function destroy(Request $request): void
8688
{
87-
$params = $request->getParams();
88-
$subject = Subject::findById($params['id']);
89-
$subject->destroy();
89+
try {
90+
$params = $request->getParams();
91+
$subject = Subject::findById($params['id']);
92+
93+
if (!$subject) {
94+
echo json_encode(['error' => 'Bloco não encontrado']);
95+
return;
96+
}
97+
98+
$subject->destroy();
9099

91-
echo json_encode(['success' => 'deletado com sucesso']);
100+
echo json_encode(['success' => 'Deletado com sucesso']);
101+
} catch (Exception $e) {
102+
echo json_encode(['error' => $e->getMessage()]);
103+
}
92104
}
93105
}

app/Controllers/UsersController.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
use App\Models\User;
77
use Core\Http\Controllers\Controller;
88
use Core\Http\Request;
9+
use Firebase\JWT\JWT;
910
use Lib\Authentication\Auth;
1011

1112
use function array_map;
13+
use function getenv;
1214
use function hash;
1315
use function json_encode;
1416
use function password_hash;
@@ -39,10 +41,18 @@ public function login(Request $request): void
3941
if ($user && $user->authenticate($params['password'])) {
4042
Auth::login($user);
4143

44+
$payload = [
45+
"iss" => "http://localhost",
46+
"aud" => "http://localhost",
47+
"iat" => time(),
48+
"exp" => time() + (60 * 60),
49+
"user_id" => $user->id
50+
];
51+
$token = JWT::encode($payload, $_ENV['PASSWORD_KEY_HASH'], 'HS256');
4252
echo json_encode([
4353
'success' => 'Logado com sucesso',
4454
'role' => $user->roleName(),
45-
'token' => $user->id
55+
'token' => $token
4656
]);
4757
} else {
4858
http_response_code(400);

app/Middleware/AdminRole.php

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,62 @@
22

33
namespace App\Middleware;
44

5+
use App\Models\User;
56
use Core\Exceptions\HTTPException;
67
use Core\Http\Middleware\Middleware;
78
use Core\Http\Request;
9+
use Exception;
10+
use Firebase\JWT\JWT;
11+
use Firebase\JWT\Key;
812
use Lib\Authentication\Auth;
913

14+
use function dd;
15+
use function getenv;
16+
use function http_response_code;
17+
use function json_encode;
18+
use function str_replace;
19+
1020
class AdminRole implements Middleware
1121
{
1222
public function handle(Request $request): void
1323
{
14-
if (Auth::user()->role_id != 1) {
24+
$headers = getallheaders();
25+
if (!isset($headers['Authorization'])) {
26+
http_response_code(401);
27+
echo json_encode(["error" => "Token não fornecido"]);
28+
exit();
29+
}
30+
31+
$token = str_replace('Bearer ', '', $headers['Authorization']);
32+
$data = $this->validatesToken($token);
33+
$user = User::findById($data['user_id']);
34+
35+
if ($user->role_id != 1) {
1536
header('Content-Type: application/json', true, 401);
1637
echo json_encode(['error' => 'Acesso restrito a admnistradores']);
1738
exit;
1839
}
1940
}
41+
42+
/**
43+
*
44+
* @param string $token
45+
* @return array<string, mixed>|null
46+
*/
47+
48+
public function validatesToken(string $token): ?array
49+
{
50+
$key = $_ENV['PASSWORD_KEY_HASH'] ?? getenv('PASSWORD_KEY_HASH');
51+
52+
if (!$key) {
53+
return null;
54+
}
55+
56+
try {
57+
$decoded = JWT::decode($token, new Key($key, 'HS256'));
58+
return (array) $decoded;
59+
} catch (Exception $e) {
60+
return null;
61+
}
62+
}
2063
}

app/Middleware/Authenticate.php

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,54 @@
55
use Core\Exceptions\HTTPException;
66
use Core\Http\Middleware\Middleware;
77
use Core\Http\Request;
8+
use Exception;
9+
use Firebase\JWT\JWT;
10+
use Firebase\JWT\Key;
811
use Lib\Authentication\Auth;
912

13+
use function dd;
14+
use function glob;
15+
1016
class Authenticate implements Middleware
1117
{
1218
public function handle(Request $request): void
1319
{
14-
if (!Auth::check()) {
15-
header('Content-Type: application/json', true, 401);
16-
echo json_encode(['error' => 'Você precisa estar autenticado para acessar esta página.']);
17-
exit;
20+
$headers = getallheaders();
21+
if (!isset($headers['Authorization'])) {
22+
http_response_code(401);
23+
echo json_encode(["error" => "Token não fornecido"]);
24+
exit();
25+
}
26+
27+
$token = str_replace('Bearer ', '', $headers['Authorization']);
28+
$data = $this->validatesToken($token);
29+
30+
if (!$data) {
31+
http_response_code(401);
32+
echo json_encode(["error" => "Token inválido"]);
33+
exit();
34+
}
35+
36+
// echo json_encode(["message" => "Autorizado", "user" => $data]);
37+
}
38+
/**
39+
*
40+
* @param string $token
41+
* @return array<string, mixed>|null
42+
*/
43+
public function validatesToken(string $token): ?array
44+
{
45+
$key = $_ENV['PASSWORD_KEY_HASH'] ?? getenv('PASSWORD_KEY_HASH');
46+
47+
if (!$key) {
48+
return null;
49+
}
50+
51+
try {
52+
$decoded = JWT::decode($token, new Key($key, 'HS256'));
53+
return (array) $decoded;
54+
} catch (Exception $e) {
55+
return null;
1856
}
1957
}
2058
}

composer.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,8 @@
1717
"phpunit/phpunit": "^11.1",
1818
"squizlabs/php_codesniffer": "*",
1919
"phpstan/phpstan": "^1.10"
20+
},
21+
"require": {
22+
"firebase/php-jwt": "^6.11"
2023
}
2124
}

0 commit comments

Comments
 (0)