用户注册的 OTP 是否应该存储在 laravel 的会话或数据库中?

OTP 是否应该存储在会话或数据库中。谁能告诉OTP的流程。据我了解,当用户提交必要的字段时,用户详细信息和 otp 会存储在数据库中,注册后会打开另一个表单以输入 otp,然后注册最终成功。但我不明白实际的逻辑。要存储 otp,我们需要将所有数据存储在数据库中,所有数据都被存储(用户信息),然后我们才能验证 otp。我正在使用会话,但我不确定代码是否正确,

    public function otpVerify(Request $request)
    {
        $data = $request->validate([
            'verification_code' => ['required', 'numeric'],
            'phone_number' => ['required', 'string'],
        ]);
        $otp = $request->session()->get('otp');
        $enteredOtp = $request->session()->get('otp');

    if ($otp == $enteredOtp) {
        $user = tap(User::where('phone_number', $data['phone_number']));
        // ->update(['isVerified' => true]);
        return success([
            $success,
            $otp
        ], __('User created successfully'));
 } else {
    return problem([], 500, 'OTP Doesnt Match');
 }

  public function register(RegisterUserRequest $request)
    {
        $user = new User($request->validated());
        $otp = rand(10000, 99999);
        $otp_expires_time = Carbon::now()->addSeconds(20);

        if (!env('APP_ENV') === 'local') {

            $sms = AWS::createClient('sns');

            $sms->publish([
                'Message' => 'Your OTP code is:' + $otp,
                'PhoneNumber' => $user->phone_number,
                'MessageAttributes' => [
                    'AWS.SNS.SMS.SMSType'  => [
                        'DataType'    => 'String',
                        'StringValue' => 'Transactional',
                    ]
                ],
            ]);
        } else {
            Log::channel('otplog')->info('Your OTP code is:'. $otp);
        }
        $status = $user->save();
        $user->roles()->attach($request->role_id);
        $user->brands()->attach($request->brand_id);
        $user->appliances()->attach($request->appliance_id);
        $success['token'] =  $user->createToken('MyAuthApp')->plainTextToken;
        $success['name'] =  $user->name;
        Session::put('OTP', $otp, 'expiry_time',$otp_expires_time);
        if ($status) {
            return success([
                $success,
                $otp_expires_time,
                $otp
            ], __('User created successfully'));
        } else {
            return problem([], 500, 'USER_REGISTER_FAIL');
        }
    }
stack overflow Are OTP for user registration supposed to store in session or datbase in laravel?
原文答案
author avatar

接受的答案

存储在数据库中是一个不错的选择


答案:

作者头像

这是我对此事的看法:

会话存储

如果您希望用户只能在其请求设备上实时使用该会话,请使用会话存储。他们关闭会话的那一刻,它将被处理掉。在这种情况下,持有此类 OTP 的持续时间取决于会话生命周期。使用此方法在应用程序上进行实时验证过程,例如 2 Factor-Authentication。


数据库存储

数据库存储很棒,但对于某些场景,尤其是实时场景,可能有点矫枉过正。因为在 2FA 的情况下,您必须添加只会持续几秒钟并再次删除的记录。在 OTP 到期有一些“设置”寿命的情况下,我更喜欢使用数据库存储。例如,想象一个用户正在填写注册表的过程,他们可以选择保存并稍后继续。在这种情况下,如果部分注册需要一些 OTP 验证并且用户无法实时验证,您通常会为用户提供一个 OTP,该 OTP 在一段时间后过期,例如 3 小时。因此用户可以稍后回来并使用该 OTP 继续注册。在这种情况下,您会在注册完成后立即从数据库中删除 OTP。

作者头像

在会话放置方法中你做错了你需要像在会话中放置数组一样发送到期时间你不会在你打电话时得到到期时间你需要这样做

Session::put([
'OTP' => $otp,
'expiry_time' => $otp_expires_time,
])