我一直在使用 React、Laravel、Laravel Sanctum 构建一个博客项目,它提供身份验证。
我了解到客户端(例如网络浏览器)必须请求 api/sanctum/csrf-cookie,因为我必须检索 csrf 令牌。接下来,通过使用适当的登录数据(电子邮件、密码)请求 api/login,我可以获得由 Laravel Sanctum 生成的 plainTextToken。
现在我发现当我想登录时如何使用 plainTextToken 。要将 Bearer Token 放入请求标头中,我需要将 plainTextToken 存储在某处。
我可以将 plainTextToken 存储在 LocalStorage 或 SessionStorage 中吗?
因为..我认为每当我访问需要身份验证的页面时,React Components应该维护并提供令牌数据。
我会附上已经写好的Laravel AuthController。
class AuthController extends Controller
{
public function register(Request $request)
{
$val = $request->validate([
'name' => 'required|string|max:255',
"email" => "required|email|string|max:255|unique:users",
"password" => "required|confirmed|string|min:12"
]);
$user = User::create([
"name" => $val['name'],
'email' => $val['email'],
'password' => Hash::make($val['password']),
]);
return response()->json([
'user' => $user
], 201);
}
public function login(Request $request)
{
if(!Auth::attempt($request->only('email', 'password'))) {
return response()->json([
'message' => "Invalid Login Details"
], 401);
}
$user = User::where('email', $request['email'])->firstOrFail();
$token = $user->createToken("auth_token")->plainTextToken;
return response()->json([
'access_token' => $token,
"token_type" => "Bearer",
]);
}
public function account(Request $request)
{
return $request->user();
}
public function logout(Request $request)
{
$request->user()->currentAccessToken()->delete();
return response()->json([
"msg" => "See You Later"
]);
}
public function delete(Request $request)
{
$request->user()->softDelete();
return response()->json([
"msg" => "You never register this email again"
]);
}
}
使用 Laravel Sanctum,不需要通过会话或本地在服务器端存储“纯文本令牌”(因为它是 Sanctum STATELESS 授权的一部分)。您只需要在授权标头中发送“明文令牌”(来自客户端)作为承载令牌,然后在服务器端,Sanctum 执行授权操作(这对我来说现在很神秘)。