📅  最后修改于: 2023-12-03 14:49:56.355000             🧑  作者: Mango
在Laravel中,我们可以轻松地为我们的应用程序添加登录系统。它有多种身份验证方式,其中包括通过电子邮件和电话号码进行身份验证。在本文中,我们将详细了解如何使用Laravel身份验证系统的电子邮件和电话登录方法。
首先,我们需要安装Laravel并设置数据库连接。我们可以通过以下命令创建一个新的Laravel项目:
laravel new project_name
在设置数据库之前,我们需要编辑项目目录中的.env
文件,将以下内容替换为我们自己的数据库信息:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=database_user
DB_PASSWORD=database_password
然后,我们可以创建一个新的数据库并运行以下命令进行数据库迁移:
php artisan migrate
接下来,我们需要设置邮件和短信驱动程序。我们可以编辑.env
文件,并将邮件和短信驱动程序的值更改为我们想要使用的驱动程序。例如,如果我们想使用Smtp服务器发送电子邮件,可以将以下内容添加到.env
文件中:
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=null
类似地,如果我们想使用Twilio API发送短信消息,可以将以下内容添加到.env
文件中:
TWILIO_ACCOUNT_SID=your_account_sid
TWILIO_AUTH_TOKEN=your_auth_token
TWILIO_PHONE_NUMBER=your_phone_number
接下来,我们将使用Laravel的make:auth
命令创建一个认证系统。该命令将在我们的应用程序中生成身份验证相关的路由和视图。我们只需运行以下命令即可:
php artisan make:auth
此命令将为我们的应用程序生成以下文件:
routes/web.php
:包含我们的身份验证相关路由。app/Http/Controllers/Auth
目录:包含处理身份验证请求的控制器。resources/views/auth
目录:包含身份验证相关的视图,如登录、注册、重设密码等。默认情况下,Laravel的身份验证系统使用电子邮件地址作为用户凭据。要使用电话号码作为凭据,我们需要将app/Http/Controllers/Auth/LoginController.php
中的username
属性更改为我们想要使用的名称。例如,如果我们想使用电话号码作为凭据,我们可以这样更改:
protected $username = 'phone';
同时,我们还需要更改登录和注册视图中的表单:
<!-- 修改 login.blade.php-->
<div class="form-group{{ $errors->has('phone') ? ' has-error' : '' }}">
<label for="phone" class="col-md-4 control-label">Phone Number</label>
<div class="col-md-6">
<input id="phone" type="tel" class="form-control" name="phone" value="{{ old('phone') }}" required autofocus>
@if ($errors->has('phone'))
<span class="help-block">
<strong>{{ $errors->first('phone') }}</strong>
</span>
@endif
</div>
</div>
<!-- 修改 register.blade.php-->
<div class="form-group{{ $errors->has('phone') ? ' has-error' : '' }}">
<label for="phone" class="col-md-4 control-label">Phone Number</label>
<div class="col-md-6">
<input id="phone" type="tel" class="form-control" name="phone" value="{{ old('phone') }}" required>
@if ($errors->has('phone'))
<span class="help-block">
<strong>{{ $errors->first('phone') }}</strong>
</span>
@endif
</div>
</div>
接下来,我们需要更新我们的用户模型,以将电话号码添加为其可填充属性:
protected $fillable = [
'name', 'email', 'password', 'phone',
];
最后,我们需要更新我们的app/Http/Controllers/Auth/RegisterController.php
中的validator()
方法,并添加一个电话号码验证器:
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'phone' => ['required', 'string', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
现在,我们已经准备好使用短信验证码来验证用户。我们可以使用Laravel的laravel-twilio
包来轻松发送短信消息。我们可以使用以下命令将其安装到我们的项目中:
composer require aloha/twilio
接下来,我们可以在我们的RegisterController
的create()
方法中生成并存储验证码:
protected function create(array $data)
{
$verification_code = rand(100000,999999);
$user = User::create([
'name' => $data['name'],
'phone' => $data['phone'],
'password' => Hash::make($data['password']),
'verification_code' => $verification_code,
]);
$this->sendVerificationCode($verification_code, $user->phone);
return $user;
}
protected function sendVerificationCode($verification_code, $phone)
{
$twilio_account_sid = env('TWILIO_ACCOUNT_SID');
$twilio_auth_token = env('TWILIO_AUTH_TOKEN');
$twilio_phone_number = env('TWILIO_PHONE_NUMBER');
$client = new Client($twilio_account_sid, $twilio_auth_token);
$client->messages->create(
$phone,
[
'from' => $twilio_phone_number,
'body' => "Your verification code is: " . $verification_code
]
);
}
在此示例中,我们已将验证码存储在verification_code
字段中,并使用sendVerificationCode()
方法发送短信消息。
现在,我们已经准备好在登录过程中验证我们的短信验证码了。在这里,我们将使用我们在上一步中生成的验证码,并将其与用户提供的值进行比较。
我们可以将以下代码添加到我们的LoginController
的authenticate()
方法中:
protected function authenticate(Request $request)
{
$this->validate($request, [
'phone' => 'required',
'verification_code' => 'required'
]);
$user = User::where('phone', $request->phone)->first();
if (! $user) {
return redirect()
->back()
->withErrors(['phone' => 'The provided phone number does not match any user in our records.']);
}
if (intval($request->verification_code) !== $user->verification_code) {
return redirect()
->back()
->withErrors(['verification_code' => 'The provided verification code is incorrect.']);
}
Auth::login($user, $remember = true);
return redirect()->intended('home');
}
在此示例中,我们首先验证了电话号码和验证码是否提供。然后,我们在数据库中查找与提供的电话号码匹配的用户。如果我们找不到任何匹配项,我们回到登录表单并显示错误消息。
如果我们找到了用户,我们比较我们在上一步中生成的验证码和提供的验证码。如果这两个值不相等,我们显示错误消息并返回登录页面。
最后,我们使用Auth::login
方法将用户登录到应用程序中,并将其重定向到主页。
现在,我们已经成功地使用电子邮件和电话号码设置了Laravel认证系统,并在登录过程中使用短信验证码进行验证。Laravel的身份验证系统是构建安全和可靠Web应用程序的重要组成部分。我们希望本文对您有所帮助,并使您更加熟悉使用Laravel的身份验证系统的方法,为您的下一个应用程序提供基础认证系统。