中间代码的载体:lumen
视频介绍:给AI处理逻辑找个地 lumen https://youtu.be/KTIV1c_XBr8
概述
- strapi 提供的数据的 CURD 操作
- web 需要api进行用户名,密码验证,但是不能直接使用 strapi 的curd,应为数据操作接口不能直接暴露给前端,有安全问题
- lumen 作为中间层,给web提供直接性的安全api,然后通过逻辑控制直接操作strapi的db
建立Controller
app/http/Controllers 目录下建立 User.php
定义一个login的api,如果成功返回token
// 定义一个登录接口,接收email和密码
// 返回json,包含登录成功,token,用户信息
public function login(Request $request)
{
$email = $request->input('email');
$password = $request->input('password');
// password = md5(password + email)
$password = md5($password . $email);
$client = new Client();
try {
// 发送GET请求到外部API
$response = $client->request('GET', env("DB_API").'my-users', [
'query' => [
'filters' => [
'email' => [
'$eq' => $email
]
]
]
]);
// 获取并解码响应体
$data = json_decode($response->getBody()->getContents(), true);
// 如果没有找到用户,返回错误响应
if (empty($data['data'])) {
return response()->json([
'success' => false,
'message' => 'User not found'
]);
}
// 获取用户信息,获取 id, email, password
$user = $data['data'][0];
// 检查密码是否匹配
if ($user['attributes']['password'] ! $password) {
return response()->json([
'success' => false,
'message' => 'Password is incorrect'
]);
}
// 生成token
$token = md5($user['id'] . $user['attributes']['email'] . time());
// 更新用户的token
$response = $client->request('PUT', env('DB_API').'my-users/' . $user['id'], [
'json' => [
'data' => [
'last_token' => $token
]
]
]);
// 返回登录成功的响应
return response()->json([
'success' => true,
'token' => $token,
'user' => [
'id' => $user['id'],
'email' => $user['attributes']['email']
]
]);
} catch (\Exception $e) {
// 处理请求失败的情况
return response()->json([
'success' => false,
'message' => $e->getMessage()
], 500);
}
}
web端调用
- 页面上的api操作先要映射回页面服务器
浏览器的安全机制,默认不能跨域调用
- myUserAPI.ts 调用上文login接口
export const loginAPI = async(email, password) => {
try {
// 使用axios调用 POST API, 参数为json格式
const response = await axios.post('/api/login', {
email,
password
});
console.log(response.data);
// 返回API响应的数据
return response.data;
} catch (error) {
return false
}
};
总结
以上,完成了一个标准化的 登录流程,鼓掌!~