验证 Token JWT 是否有效
Verify if Token JWT is valid
我正在使用 Slim Framework 开发后端。但是我找不到比较登录函数生成的令牌的方法:
public function login($request, $response){
$key = $this->container['key'];
$email = $request->getParsedBody()['email'];
$senha = $this->salt . $request->getParsedBody()['senha'];
$usuario = $this->em->getRepository(UsuarioEntity::class)->findOneBy(['email' => $email]);
if(empty($usuario) || !password_verify($senha, $usuario->getSenha())) {
return $response->withJson('Usuario sem permissão de acesso', 401);
}
$token = array(
"session" => password_hash($usuario->getId() . 'f*u87', PASSWORD_BCRYPT),
"id" => $usuario->getId(),
"iat" => time(),
"exp" => time() + (60 * 10)
);
$jwt = \Firebase\JWT\JWT::encode($token, $key);
return $response->withJson($jwt, 200);
}
在前端 (React) 我调用了一个 JS class 来处理所有请求。我获取并存储了令牌值,但我不知道如何使用它来检查用户是否登录
Requisition.js
axiosPost(funcao,dados){
//A AUTENTICAÇÃO VAI AQUI
return axios.post(config.urlBase + funcao, dados);
}
setToken(token){
this.token = token;
}
getToken(){
return this.token;
}
LoginEmpresa.js(反应组件)
login(){
var reqAxios = new Requisicoes();
reqAxios.axiosPost('login',{ email: this.state.email, senha: this.state.senha }).then(res => {
if(res.data){
reqAxios.setToken(res.data);
}else{
[...]
}
})
}
谢谢
由于您的前端是 React 应用程序,因此在登录响应中,您应该将令牌存储在应用程序的状态中。你可以在你的应用程序的主要组件或 redux 商店或其他任何地方拥有它。
考虑将 JWT 存储在 localStorage 上也很好,以确保用户在应用程序的多个选项卡之间保持登录状态。
如果您使用的是 JWT 协议,您应该将 axios 实例配置为发送带有令牌的授权 HTTP header。我在你提供的代码中没有看到它
您可以通过向后端发出请求来检查 JWT 是否有效 API。
public function getUser($request, $response){
$user = // GET CURRENT LOGGED IN USER BASED ON THE JWT
if(!$user) {
return $response->withJson('user is not logged in', 401);
}
return $response->withJson($user, 200);
}
在 React 部分,您可以向 API 发出请求以获取当前登录的用户。
- 如果您收到
200
用户响应 -> 已登录
- 如果您收到
401
回复 -> 未登录
您可以使用响应interceptor from Axios来检查状态码:
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
if (error.status === 401) {
// DELETE YOUR TOKEN
this.removeToken();
}
return Promise.reject(error);
});
此外,我建议您将令牌存储在 localStorage 中,这样用户的会话就不会在页面刷新时过期。
setToken(token){
localStorage.setItem('jwt_token', token);
}
getToken(){
return localStorage.getItem('jwt_token');
}
removeToken(){
localStorage.removeItem('jwt_token');
}
我正在使用 Slim Framework 开发后端。但是我找不到比较登录函数生成的令牌的方法:
public function login($request, $response){
$key = $this->container['key'];
$email = $request->getParsedBody()['email'];
$senha = $this->salt . $request->getParsedBody()['senha'];
$usuario = $this->em->getRepository(UsuarioEntity::class)->findOneBy(['email' => $email]);
if(empty($usuario) || !password_verify($senha, $usuario->getSenha())) {
return $response->withJson('Usuario sem permissão de acesso', 401);
}
$token = array(
"session" => password_hash($usuario->getId() . 'f*u87', PASSWORD_BCRYPT),
"id" => $usuario->getId(),
"iat" => time(),
"exp" => time() + (60 * 10)
);
$jwt = \Firebase\JWT\JWT::encode($token, $key);
return $response->withJson($jwt, 200);
}
在前端 (React) 我调用了一个 JS class 来处理所有请求。我获取并存储了令牌值,但我不知道如何使用它来检查用户是否登录
Requisition.js
axiosPost(funcao,dados){
//A AUTENTICAÇÃO VAI AQUI
return axios.post(config.urlBase + funcao, dados);
}
setToken(token){
this.token = token;
}
getToken(){
return this.token;
}
LoginEmpresa.js(反应组件)
login(){
var reqAxios = new Requisicoes();
reqAxios.axiosPost('login',{ email: this.state.email, senha: this.state.senha }).then(res => {
if(res.data){
reqAxios.setToken(res.data);
}else{
[...]
}
})
}
谢谢
由于您的前端是 React 应用程序,因此在登录响应中,您应该将令牌存储在应用程序的状态中。你可以在你的应用程序的主要组件或 redux 商店或其他任何地方拥有它。
考虑将 JWT 存储在 localStorage 上也很好,以确保用户在应用程序的多个选项卡之间保持登录状态。
如果您使用的是 JWT 协议,您应该将 axios 实例配置为发送带有令牌的授权 HTTP header。我在你提供的代码中没有看到它
您可以通过向后端发出请求来检查 JWT 是否有效 API。
public function getUser($request, $response){
$user = // GET CURRENT LOGGED IN USER BASED ON THE JWT
if(!$user) {
return $response->withJson('user is not logged in', 401);
}
return $response->withJson($user, 200);
}
在 React 部分,您可以向 API 发出请求以获取当前登录的用户。
- 如果您收到
200
用户响应 -> 已登录 - 如果您收到
401
回复 -> 未登录
您可以使用响应interceptor from Axios来检查状态码:
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
if (error.status === 401) {
// DELETE YOUR TOKEN
this.removeToken();
}
return Promise.reject(error);
});
此外,我建议您将令牌存储在 localStorage 中,这样用户的会话就不会在页面刷新时过期。
setToken(token){
localStorage.setItem('jwt_token', token);
}
getToken(){
return localStorage.getItem('jwt_token');
}
removeToken(){
localStorage.removeItem('jwt_token');
}