1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Source\Controllers; |
4
|
|
|
|
5
|
|
|
use stdClass; |
6
|
|
|
use Source\Core\Request; |
7
|
|
|
use Source\Core\Response; |
8
|
|
|
use Source\Core\Token; |
9
|
|
|
use Source\Core\Redis; |
10
|
|
|
use Source\Models\User; |
11
|
|
|
use Source\Core\Rabbit\RabbitSender; |
12
|
|
|
|
13
|
|
|
class Auth |
14
|
|
|
{ |
15
|
|
|
private $Message; |
16
|
|
|
|
17
|
|
|
private $Request; |
18
|
|
|
|
19
|
|
|
public function __construct() |
20
|
|
|
{ |
21
|
|
|
$this->Message = new stdClass(); |
22
|
|
|
$this->Request = new Request(); |
23
|
|
|
} |
24
|
|
|
|
25
|
|
|
public function login($data) |
26
|
|
|
{ |
27
|
|
|
$data = filter_var_array($data, FILTER_SANITIZE_STRIPPED); |
28
|
|
|
|
29
|
|
|
$email = filter_var($data["email"], FILTER_VALIDATE_EMAIL); |
30
|
|
|
$passwd = filter_var($data["password"], FILTER_DEFAULT); |
31
|
|
|
|
32
|
|
|
if (!$email || !$passwd) { |
33
|
|
|
$this->Message->message = 'Informe seu e-mail e senha para logar'; |
34
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
35
|
|
|
return; |
36
|
|
|
} |
37
|
|
|
|
38
|
|
|
$User = new User(); |
39
|
|
|
|
40
|
|
|
$result = $User->findByEmail($email); |
41
|
|
|
|
42
|
|
|
if (!$result || $result == null) { |
43
|
|
|
$this->Message->message = 'E-mail ou senha inválido'; |
44
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
45
|
|
|
return; |
46
|
|
|
} |
47
|
|
|
|
48
|
|
|
if (!password_verify($passwd, $result->password)) { |
49
|
|
|
$this->Message->message = 'E-mail ou senha inválido'; |
50
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
51
|
|
|
return; |
52
|
|
|
} |
53
|
|
|
|
54
|
|
|
$jwt = new stdClass(); |
55
|
|
|
$jwt->id = $result->id; |
|
|
|
|
56
|
|
|
$jwt->email = $result->email; |
57
|
|
|
|
58
|
|
|
$this->Message->message = 'login successful'; |
59
|
|
|
$this->Message->token = (new Token())->generateNewToken($jwt); |
60
|
|
|
|
61
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
62
|
|
|
} |
63
|
|
|
|
64
|
|
|
public function register($data) |
65
|
|
|
{ |
66
|
|
|
$data = filter_var_array($data, FILTER_SANITIZE_STRIPPED); |
67
|
|
|
|
68
|
|
|
$email = filter_var($data["email"], FILTER_VALIDATE_EMAIL); |
69
|
|
|
$passwd = filter_var($data["password"], FILTER_DEFAULT); |
70
|
|
|
$first_name = filter_var($data["first_name"], FILTER_DEFAULT); |
71
|
|
|
$last_name = filter_var($data["last_name"], FILTER_DEFAULT); |
72
|
|
|
|
73
|
|
|
if (!$email || !$passwd) { |
74
|
|
|
$this->Message->message = 'Informe um e-mail e uma senha para se cadastrar!'; |
75
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
76
|
|
|
return; |
77
|
|
|
} |
78
|
|
|
|
79
|
|
|
if (!$first_name) { |
80
|
|
|
$this->Message->message = 'Informe seu primeiro nome para se cadastrar!'; |
81
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
82
|
|
|
return; |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
if (!$last_name) { |
86
|
|
|
$this->Message->message = 'Informe seu ultimo nome para se cadastrar!'; |
87
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
88
|
|
|
return; |
89
|
|
|
} |
90
|
|
|
|
91
|
|
|
$User = new User(); |
92
|
|
|
|
93
|
|
|
$User->first_name = $first_name; |
|
|
|
|
94
|
|
|
$User->last_name = $last_name; |
|
|
|
|
95
|
|
|
$User->email = $email; |
|
|
|
|
96
|
|
|
$User->password = $passwd; |
|
|
|
|
97
|
|
|
|
98
|
|
|
if (!$User->save()) { |
99
|
|
|
$this->Message->message = $User->message(); |
100
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
101
|
|
|
return; |
102
|
|
|
} |
103
|
|
|
|
104
|
|
|
$result = $User->data(); |
105
|
|
|
|
106
|
|
|
$jwt = new stdClass(); |
107
|
|
|
$jwt->id = $result->id; |
108
|
|
|
$jwt->email = $result->email; |
109
|
|
|
|
110
|
|
|
$this->Message->message = 'registered with success'; |
111
|
|
|
$this->Message->token = (new Token())->generateNewToken($jwt); |
112
|
|
|
|
113
|
|
|
(new RabbitSender('email', 'email'))->sendMessage(json_encode([ |
114
|
|
|
'type' => 'confirmEmail', |
115
|
|
|
'content' => [ |
116
|
|
|
'email' => $result->email |
117
|
|
|
] |
118
|
|
|
])); |
119
|
|
|
|
120
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
121
|
|
|
} |
122
|
|
|
|
123
|
|
|
public function forget($data) |
124
|
|
|
{ |
125
|
|
|
$email = filter_var($data["email"], FILTER_VALIDATE_EMAIL); |
126
|
|
|
|
127
|
|
|
if (!$email) { |
128
|
|
|
$this->Message->message = 'Informe um e-mail valido para continuar'; |
129
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
130
|
|
|
return; |
131
|
|
|
} |
132
|
|
|
|
133
|
|
|
$User = new User(); |
134
|
|
|
|
135
|
|
|
if (($User = $User->findByEmail($email))) { |
136
|
|
|
$forget = (md5(uniqid(rand(), true))); |
137
|
|
|
|
138
|
|
|
$User->forget = $forget; |
|
|
|
|
139
|
|
|
$User->save(); |
140
|
|
|
|
141
|
|
|
/*********************** ************************/ |
142
|
|
|
// fazer um push para o rabbit na fila de email // |
143
|
|
|
/*********************** ************************/ |
144
|
|
|
|
145
|
|
|
(new RabbitSender('email', 'email'))->sendMessage(json_encode([ |
146
|
|
|
'type' => 'resetPassword', |
147
|
|
|
'content' => [ |
148
|
|
|
'email' => $email, |
149
|
|
|
'forget' => $forget |
150
|
|
|
] |
151
|
|
|
])); |
152
|
|
|
|
153
|
|
|
$this->Message->message = 'Enviamos um link de recuperação para seu e-mail'; |
154
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
155
|
|
|
return; |
156
|
|
|
} |
157
|
|
|
|
158
|
|
|
$User = new User(); |
159
|
|
|
$User->forget = (md5(uniqid(rand(), true))); |
160
|
|
|
|
161
|
|
|
$this->Message->message = 'Enviamos um link de recuperação para seu e-mail'; |
162
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
163
|
|
|
} |
164
|
|
|
|
165
|
|
|
public function reset($data) |
166
|
|
|
{ |
167
|
|
|
$data = filter_var_array($data, FILTER_SANITIZE_STRIPPED); |
168
|
|
|
|
169
|
|
|
$email = filter_var($data["email"], FILTER_VALIDATE_EMAIL); |
170
|
|
|
$forget = filter_var($data["forget"], FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^[a-f0-9]{32}$/"]]); |
171
|
|
|
|
172
|
|
|
if (!$email || !$forget) { |
173
|
|
|
$this->Message->message = 'Entrada inválida'; |
174
|
|
|
(new Response())->setStatusCode(HTTP_UNAUTHORIZED)->send($this->Message); |
175
|
|
|
return; |
176
|
|
|
} |
177
|
|
|
|
178
|
|
|
$User = new User(); |
179
|
|
|
|
180
|
|
|
$result = $User->find("email = :e AND forget = :f", "e={$email}&f={$forget}", "id")->fetch(); |
181
|
|
|
|
182
|
|
|
if (!$result || $result == null) { |
183
|
|
|
$this->Message->message = 'Entrada inválida'; |
184
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
185
|
|
|
return; |
186
|
|
|
} |
187
|
|
|
|
188
|
|
|
$passwd = filter_var($data["password"], FILTER_DEFAULT); |
189
|
|
|
$passwdRepeat = filter_var($data["passwordRepeat"], FILTER_DEFAULT); |
190
|
|
|
|
191
|
|
|
if (!$passwd || !$passwdRepeat) { |
192
|
|
|
$this->Message->message = 'Informe e repita sua nova senha!'; |
193
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
194
|
|
|
return; |
195
|
|
|
} |
196
|
|
|
|
197
|
|
|
if ($passwd != $passwdRepeat) { |
198
|
|
|
$this->Message->message = 'As senhas nao batem!'; |
199
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
200
|
|
|
return; |
201
|
|
|
} |
202
|
|
|
|
203
|
|
|
$result = $result->data(); |
204
|
|
|
|
205
|
|
|
$User = new User(); |
206
|
|
|
$User = $User->findById($result->id); |
207
|
|
|
|
208
|
|
|
$User->forget = null; |
|
|
|
|
209
|
|
|
$User->password = $passwd; |
|
|
|
|
210
|
|
|
|
211
|
|
|
if (!$User->save()) { |
|
|
|
|
212
|
|
|
$this->Message->message = $User->message(); |
213
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
214
|
|
|
return; |
215
|
|
|
} |
216
|
|
|
|
217
|
|
|
$jwt = new stdClass(); |
218
|
|
|
$jwt->id = $User->id; |
|
|
|
|
219
|
|
|
$jwt->email = $User->email; |
|
|
|
|
220
|
|
|
|
221
|
|
|
$this->Message->message = 'password altered with success'; |
222
|
|
|
$this->Message->token = (new Token())->generateNewToken($jwt); |
223
|
|
|
|
224
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
225
|
|
|
} |
226
|
|
|
|
227
|
|
|
public function logoff() |
228
|
|
|
{ |
229
|
|
|
$token = (object) $this->validateLogin(); |
230
|
|
|
|
231
|
|
|
$Redis = (new Redis())->getClient(); |
232
|
|
|
|
233
|
|
|
if ($Redis->del($token->id . $token->expirationTime) === 0) { |
234
|
|
|
$this->Message->message = 'Ocorreu algum erro!'; |
235
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
236
|
|
|
return; |
237
|
|
|
} |
238
|
|
|
|
239
|
|
|
$this->Message->message = 'Você saiu com sucesso volte logo =)'; |
240
|
|
|
(new Response())->setStatusCode(HTTP_OK)->send($this->Message); |
241
|
|
|
} |
242
|
|
|
|
243
|
|
|
public function validateLogin() |
244
|
|
|
{ |
245
|
|
|
if (!($jwt = $this->Request->getToken())) { |
246
|
|
|
$this->Message->message = $this->Request->getError(); |
247
|
|
|
(new Response())->setStatusCode(HTTP_UNAUTHORIZED)->send($this->Message); |
248
|
|
|
exit; |
|
|
|
|
249
|
|
|
} |
250
|
|
|
|
251
|
|
|
$validToken = ($Token = new Token())->validateToken($jwt); |
252
|
|
|
|
253
|
|
|
if (!$validToken) { |
254
|
|
|
$this->Message->message = $Token->getError(); |
255
|
|
|
(new Response())->setStatusCode(HTTP_UNAUTHORIZED)->send($this->Message); |
256
|
|
|
exit; |
|
|
|
|
257
|
|
|
} |
258
|
|
|
|
259
|
|
|
return $Token->getToken(); |
260
|
|
|
} |
261
|
|
|
} |
262
|
|
|
|