Last active
July 6, 2020 07:23
-
-
Save moradi-morteza/774d68c3295a264177b79d344124e426 to your computer and use it in GitHub Desktop.
[api/auth]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// this file contain 3 part | |
//1-simple auth system rest api with mobile | |
//3-simple auth system rest api with email | |
//3- passport api auth system - we do not use default auth laravel beacuse it is session base | |
// add $table->string('api_token')->nullable(); to user migration | |
// 1 - With Mobile | |
// api.php | |
Route::post('/login_mobile','Api\Auth\LoginController@login_mobile'); | |
Route::post('/confirm_activation_mobile_code','Api\Auth\LoginController@confirm_mobile_code'); | |
Route::middleware('auth:api')->get('/user','Api\Auth\UserController@index'); | |
// User Database | |
Schema::create('users', function (Blueprint $table) { | |
$table->id(); | |
$table->string('name')->nullable(); | |
$table->string('email')->nullable(); | |
$table->string('mobile')->unique(); //* | |
$table->string('password'); | |
$table->integer('verify_code')->nullable(); //* | |
$table->string('api_token')->nullable(); //* | |
$table->string('verify_at')->nullable(); //* | |
$table->rememberToken(); | |
$table->timestamps(); | |
}); | |
// User Model | |
class User extends Authenticatable | |
{ | |
use Notifiable; | |
protected $fillable = [ | |
'name', 'email', 'password', | |
]; | |
protected $hidden = [ | |
'password', 'remember_token','updated_at','created_at','verify_at','verify_code', | |
]; | |
protected $casts = [ | |
'email_verified_at' => 'datetime', | |
]; | |
public function generateToken(){ | |
$token=str_random(40); | |
$this->api_token=$token; | |
$this->save(); | |
return $token; | |
} | |
public function removeToken(){ | |
$this->api_token=null; | |
$this->save(); | |
} | |
public function generate_verify_code(){ | |
$verifycode=rand(10000,90000); | |
$this->verify_code=$verifycode; | |
$this->save(); | |
return $verifycode; | |
} | |
} | |
// Api\Auth\LoginController | |
class LoginController extends Controller | |
{ | |
public function login_mobile(Request $request){ | |
$this->validate($request, [ | |
'mobile' => 'required', | |
]); | |
$user = User::where(['mobile'=>$request->mobile])->first(); | |
if ($user){ | |
$verifyCode =$user->generate_verify_code(); | |
$this->sms_verify_code($verifyCode); | |
return response( ['status'=>'verify code sended :'.$verifyCode],200); | |
}else{ | |
return $this->register_mobile($request); | |
} | |
} | |
public function register_mobile($request){ | |
$user = new User; | |
$user->mobile = $request->mobile; | |
$user->password = $request->mobile; | |
$user->save(); | |
$verifyCode =$user->generate_verify_code(); | |
$this->sms_verify_code($verifyCode); | |
return response( ['status'=>'verify code sended :'.$verifyCode],200); | |
} | |
public function sms_verify_code($verifyCode){ | |
} | |
public function confirm_mobile_code(Request $request){ | |
$this->validate($request, [ | |
'mobile' => 'required', | |
'verify_code' => 'required', | |
]); | |
$user = User::where(['mobile'=>$request->mobile])->first(); | |
if ($user){ | |
$verifyCodeUser =(int)$user->verify_code; | |
$verifyCodeRecived =(int)$request->verify_code; | |
if ($verifyCodeUser==$verifyCodeRecived){ | |
$user->verify_code=null; // verify code should be null beacuse user can not use it again | |
$user->verify_at=date("Y-m-d H:i:s"); | |
$user->generateToken(); | |
$user->save(); | |
return response( $user, 200); | |
}else{ | |
return response(['errors'=>'Code Not Confirmed'],402); | |
} | |
}else{ | |
return response(['errors'=>'Mobile Number Not Found'],404); | |
} | |
} | |
public function logout(Request $request){ | |
$user = auth()->user(); | |
$user->removeToken(); | |
return response(null, 204); | |
} | |
} | |
// Api\Auth\UserController | |
class UserController extends Controller | |
{ | |
public function index(){ | |
$user = auth()->user(); | |
return $user; | |
} | |
} | |
// Android : | |
// APi Service | |
public interface ApiService { | |
@FormUrlEncoded | |
@POST("login_mobile") | |
Single<Response<Void>> login_mobile(@Field("mobile") String mobile); | |
@FormUrlEncoded | |
@POST("confirm_activation_mobile_code") | |
Single<Response<User>> confirm_activation_email_code(@Field("mobile") String mobile, @Field("verify_code") String code); | |
@GET("logout") | |
Single<Response<Void>> logout(); | |
} | |
// Api CallBack | |
public interface ApiCallBack { | |
interface LoginPage extends BaseCallBack{ | |
void SuccessCreateCode(); | |
void CodeAccepted(User user); | |
} | |
} | |
// Base CallBack | |
public interface BaseCallBack { | |
void Offline(); | |
void OnFail(String message); | |
} | |
// APi Manager | |
public void login_mobile(String number, final ApiCallBack.LoginPage loginPage) { | |
App.compositeDisposable.add( | |
apiService.login_mobile(number) | |
.subscribeOn(Schedulers.io()) | |
.observeOn(AndroidSchedulers.mainThread()) | |
.subscribeWith(new DisposableSingleObserver<Response<Void>>() { | |
@Override | |
public void onSuccess(Response<Void> loginResponse) { | |
if (loginResponse.isSuccessful()) { | |
loginPage.SuccessCreateCode(); | |
} else { | |
loginPage.OnFail(null); | |
} | |
} | |
@Override | |
public void onError(Throwable e) { | |
loginPage.OnFail(e.getMessage()); | |
} | |
}) | |
); | |
} | |
public void confirm_activation_email_code(String number, String code, final ApiCallBack.LoginPage loginPage) { | |
App.compositeDisposable.add( | |
apiService.confirm_activation_email_code(number, code) | |
.subscribeOn(Schedulers.io()) | |
.observeOn(AndroidSchedulers.mainThread()) | |
.subscribeWith(new DisposableSingleObserver<Response<User>>() { | |
@Override | |
public void onSuccess(Response<User> loginResponse) { | |
if (loginResponse.isSuccessful()) { | |
loginPage.CodeAccepted(loginResponse.body()); | |
} else { | |
if (loginResponse.code()==402){ | |
loginPage.OnFail("کد وارد شده اشتباه است."); | |
}else{ | |
loginPage.OnFail("خطایی در برنامه ایجاد شده است."); | |
} | |
} | |
} | |
@Override | |
public void onError(Throwable e) { | |
loginPage.OnFail(e.getMessage()); | |
} | |
}) | |
); | |
} | |
// Finished Part 1--------------------------------------------------------- | |
class CreateUsersTable extends Migration | |
{ | |
public function up() | |
{ | |
Schema::create('users', function (Blueprint $table) { | |
$table->increments('id'); | |
$table->string('name'); | |
$table->string('email')->unique(); //* | |
$table->timestamp('email_verified_at')->nullable(); //* | |
$table->string('password'); | |
$table->string('api_token')->nullable(); //* | |
$table->rememberToken(); | |
$table->timestamps(); | |
}); | |
} | |
// add method generateToken to User Model | |
public function generateToken(){ | |
$token=str_random(30); | |
$this->api_token=$token; | |
$this->save(); | |
return $token; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment