File: /home/imensosw/www/ezwork/app/Http/Controllers/AuthController.php
<?php
/**
* AuthController class file
*
* PHP Version 7.2
*
* @category Controller
* @package Ez
* @author Imenso Software <admin@imensosoftware.com>
* @license http://imensosoftware/license.php GNU Public License
* @link http://imensosoftware.com/recipes
*/
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Auth\Events\Registered;
use Hash;
use Illuminate\Support\Facades\Log;
use App\Rules\Isactive ;
use App\Rules\Emailverification ;
use DB;
use Carbon\Carbon;
//use Illuminate\Auth\Events\PasswordReset;
/**
* AuthController class
*
* The class manage Authentication
*
* @category AuthController
* @package Ez
* @author Imenso Software <admin@imensosoftware.com>
* @license http://imensosoftware/license.php GNU Public License
* @link http://imensosoftware.com/recipes
*/
class AuthController extends Controller
{
use SendsPasswordResetEmails, ResetsPasswords {
SendsPasswordResetEmails::broker insteadof ResetsPasswords;
ResetsPasswords::credentials insteadof SendsPasswordResetEmails;
}
// use SendsPasswordResetEmails;
// use ResetsPasswords;
/**
* Register function create a new user instance after a valid registration
* and return json.
*
* @param \Illuminate\Http\Request request
* @return json
*/
public function register(Request $request)
{
$v = Validator::make(
$request->all(),
[
'fname' => 'required',
'lname' => 'required',
'mobile_country_code_id' => 'required',
'mobile_no' => 'required|digits:10',
'email' =>
[
'required',
'max:255',
'email',
'regex:/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix',
'unique:users'
],
'password' =>
[
'required',
'min:8', // must be at least 6 characters in length
'regex:/[a-z]/', // must contain at least one lowercase letter
'regex:/[A-Z]/', // must contain at least one uppercase letter
'regex:/[0-9]/', // must contain at least one digit
'regex:/[@$!%*#?&]/', // must contain a special character
'confirmed'
],
],
[
'fname.required' => 'Please enter first name!',
'lname.required' => 'Please enter last name!',
'mobile_country_code_id.required' => 'Select Code!',
'mobile_no.required' => 'Please enter mobile no!',
'mobile_no.digits' => 'Mobile no must be 10 digit!',
'email.required' => 'Please enter email!',
'email.email' => 'Please enter valid email!',
'email.max' => 'Email length exceeds 255 characters limit!',
'email.unique' => 'Email already registered with us!',
'email.regex' => 'Your email is not valid!',
'password.required' => 'Please enter password!',
'password.min' => 'Password must be min 8 character!',
'password.regex' => 'Password must have at least one lowercase, one uppercase,
one digit and a special character!',
'password.confirmed' => 'Password and confirm password does not match!',
]
);
if ($v->fails()) {
return response()->json(
[
'status' => 'error',
'message' => 'Please enter required details!',
'errors' => $v->errors()
],
422
);
}
if ($v->fails()) {
return response()->json(
[
'status' => 'error',
'message' => 'Please enter required details!',
'errors' => $v->errors()
],
422
);
}
$user = User::create(
[
'fname' => $request->fname,
'lname' => $request->lname,
'name' => $request->fname . ' ' . $request->lname,
'mobile_country_code_id' => $request->mobile_country_code_id,
'mobile_no' => $request->mobile_no,
'email' => $request->email,
'password' => bcrypt($request->password)
]
);
\App\Models\Profile::create(
['user_id' => $user->id]
);
event(new Registered($user));
return response()->json(['status' => 'success'], 200);
}
/**
* Login function authenticate a user, create auth token
* and return json.
*
* @param \Illuminate\Http\Request request
* @return json
*/
public function login(Request $request)
{
$v = Validator::make(
$request->all(),
[
'email' => ['required','email','exists:users,email', new Emailverification() , new Isactive()],
'password' => 'required',
],
[
'email.required' => 'Please enter email!',
'email.email' => 'Please enter valid email!',
'email.exists' => 'These email do not match our records!',
'password.required' => 'Please enter password!',
]
);
if ($v->fails()) {
Log::channel('unauthentication_login')->error(
'Login Failed. User :
' . $request->email . ' Pass : ' . $request->password . ' IP Address : ' . $request->ip()
);
return response()->json(
[
'status' => 'error',
'message' => 'Please enter required details!',
'errors' => $v->errors()
],
422
);
}
$credentials = $request->only('email', 'password','role');
if ($token = $this->guard()->attempt($credentials)) {
return response()->json(['status' => 'success'], 200)->header('Authorization', $token);
}
return response()->json(['error' => 'login_error','loginFailed' => true], 401);
}
/**
* Logout function logout a user and return json.
*
* @param \Illuminate\Http\Request request
* @return json
*/
public function logout()
{
$this->guard()->logout();
return response()->json(
[
'status' => 'success',
'msg' => 'Logged out Successfully.'
],
200
);
}
/**
* User Function find and return current authenticated user.
*
* @param \Illuminate\Http\Request request
* @return json
*/
public function user(Request $request)
{
$user = User::find(Auth::user()->id);
return response()->json(
[
'status' => 'success',
'data' => $user
]
);
}
/**
* Refresh function refreshs authentication token of user.
*
* @param \Illuminate\Http\Request request
* @return json
*/
public function refresh()
{
try {
$token = $this->guard()->refresh();
} catch (\Tymon\JWTAuth\Exceptions\InvalidClaimException $e) {
return response()->json(['error' => 'refresh_token_error'], 401);
} catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
return response()->json(['error' => 'refresh_token_error'], 401);
} catch (\Tymon\JWTAuth\Exceptions\PayloadException $e) {
return response()->json(['error' => 'refresh_token_error'], 401);
} catch (\Tymon\JWTAuth\Exceptions\TokenBlacklistedException $e) {
return response()->json(['error' => 'refresh_token_error'], 401);
} catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
return response()->json(['error' => 'refresh_token_error'], 401);
} catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
return response()->json(['error' => 'refresh_token_error'], 401);
} catch (\Tymon\JWTAuth\Exceptions\UserNotDefinedException $e) {
return response()->json(['error' => 'refresh_token_error'], 401);
} catch (\Exception $e) {
return response()->json(['error' => 'refresh_token_error'], 401);
}
return response()->json(['status' => 'successs'], 200)->header('Authorization', $token);
// if ($token = $this->guard()->refresh()) {
// return response()
// ->json(['status' => 'successs'], 200)
// ->header('Authorization', $token);
// }
// return response()->json(['error' => 'refresh_token_error'], 401);
}
/**
* Apply guard
*
* @param void
* @return Auth
*/
private function guard()
{
return Auth::guard();
}
/**
* Get the response for a successful password reset link.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetLinkResponse(Request $request, $response)
{
return response()->json(
[
'message' => 'Password reset email sent.',
'data' => $response
]
);
}
/**
* Get the response for a failed password reset link.
*
* @param \Illuminate\Http\Request request
* @param string response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetLinkFailedResponse(Request $request, $response): \Illuminate\Http\JsonResponse
{
return response()->json(['message' => 'Email could not be sent to this email address.']);
}
/**
* Send password reset link.
*
* @param \Illuminate\Http\Request request
* @return Illuminate\Foundation\Auth\ResetsPasswords
*/
public function sendPasswordResetLink(Request $request)
{
return $this->sendResetLinkEmail($request);
}
/**
* Handle reset password
*/
public function callResetPassword(Request $request)
{
return $this->reset($request);
}
/**
* Reset the given user's password.
*
* @param \Illuminate\Contracts\Auth\CanResetPassword $user
* @param string $password
* @return void
*/
protected function resetPassword($user, $password)
{
$user->password = Hash::make($password);
$user->save();
event(new \Illuminate\Auth\Events\PasswordReset($user));
}
/**
* Get the response for a successful password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetResponse(Request $request, $response)
{
return response()->json(['message' => 'Password reset successfully.']);
}
/**
* Get the response for a failed password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetFailedResponse(Request $request, $response)
{
return response()->json(['message' => 'Failed, Invalid Token.']);
}
/**
* Return the countries list in json format.
*
* @param null
* @return json
*/
public function getCountries()
{
$countrys = App\Models\Country::get();
return response()->json(
[
'status' => 'success',
'countrys' => $countrys->toArray()
],
200
);
}
/**
* Return the token varification.
*
* @param null
* @return json
*/
public function resetValidation(Request $request)
{
$expire = config('auth.passwords.users.expire');
$token = $request->token;
$date = date("Y-m-d H:i:s");
$time = strtotime($date);
$time = $time - (10 * 60);
$date = date("Y-m-d H:i:s", $time);
$data = DB::table('password_resets')->whereDate('created_at', '=', date('Y-m-d'))->get();
$status = false;
$tokenStatus = false ;
foreach ($data as $value) {
if (Hash::check($token, $value->token)) {
$tokenStatus = DB::table('password_resets')->where('email', '=', $value->email)
->where('created_at', '>', $date)->first();
}
}
if ($tokenStatus) {
$status = true;
}
return response()->json(
[
'status' => $status,
'time' => $date,
'Current time' => date("Y-m-d H:i:s"),
'token' => $tokenStatus,
],
200
);
}
}