PHP会话变量问题

niwlg2el  于 2023-05-16  发布在  PHP
关注(0)|答案(1)|浏览(96)

我有一个react js和laravel php的项目。我有两个API,一个generate_otp,第二个verify_otp。现在generate_otp工作并将otp存储在会话中。我通过返回值来测试它,它很好,但问题是当我调用verify_otp时,会话变量没有值。从verify_opt返回会话变量有时给予错误,如500内部服务器错误和会话变量“otp”键错误。后来我在前端添加了credentials:'include',希望它能解决这个问题,但现在它返回一个完全不同的值,比如466782,这不是正确的值,它每次都返回完全相同的值。顺便说一句,一切都工作在 Postman ,但不是在浏览器。代码如下。
前端:

export const generateOTP = async () => {
 const response = await fetch(`http://localhost:8080/generate_otp`, {
  method: "GET",
  headers: { "content-type": "application/json" },
   });
};

export const verifyOTP = async (otp) => {
 const response = await fetch(`http://localhost:8080/verify_otp`, {
  method: "POST",
  body: otp,
  credentials: "include",
 });
 console.log(await response.json());
};

后端:

$router->post('verify_otp', 'ContactController@verify_otp');
$router->get('generate_otp', 'ContactController@generate_otp');

public function generate_otp(){
    session_start();
    $otp = random_int(100000, 999999); 
    $_SESSION['otp'] = $otp;
    return $_SESSION['otp'];
}

public function verify_otp(Request $request){
    session_start();
    if($_SESSION['otp'] === $request){
        return response()->json(['success'=>1,'message'=>'OTP has been verified']);
    }else{
        return response()->json(['success'=>1,'message'=>'Please enter the correct OTP code']);
    }
}
lmyy7pcs

lmyy7pcs1#

这不是使用react js的正确方法,因为如果您在不同的端口上运行react js,并且在不同的端口上运行Laravel,则需要REST API。您的会话没有被维护,这就是为什么每次您调用一个API并调用第二个API时,会话都不会被访问,这是您在上一个请求中保存的。因此,出于某种原因,您可以有两种方法来执行此任务。在Postman的情况下,它维护一个会话,这就是您的代码与Postman一起工作的原因。

方法一

创建一个名为otp_verify的表,其中至少包含id、otp和expires_on列。每当你发送OTP时,将该OTP保存到otp_verify表中,其中expires_on假设为15分钟,因此存储当前时间+15分钟。在将该OTP存储在数据库中之后的第一个请求中,返回具有刚刚插入的该行的ID的响应。在第二个请求中,使用OTP将该id传递给服务器,然后使用id检查该id是否存在并且尚未过期。然后匹配OTP并相应地响应。

方法二

您可以使用Laravel运行构建文件,并拥有相同的主机,以便维护会话。

相关问题