LoginController   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 96
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 27
c 3
b 0
f 0
dl 0
loc 96
ccs 0
cts 30
cp 0
rs 10
wmc 9

5 Methods

Rating   Name   Duplication   Size   Complexity  
A callback() 0 19 2
A redirect() 0 13 4
A home() 0 8 1
A logout() 0 5 1
A __construct() 0 3 1
1
<?php
2
3
namespace App\Http\Controllers;
4
5
use App\Interfaces\LoginServiceInterface;
6
use Illuminate\Http\Request;
7
use Illuminate\Support\Arr;
8
use Illuminate\Support\Facades\Auth;
9
10
class LoginController extends Controller
11
{
12
    /**
13
     * Login Service.
14
     *
15
     * @var LoginServiceInterface
16
     */
17
    private LoginServiceInterface $service;
18
19
    /**
20
     * LoginController constructor.
21
     *
22
     * @param  LoginServiceInterface  $service
23
     */
24
    public function __construct(LoginServiceInterface $service)
25
    {
26
        $this->service = $service;
27
    }
28
29
    /**
30
     * Socialite integrations provider selection to authenticate.
31
     *
32
     * @param  Request  $request
33
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
34
     */
35
    public function home(Request $request)
36
    {
37
        $allParams = $request->all();
38
        $request->session()->flash('client', $allParams);
39
40
        $params = http_build_query($allParams);
41
42
        return view('login', compact('params'));
43
    }
44
45
    /**
46
     * Redirect the user to the provider authentication page.
47
     *
48
     * @param  string  $provider
49
     * @param  Request  $request
50
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
51
     */
52
    public function redirect(string $provider, Request $request)
53
    {
54
        try {
55
            $client = collect($request->session()->get('client'));
56
            if ($client->has('state') && $client->has('redirect_uri')) {
57
                $request->session()->reflash();
58
            } else {
59
                $request->session()->flash('client', $request->all());
60
            }
61
62
            return $this->service->redirect($provider);
63
        } catch (\Exception $exception) {
64
            abort(404);
65
        }
66
    }
67
68
    /**
69
     * Obtain the user information from the provider.
70
     *
71
     * @param  string  $provider
72
     * @param  Request  $request
73
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
74
     */
75
    public function callback(string $provider, Request $request)
76
    {
77
        $client = $request->session()->get('client', []);
78
        $user = $this->service->callback($provider, $client);
79
        $URI = Arr::get($client, 'redirect_uri', false);
80
81
        /**
82
         * Authorize user before redirection, it's required for PKCE
83
         * it will also remember the client user.
84
         */
85
        Auth::login($user, true);
86
87
        $query = http_build_query([
88
            'user' => $user->toArray(),
89
            'access_token' => $this->service->createToken($user),
90
            'state' => Arr::get($client, 'state', null),
91
        ]);
92
93
        return $URI ? redirect("$URI?{$query}") : redirect('/');
94
    }
95
96
    /**
97
     * Logout current user.
98
     *
99
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
100
     */
101
    public function logout()
102
    {
103
        Auth::logout();
104
105
        return redirect('/');
106
    }
107
}
108