Files
izyim-api/app/Http/Controllers/AuthController.php
T
jack b4c257b2d0 added role based user management
added send reset link method
updated jwt expire to one week
added seeder
2018-04-26 17:18:53 +08:00

207 lines
6.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use App\UserVerification;
use JWTAuth;
use Auth;
use Aloha\Twilio\Twilio;
use Tymon\JWTAuth\Exceptions\JWTException;
use Validator, DB, Hash, Mail, Illuminate\Support\Facades\Password;
use Illuminate\Auth\Passwords\TokenRepositoryInterface;
class AuthController extends Controller
{
/**
* API Send verification code
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function sendVerification(Request $request){
$credentials = $request->only('phone');
$rules = [
'phone' => 'required|digits:10|unique:users'
];
$validator = Validator::make($credentials, $rules);
// create user if not exist
$user = User::firstOrNew([
'phone' => $request->phone
]);
$user->save();
// create token if not exist, update if exist
$token = mt_rand(0000,9999);
$user_verification = $user->phoneVerification()->firstOrNew([
'user_id' => $user->id,
]);
$user_verification->token = $token;
$user_verification->save();
// send token to phone
// ** switching to nexmo **
//$message = "IZYIM verification code : ". $token;
//$twilio = new Twilio(env('TWILIO_ACC'), env('TWILIO_TOKEN'), env('TWILIO_NUMBER'));
//$twilio->message($request->phone, $message);
return response()->json(['success'=> true, 'message'=> 'A verification code has been send to your mobile number.' ]);
}
/**
* API Verify User
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function verifyUser(Request $request)
{
$credentials = $request->only('phone', 'token');
// check if user already verified
$check_user = User::where('phone', $request->phone)->first();
if(!is_null($check_user)){
if($check_user->is_verified == 1){
return response()->json([
'success'=> true,
'message'=> 'Account already verified.'
]);
}
}
else{
return response()->json([
'success'=> false,
'message'=> 'Please contact support.'
]);
}
// check and verify valid token
$check_token = $check_user->phoneVerification()->where('token', $request->token)->first();
if(!is_null($check_token)){
$check_user->is_verified = 1;
$check_user->save();
$check_token->delete();
if (!$userToken=JWTAuth::fromUser($check_user)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
// all good so return the token
return response()->json(['success' => true, 'data'=> [ 'token' => $userToken ]]);
}
return response()->json(['success'=> false, 'error'=> "Verification code is invalid."]);
}
/**
* API Register
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function updateUser(Request $request)
{
$credentials = $request->only('role', 'name', 'password', 'password_confirmation');
$rules = [
'name' => 'required|max:255',
'role' => 'required',
'password' => 'required|confirmed|min:6'
];
$validator = Validator::make($credentials, $rules);
if($validator->fails()) {
return response()->json(['success'=> false, 'error'=> $validator->messages()]);
}
$name = $request->name;
$password = $request->password;
$user = Auth::user();
$user->update(['name' => $name, 'password' => Hash::make($password)]);
return response()->json(['success'=> true, 'message'=> 'Profile updated.']);
}
/**
* API Login, on success return JWT Auth token
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function login(Request $request)
{
$credentials = $request->only('phone', 'password');
$rules = [
'phone' => 'required|digits:10|unique:users',
'password' => 'required',
];
$validator = Validator::make($credentials, $rules);
if($validator->fails()) {
return response()->json(['success'=> false, 'error'=> $validator->messages()]);
}
$credentials['is_verified'] = 1;
try {
// attempt to verify the credentials and create a token for the user
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['success' => false, 'error' => 'We cant find an account with this credentials. Please make sure you entered the right information and you have verified your email address.'], 401);
}
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return response()->json(['success' => false, 'error' => 'Failed to login, please try again.'], 500);
}
// all good so return the token
return response()->json(['success' => true, 'data'=> [ 'token' => $token ]]);
}
/**
* Log out
* Invalidate the token, so user cannot use it anymore
* They have to relogin to get a new token
*
* @param Request $request
*/
public function logout(Request $request) {
$this->validate($request, ['token' => 'required']);
try {
JWTAuth::invalidate($request->input('token'));
return response()->json(['success' => true, 'message'=> "You have successfully logged out."]);
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return response()->json(['success' => false, 'error' => 'Failed to logout, please try again.'], 500);
}
}
/**
* API Recover Password
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function recover(Request $request)
{
$user = User::where('phone', $request->phone)->first();
if ($user){
$token = str_random(64);
DB::table(config('auth.passwords.users.table'))->insert([
'phone' => $user->phone,
'token' => $token
]);
}
/*
todo
send SMS
*/
return response()->json([
'success' => true, 'data'=> ['message'=> 'A reset link has been send to your mobile phone.']
]);
}
}