Skip to content

Instantly share code, notes, and snippets.

@moradi-morteza
Last active July 6, 2020 07:23
Show Gist options
  • Save moradi-morteza/774d68c3295a264177b79d344124e426 to your computer and use it in GitHub Desktop.
Save moradi-morteza/774d68c3295a264177b79d344124e426 to your computer and use it in GitHub Desktop.
[api/auth]
// 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