天天看點

laravel網站開發執行個體----4

使用者注冊接口全實作

上一篇部落格實作了發郵件驗證碼的功能,現在來寫整個注冊的邏輯

當使用者發起注冊的時候,給使用者郵箱發送驗證碼,并存儲到緩存中,當使用者注冊的時候,給驗證碼和驗證碼對應的Key即可注冊成功,避免暴力破解。

兩個接口的代碼

1、使用者得到驗證碼

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use Mail;
class UsersController extends Controller
{
    //用郵件發送驗證碼,并存儲到緩存中
    public function store(Request $request)
    {
        $this->validate($request,[
            'email' => 'required|unique:users',
        ]);
        // 生成4位随機數,左側補0
        $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);
        $email = $request->email;
        //發送郵件驗證碼
        $name = $request->name;
        $flag = Mail::send('test',['name'=>$name,'code'=>$code],function($message) use ($email){
            $to = $email;
            $message ->to($to)->subject('驗證碼');
        });
        $info = "郵件已發送,如長時間沒收到郵件,請重試";

        $key = 'RegisterCodes'.str_random(15);
        $expiredAt = now()->addMinutes(10);
        // 緩存驗證碼 10分鐘過期。
        \Cache::put($key, ['email' => $request->email, 'code' => $code], $expiredAt);

        return $this->response->array([
            'key' => $key,
            'expired_at' => $expiredAt->toDateTimeString(),
            'info' => $info,
        ])->setStatusCode(201);
    }
}      

2、根據驗證碼注冊

<?php

namespace App\Http\Controllers\Api;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UsersRegisterController extends Controller
{
    //
    public function store(Request $request){
        $this->validate($request,[
           'schoolid' => 'required|unique:users|max:10',
            'email' => 'required|unique:users',
            'password' => 'required|min:8|max:16',
        ]);
        $verifyData = \Cache::get($request->verification_key);
        if (!$verifyData) {
            return response('驗證碼失效',200);
        }
        $code = $request->verification_code;
        if (hash_equals($verifyData['code'],$code)){
            //如果驗證成功,就将所有資訊存入資料庫
            $user = User::create([
                'name' => $request->name,
                'schoolid' =>$request->schoolid,
                'email' => $verifyData['email'],
                'password' => bcrypt($request->password),
                'sex' =>$request->sex,
                'xueyuan'=>$request->xueyuan,
                'zhuanye'=>$request->zhuanye,
                'shifouhuiyuan' => 0,
            ]);
            \Cache::forget($request->verification_key);
            return $this->response->created();
        }else{
            $rs['info'] = '驗證碼錯誤';
            $rs['status'] = '400';
            return response($rs,200);
        }
    }
}      

這裡說一下,當使用模型類的時候,直接使用 模型類:: 例如,建立新的使用者

$user = User::create([
    'name' => $request->name,
    'schoolid' =>$request->schoolid,
    'email' => $verifyData['email'],
    'password' => bcrypt($request->password),
    'sex' =>$request->sex,
    'xueyuan'=>$request->xueyuan,
    'zhuanye'=>$request->zhuanye,
    'shifouhuiyuan' => 0,
]);      

使用緩存的方法:

//存儲到緩存中
\Cache::put($key, ['email' => $request->email, 'code' => $code],
//從緩存中取出
\Cache::get($request->verification_key);
//從緩存中清除
\Cache::forget($request->verification_key);      
$api = app('Dingo\Api\Routing\Router');

$api->version('v1', [
    'namespace' => 'App\Http\Controllers\Api'
], function($api) {
    //短信驗證碼
    $api->post('registerCodes', 'UsersController@store')
        ->name('api.registerCodes.store');
    //使用者注冊
    $api->post('users','UsersRegisterController@store')
        ->name('api.users.store');
});