Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 35 |
AuthConnector | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
240 | |
0.00% |
0 / 35 |
handle | |
0.00% |
0 / 1 |
90 | |
0.00% |
0 / 28 |
|||
isCheckSystemsToken | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 7 |
1 | <?php |
2 | |
3 | namespace Qmp\Laravel\AuthConnector\Middleware; |
4 | |
5 | use Illuminate\Http\Exceptions\HttpResponseException; |
6 | use Closure; |
7 | use Illuminate\Support\Facades\Log; |
8 | use Qmp\Laravel\AuthConnector\Connector\ConnectorInterface; |
9 | |
10 | class 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 | } |