Projekt

Obecné

Profil

Stáhnout (2.1 KB) Statistiky
| Větev: | Revize:
1 a800985e Cajova-Houba
<?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
}