اهراز هویت پیامکی

- 1 هفته پیش
توسط علیرضا اصلانی آپدیت شد
احمد ( 375 تجربه )
1 هفته پیش

سلام . من میخوام داخل پروژم با پیامک فقط بشه ثبت نام و ورود کرد بعدش کاربر اقدام به ویرایش پروفایل کاربری و سایر مشخصاتش بکنه.
کسی میتونه راهنماییم کنه یا بهم لینک بده ؟ فکر کنم تو یکی از دوره های راکت گفته شده ولی من ازین دوره فقط اون دو قسمت احراز هویت رو میخوام و به صرفه نیست برام کل دوره رو بخرم

بهترین پاسخ انتخاب شده توسط احمد
علیرضا اصلانی
1 هفته پیش

این کدای روشی که خودم تو لاراول استفاده کردم

databasemigrations

/**
     * Run the migrations.
     *
     * @return void
     */
    public function up() {
        Schema::create('users', function(Blueprint $table) {
            $table->increments('id');
            $table->string('phone_number')->unique();
            $table->string('name')->nullable();
            $table->string('family')->nullable();
            $table->string('image')->nullable();
            $table->string('email')->unique()->nullable();
            $table->string('password')->nullable();
            $table->string('verify_code', 5);
            $table->timestamp('email_verified_at')->nullable();
            $table->rememberToken();
            $table->timestamps();
        });
    }

User مدل

<?php

namespace App;

use IlluminateNotificationsNotifiable;
use IlluminateContractsAuthMustVerifyEmail;
use IlluminateFoundationAuthUser as Authenticatable;
use TymonJWTAuthContractsJWTSubject;

class User extends Authenticatable implements JWTSubject {
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'family', 'email', 'password', 'phone_number', 'image', 'verify_code'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier() {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims() {
        return [];
    }
}

AuthController

<?php

namespace AppHttpControllersApi1;

use AppUser;
use IlluminateHttpRequest;
use AppHttpControllersController;
use IlluminateHttpResponse;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesHash;

class AuthController extends Controller {

    public function start(Request $request) {

        $this->validate($request, [
            'phone_number' => ['required', 'min:10', 'max:10']
        ]);

        $phone_number = $request->phone_number;

        $user = User::where('phone_number', $phone_number)->first();

        $verify_code = rand(11111, 99999);

        if(!$user) {

            User::create([
                'phone_number' => $phone_number,
                'verify_code' => $verify_code
            ]);

            //TODO: send sms verify code

            return response()->json([
                'data' => [
                    'phone_number' => $phone_number,
                ]
            ]);
        }

        $user->update([
            'verify_code' => $verify_code
        ]);

        //TODO: send sms verify code

        return response()->json([
            'data' => [
                'phone_number' => $phone_number
            ]
        ]);
    }

    public function verify(Request $request, $phoneNumber) {

        $this->validate($request, [
            'verify_code' => ['required', 'min:5', 'max:5']
        ]);

        $user = User::where('phone_number', $phoneNumber)->first();

        if($user->verify_code === $request->verify_code) {

            $token = Auth('api')->login($user);

            return response()->json([
                'data' => [
                    'api_token' => $token,
                    'has_password' => $user->password != null,
                    'is_new_user' => !$user->name
                ]
            ]);
        }

        return response()->json([
            'data' => [
                'messages' => 'کد فعالسازی نامعتبر است'
            ]
        ], Response::HTTP_UNAUTHORIZED);
    }

    public function register(Request $request) {

        $this->validate($request, [
            'name' => ['required'],
            'family' => ['required']
        ]);

        Auth('api')->user()->update([
            'name' => $request->name,
            'family' => $request->family
        ]);

        return response()->json([
            'data' => [
                'registered' => true
            ]
        ]);
    }

    public function checkPassword(Request $request) {

        $this->validate($request, [
            'password' => ['required']
        ]);

        if(Hash::check($request->password, Auth('api')->user()->password)) {
            return response()->json([
                'data' => [
                    'verify_password' => true
                ]
            ]);
        }

        return response()->json([
            'data' => [
                'verify_password' => false
            ]
        ], Response::HTTP_UNAUTHORIZED);
    }
}

اون قسمت که نوشتم TODO: send sms verify code باید با وب سرویس پیامکی که تهیه کردی مقدار $verify_code رو بفرستی به شماره کاربر که داخل $phone_number ذخیره شده

اینم route هاش

<?php

use Illuminate\Http\Request;

Route::prefix('v1')->namespace('Api\v1')->group(function() {

    $this->post('start', 'AuthController@start');
    $this->post('verify/{phoneNumber}', 'AuthController@verify');

    $this->middleware('jwt.auth')->group(function() {

        $this->post('check-password', 'AuthController@checkPassword');
        $this->post('register', 'AuthController@register');

    });
});

برای ساخت api token هم از "tymon/jwt-auth": "1.0.0-rc.3" استفاده کردم

mahdi khanzadi ( 747 تجربه )
1 هفته پیش

برای ارسال پیامک میتونید از پکیج زیر استفاده کنید:

https://github.com/tzsk/sms

درایورهای smsir و کاوه نگار و ملی پیامک در حال حاضر ساپورت میشه.

سیدعلی موسوی ( 22531 تجربه )
1 هفته پیش

سلام ، به نظرم کل دوره واقعا عالیه و میتونه برات ایده ال باشه @ahmadnaderi2012
بحث احراز هویت هم بارها تویی تایپیک های مختلف دوستان پرسیدن با یک سرچ میتونی برسی بهش

فقط یک نکته تویی احراز هویت تویی کنترلر Auth شما میتونی کدها رو بازنویسی کنی و تویی صف ها میتونی کد ارسال پیامکت رو بنویسی و برای استفاده از سیستم پیامکی میتونی از کاوه نگار استفاده کنی. مستندات هم داره.

علیرضا اصلانی ( 9119 تجربه )
1 هفته پیش

این کدای روشی که خودم تو لاراول استفاده کردم

databasemigrations

/**
     * Run the migrations.
     *
     * @return void
     */
    public function up() {
        Schema::create('users', function(Blueprint $table) {
            $table->increments('id');
            $table->string('phone_number')->unique();
            $table->string('name')->nullable();
            $table->string('family')->nullable();
            $table->string('image')->nullable();
            $table->string('email')->unique()->nullable();
            $table->string('password')->nullable();
            $table->string('verify_code', 5);
            $table->timestamp('email_verified_at')->nullable();
            $table->rememberToken();
            $table->timestamps();
        });
    }

User مدل

<?php

namespace App;

use IlluminateNotificationsNotifiable;
use IlluminateContractsAuthMustVerifyEmail;
use IlluminateFoundationAuthUser as Authenticatable;
use TymonJWTAuthContractsJWTSubject;

class User extends Authenticatable implements JWTSubject {
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'family', 'email', 'password', 'phone_number', 'image', 'verify_code'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier() {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims() {
        return [];
    }
}

AuthController

<?php

namespace AppHttpControllersApi1;

use AppUser;
use IlluminateHttpRequest;
use AppHttpControllersController;
use IlluminateHttpResponse;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesHash;

class AuthController extends Controller {

    public function start(Request $request) {

        $this->validate($request, [
            'phone_number' => ['required', 'min:10', 'max:10']
        ]);

        $phone_number = $request->phone_number;

        $user = User::where('phone_number', $phone_number)->first();

        $verify_code = rand(11111, 99999);

        if(!$user) {

            User::create([
                'phone_number' => $phone_number,
                'verify_code' => $verify_code
            ]);

            //TODO: send sms verify code

            return response()->json([
                'data' => [
                    'phone_number' => $phone_number,
                ]
            ]);
        }

        $user->update([
            'verify_code' => $verify_code
        ]);

        //TODO: send sms verify code

        return response()->json([
            'data' => [
                'phone_number' => $phone_number
            ]
        ]);
    }

    public function verify(Request $request, $phoneNumber) {

        $this->validate($request, [
            'verify_code' => ['required', 'min:5', 'max:5']
        ]);

        $user = User::where('phone_number', $phoneNumber)->first();

        if($user->verify_code === $request->verify_code) {

            $token = Auth('api')->login($user);

            return response()->json([
                'data' => [
                    'api_token' => $token,
                    'has_password' => $user->password != null,
                    'is_new_user' => !$user->name
                ]
            ]);
        }

        return response()->json([
            'data' => [
                'messages' => 'کد فعالسازی نامعتبر است'
            ]
        ], Response::HTTP_UNAUTHORIZED);
    }

    public function register(Request $request) {

        $this->validate($request, [
            'name' => ['required'],
            'family' => ['required']
        ]);

        Auth('api')->user()->update([
            'name' => $request->name,
            'family' => $request->family
        ]);

        return response()->json([
            'data' => [
                'registered' => true
            ]
        ]);
    }

    public function checkPassword(Request $request) {

        $this->validate($request, [
            'password' => ['required']
        ]);

        if(Hash::check($request->password, Auth('api')->user()->password)) {
            return response()->json([
                'data' => [
                    'verify_password' => true
                ]
            ]);
        }

        return response()->json([
            'data' => [
                'verify_password' => false
            ]
        ], Response::HTTP_UNAUTHORIZED);
    }
}

اون قسمت که نوشتم TODO: send sms verify code باید با وب سرویس پیامکی که تهیه کردی مقدار $verify_code رو بفرستی به شماره کاربر که داخل $phone_number ذخیره شده

اینم route هاش

<?php

use Illuminate\Http\Request;

Route::prefix('v1')->namespace('Api\v1')->group(function() {

    $this->post('start', 'AuthController@start');
    $this->post('verify/{phoneNumber}', 'AuthController@verify');

    $this->middleware('jwt.auth')->group(function() {

        $this->post('check-password', 'AuthController@checkPassword');
        $this->post('register', 'AuthController@register');

    });
});

برای ساخت api token هم از "tymon/jwt-auth": "1.0.0-rc.3" استفاده کردم

برای ارسال پاسخ باید وارد سایت شوید