使用者注冊接口全實作
上一篇部落格實作了發郵件驗證碼的功能,現在來寫整個注冊的邏輯
當使用者發起注冊的時候,給使用者郵箱發送驗證碼,并存儲到緩存中,當使用者注冊的時候,給驗證碼和驗證碼對應的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');
});