Projekt

Obecné

Profil

« Předchozí | Další » 

Revize a800985e

Přidáno uživatelem Cajova-Houba před téměř 7 roky(ů)

refs #6742: Pridan middleware pro kontrolu JWT.

Zobrazit rozdíly:

backend/.env
12 12
CACHE_DRIVER=memcached
13 13
QUEUE_DRIVER=sync
14 14

  
15

  
16
# ==============
17
# Nastaveni JWT
18
# ==============
15 19
# doba platnosti JWT v sekundach
16 20
JWT_DURATION=1800
21

  
17 22
# JWT iss parametr
18 23
JWT_ISS=aswi-doprava
24

  
25
# Tajny klic pro sifrovani JWT
19 26
JWT_SECRET=asdfkeylol
27

  
28
# zapnuti/vypnuti JWT overovani
29
JWT_AUTH_ENABLED=true
30

  
31
# nazev polozky v hlavicce http requestu ktera obsahuje JWT
32
JWT_HEADER_NAME=jwt
backend/app/Http/Controllers/TokenController.php
9 9
namespace App\Http\Controllers;
10 10

  
11 11
use \Firebase\JWT\JWT;
12
use Illuminate\Http\Request;
12 13

  
13 14
class TokenController extends Controller
14 15
{
15 16
    /**
16 17
     * Vygeneruje nový token pro JWT autorizaci.
17 18
     */
18
    public function generateToken() {
19
    public function generateToken(Request $request) {
19 20
        $duration = env('JWT_DURATION', 1800);
20 21

  
21 22
        // parametry jwt
......
28 29
        $token = array(
29 30
            'iss' => $iss,
30 31
            'iat' => $iat,
31
            'exp' => $exp
32
            'exp' => $exp,
33
            'ipaddr' => $request->ip(),
34
            'user-agent' => $request->header('User-Agent')
32 35
        );
33 36

  
34
        $jwt = JWT::encode($token, $key);
37
        $jwt = JWT::encode($token, $key, 'HS256');
35 38

  
36 39
        return $jwt;
37 40
    }
backend/app/Http/Middleware/JWTAuthenticate.php
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: Zdenda
5
 * Date: 29.4.2018
6
 * Time: 11:26
7
 */
8

  
9
namespace App\Http\Middleware;
10

  
11
use Closure;
12
use Firebase\JWT\JWT;
13
use Illuminate\Http\Request;
14

  
15
/**
16
 * Middleware slouzici ke kontrole JWT v hlavicce requestu (pokud je JWT overovani zapnute).
17
 *
18
 * @package App\Http\Middleware
19
 */
20
class JWTAuthenticate
21
{
22
    public function handle(Request $request, Closure $next) {
23
        // pokud je JWT overovani vypnute, nedelej nic
24
        if(!env('JWT_AUTH_ENABLED')) {
25
            return $next($request);
26
        }
27

  
28
        $jwtHeaderName = env('JWT_HEADER_NAME', 'jwt');
29
        $jwt = $request->header($jwtHeaderName);
30
        if ($jwt == null) {
31
            // token chybi
32
            return response('Unauthorized.', 401);
33
        }
34

  
35
        $key = env('JWT_SECRET', '');
36
        $decoded = null;
37
        try {
38
            $decoded = JWT::decode($jwt, $key, array('HS256'));
39
        } catch (\Exception $ex ) {
40
            // jakakoliv chyba pri dekodovani (i expirace) => 401
41
            return response('Unauthorized.', 401);
42
        }
43

  
44
        // kontrola, ze token nebyl odcizen: musi sedet ip a prohlizec odesilatele
45
        $decoded_array = (array) $decoded;
46

  
47
        if($this->checkJwt($request, $decoded_array)) {
48
            return $next($request);
49
        } else {
50
            return response('Unauthorized.', 401);
51
        }
52
    }
53

  
54
    /**
55
     * Zkontroluje jwt rozkodovany do pole proti hodnotam z requestu. Pokud hodnoty nesedi vrati false.
56
     * Expirovani tokenu zde neni kontrolovano - melo by byt uz pri dekodovani tokenu.
57
     *
58
     * @param Request $request Request.
59
     * @param array $jwt JWT rozkodovany do pole.
60
     * @return True pokud je JWT v poradku, false pokud ne.
61
     */
62
    private function checkJwt(Request $request, array $jwt) {
63
        $ip = $request->ip();
64
        $userAgent = $request->header('User-Agent');
65
        if (!array_key_exists('ipaddr', $jwt) || ! array_key_exists('user-agent', $jwt)) {
66
            return false;
67
        }
68
        if($ip != $jwt['ipaddr'] || $userAgent != $jwt['user-agent']) {
69
            return false;
70
        }
71

  
72
        return true;
73
    }
74
}
backend/app/Http/routes.php
25 25
 * address
26 26
 * showDirection
27 27
 */
28
$app->get($apiUrlRoot.'devices', 'DeviceController@getDevice');
28
$app->get($apiUrlRoot.'devices', [
29
    'middleware' => 'jwtauth',
30
    'uses' => 'DeviceController@getDevice'
31
]);
29 32

  
30
//$app->get($apiUrlRoot.'devices/all', 'DeviceController@getAll');
31 33

  
32 34
/**
33 35
 * Parametry v url:
......
37 39
 * timeTo
38 40
 * direction
39 41
 */
40
$app->get($apiUrlRoot.'devices/{id}', 'DeviceController@getDeviceById');
42
$app->get($apiUrlRoot.'devices/{id}', [
43
    'middleware' => 'jwtauth',
44
    'uses' => 'DeviceController@getDeviceById'
45
]);
46

  
41 47

  
42 48
/**
43 49
 * Vrati vsechny typy aut.
44 50
 */
45
$app->get($apiUrlRoot.'vehicles', 'VehicleController@getAll');
51
$app->get($apiUrlRoot.'vehicles', [
52
    'middleware' => 'jwtauth',
53
    'uses' => 'VehicleController@getAll'
54
]);
46 55

  
47 56
/**
48 57
 * Vrati vsechna mesta.
49 58
 */
50
$app->get($apiUrlRoot.'cities', 'LocationController@getCities');
59
$app->get($apiUrlRoot.'cities', [
60
    'middleware' => 'jwtauth',
61
    'uses' => 'LocationController@getCities'
62
]);
51 63

  
52 64
/**
53 65
 * Vygeneruje novy JWT s omezenou platnosti.
backend/bootstrap/app.php
59 59
|
60 60
*/
61 61

  
62
$app->routeMiddleware([
63
    'jwtauth' => App\Http\Middleware\JWTAuthenticate::class,
64
]);
65

  
62 66
// $app->middleware([
63 67
//    App\Http\Middleware\ExampleMiddleware::class
64 68
// ]);

Také k dispozici: Unified diff