2015-10-02 106 views
2

您好我正在创建使用REST API端点与服务器端进行通信的移动本机应用程序。
我曾经有开发本地客户端的经验,但我有简单的令牌(随机生成的字符串)存储在数据库中的用户信息存储在同一个表中。所以它就像在浏览器中使用的会话,但不是Cookie,每个请求在标题中都有标记。JWT令牌登录和注销

最近我编辑了JWT令牌。这似乎是保护私密端点的好方法。您可以向移动客户端请求令牌,只要您通过+登录并获取生成的令牌即可。
但是重要的是这个令牌不存储在服务器上的任何地方,服务器使用私钥对服务器进行验证,秘密字对私人服务器是私有的。
对于受保护的端点无妨,但如果我需要用户会话时该怎么办,例如Facebook,Amazon,Aliexpress等应用程序如何工作,他们有能力在不提供凭据的情况下使用应用程序,只需浏览商店,但是当用户不想购买时需要登录。之后,用户会话保持一段时间。 这可以使用JWT令牌实现而没有任何问题,但是当用户需要注销时,在这种情况下该怎么办?令牌不会存储在服务器上的任何位置,那么如何销毁此令牌以使其无效?

如果令牌存储在数据库中,则API不是无状态的,因为REST API应该是。 所以一般来说,没有办法让用户登录到无状态的API中,对吗?

我有一些想法如何使用JWT令牌来实现这一点,但这也不会是无状态的API,据我所知。

  1. 创建过期令牌
  2. 名单
  3. 存储在数据库中智威汤逊的道理,但什么是自描述性的记号在这种情况下,目的(JWT),如果它被存储在数据库中,智威汤逊的主要思想如我所知,用令牌保留所有信息。

请建议在这种情况下最好的方法是什么,纠正我,如果我错了。
谢谢。

回答

0

JWT认证基本上发生在客户端和服务器端。

当用户发送用户名和密码进行身份验证时。它对数据库进行检查,如果有效,会生成一个joken并将其发回给用户。有多种API用于生成JWT令牌,您可以检出http://jwt.io/

一旦令牌生成并发送回来,它就需要在每个请求中随同标头一起发送,并且需要在服务器端进行验证,然后将API提供给用户。

由于API本身允许您在服务器端对其进行解码,因此无需存储该令牌。

+4

什么注销是最主要的问题我在我intrested – eemrxoha

2

如果您使用的是JWT,那么您无法拥有服务器端状态,以便正确注销用户而不会破坏首先使用JWT的目的。如果你想这样做,最好的选择是在DB和JWT中保存最后的注销日期,如果这些日期不匹配,则注销用户(不更新本例中的日期)。但是,您现在有服务器端状态。

在数据库中存储注销令牌看起来像是过度杀伤。

另一种选择是,您可以生成由CSPRNG生成的128位令牌,将此值使用SHA-256存储在数据库中,然后在Web令牌中使用unhash值。这样您可以简单地删除条目以注销用户服务器端。这是更安全的选项,因为您现在有办法正确过期服务器上的令牌和会话。如果用户更改密码,或者想要通过注销其他会话来保护其帐户,现在可以执行此操作。

-1

如果您需要注销用户,请提供注销链接。例如,服务器应该通过用任何空数组编码令牌来重置会话数据。用户将有一个有效的会话,但不会有有效的信息来验证它们。

在登录时有效令牌

$data = array("id"=>1,"user_type"=>"Admin"); 
$token = JWT:encode($data, $key); 

验证令牌

$token = $_POST['token']; 
$data = JWT:decode($data, $key, $hash); 
if($data.id){ 
return "valid token"; 
}else{ 
return "invalid token" 
}