Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 35
AuthConnector
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
240
0.00% covered (danger)
0.00%
0 / 35
 handle
0.00% covered (danger)
0.00%
0 / 1
90
0.00% covered (danger)
0.00%
0 / 28
 isCheckSystemsToken
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 7
1<?php
2
3namespace Qmp\Laravel\AuthConnector\Middleware;
4
5use Illuminate\Http\Exceptions\HttpResponseException;
6use Closure;
7use Illuminate\Support\Facades\Log;
8use Qmp\Laravel\AuthConnector\Connector\ConnectorInterface;
9
10class AuthConnector
11{
12    /**
13     * @param $request
14     * @param Closure $next
15     * @return mixed
16     */
17    public function handle($request, Closure $next)
18    {
19        try {
20            $token = str_replace('Bearer ', '', $request->token ? $request->token : $request->bearerToken());
21
22            $isSystemToken = false;
23            $user = null;
24            $ttl = null;
25            if ($this->isCheckSystemsToken($token)) {
26                $isSystemToken = true;
27            } else {
28                $connector = resolve(ConnectorInterface::class);
29                $user = $connector->getUser($token);
30                $ttl = $connector->getTtl();
31            }
32        } catch (\Exception $e) {
33            Log::debug('AuthConnector: ' . $e->getMessage() . $e->getTraceAsString());
34            throw new HttpResponseException(response()->json(['status' => 'ko', 'error' => 'Unauthenticated'], 403));
35        }
36
37        if ($isSystemToken) {
38            $request->merge([
39                'auth_user_id' => 0,
40                'auth_type' => 'system'
41            ]);
42        } else {
43            if (!$user || !isset($user['id'])) {
44                throw new HttpResponseException(response()->json(['status' => 'ko', 'error' => 'Unauthenticated'], 403));
45            }
46    
47            $authType = strtolower((new \ReflectionClass($connector))->getShortName());
48            if ($authType !== 'external') {
49                $authType = 'internal';
50            }
51            $request->merge([
52                'auth_user_id' => $user['id'],
53                'auth_type' => $authType
54            ]);
55        }
56
57        $response =  $next($request);
58
59        $response->headers->set('Authorization', 'Bearer ' . $token);
60
61        if ($ttl) {
62            $response->headers->set('Expiration-time', $ttl);
63        }
64
65        return $response;
66    }
67
68    private function isCheckSystemsToken(string $token)
69    {
70        if (!empty($token)) {
71            $externalSystemToken = config('auth_service.external_system_token');
72            if ($externalSystemToken) {
73                foreach($externalSystemToken as $systme => $configToken) {
74                    if ($configToken && $configToken === $token) {
75                        return true;
76                    }
77                }
78            }
79        }
80
81        return false;
82    }
83}