📜  使用电子邮件和电话登录 laravel - PHP (1)

📅  最后修改于: 2023-12-03 14:49:56.355000             🧑  作者: Mango

使用电子邮件和电话登录 Laravel - PHP

在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

接下来,我们可以在我们的RegisterControllercreate()方法中生成并存储验证码:

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()方法发送短信消息。

验证短信验证码

现在,我们已经准备好在登录过程中验证我们的短信验证码了。在这里,我们将使用我们在上一步中生成的验证码,并将其与用户提供的值进行比较。

我们可以将以下代码添加到我们的LoginControllerauthenticate()方法中:

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的身份验证系统的方法,为您的下一个应用程序提供基础认证系统。