我有一个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']);
}
}
1条答案
按热度按时间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运行构建文件,并拥有相同的主机,以便维护会话。