当前位置: 首页 > 知识库问答 >
问题:

使JSON Web令牌无效

梁丘霖
2023-03-14

对于我正在进行的一个新的Node.js项目,我正在考虑从基于cookie的会话方法(我的意思是,将id存储到包含用户浏览器中用户会话的键值存储)切换到使用JSON Web令牌(jwt)的基于令牌的会话方法(无键值存储)。

这个项目是一个利用socket.io的游戏--在一个会话中有多个通信通道(web和socket.io)的情况下,拥有一个基于令牌的会话会很有用

如何使用jwt方法从服务器提供令牌/会话无效?

我还想了解在使用这种范例时应该注意哪些常见的(或不常见的)陷阱/攻击。例如,如果此范例容易受到与基于会话存储/cookie的方法相同/不同类型的攻击。

所以,说我有以下(改编自这个和这个):

会话存储登录:

app.get('/login', function(request, response) {
    var user = {username: request.body.username, password: request.body.password };
    // Validate somehow
    validate(user, function(isValid, profile) {
        // Create session token
        var token= createSessionToken();

        // Add to a key-value database
        KeyValueStore.add({token: {userid: profile.id, expiresInMinutes: 60}});

        // The client should save this session token in a cookie
        response.json({sessionToken: token});
    });
}

基于令牌的登录:

var jwt = require('jsonwebtoken');
app.get('/login', function(request, response) {
    var user = {username: request.body.username, password: request.body.password };
    // Validate somehow
    validate(user, function(isValid, profile) {
        var token = jwt.sign(profile, 'My Super Secret', {expiresInMinutes: 60});
        response.json({token: token});
    });
}

--

会话存储方法的注销(或无效)将需要使用指定的令牌更新KeyValueStore数据库。

在基于令牌的方法中似乎不存在这样的机制,因为令牌本身将包含通常存在于键值html" target="_blank">存储中的信息。

共有2个答案

秦昊穹
2023-03-14

上面贴出的想法是好的,但是要使所有现有的JWT无效,一个非常简单容易的方法就是简单地更改秘密。

如果您的服务器创建了JWT,使用秘密(JWS)对其进行签名,然后将其发送到客户端,那么只需更改秘密就会使所有现有的令牌无效,并要求所有用户获得一个新的令牌进行身份验证,因为根据服务器,他们的旧令牌突然变得无效。

它不需要对实际令牌内容(或查找ID)进行任何修改

显然,这只适用于紧急情况,当您希望所有现有令牌过期时,对于每一个令牌过期,都需要上述解决方案之一(如短令牌过期时间或使令牌内存储的密钥无效)。

轩辕经赋
2023-03-14

我也一直在研究这个问题,虽然没有一个想法是完整的解决方案,但它们可能会帮助其他人排除想法,或提供更多的想法。

1)只需从客户端删除令牌

显然,这对服务器端的安全性没有任何作用,但它确实通过删除令牌来阻止攻击者(即,他们必须在注销之前窃取令牌)。

2)创建令牌块列表

您可以将无效的令牌存储到它们的初始到期日,并将它们与传入的请求进行比较。这似乎否定了完全基于令牌的理由,因为您需要为每个请求接触数据库。但是,存储大小可能会更小,因为您只需要存储在注销和过期时间之间的令牌(这是一种直觉,并且肯定取决于上下文)。

3)只需缩短令牌到期时间,并经常轮换

如果您将令牌过期时间保持在足够短的间隔内,并且让运行的客户端跟踪并在必要时请求更新,则number 1将有效地作为一个完整的注销系统工作。这种方法的问题是,它使用户无法在关闭客户机代码之间保持登录(取决于您的过期间隔时间)。

应急计划

如果发生紧急情况,或者用户令牌被破坏,您可以做的一件事是允许用户使用其登录凭据更改底层用户查找ID。这将使所有相关联的令牌无效,因为将无法再找到相关联的用户。

我还想指出,将上次登录日期包含在令牌中是一个好主意,这样您就可以在较远的一段时间后强制重新登录。

关于使用令牌攻击的异同,本文讨论了以下问题:https://github.com/dentarg/blog/blob/master/_posts/2014-01-07-AngularJS-authentication-with-cookies-vs-token.markdown

 类似资料:
  • 问题内容: 我正在尝试使用OAuth 2.0访问Google的文档列表API 3.0,但是遇到401错误的麻烦。 用户接受后,我的代码如下: 然后,在最后一行-getFeed()-引发异常: 这是怎么回事?在静态主测试类上,它的工作原理很吸引人,但是当我在服务器上运行它时,此行不再起作用。任何想法? 解决了 需要使用GoogleOAuthHelper而不是直接使用GoogleOAuthParame

  • 问题内容: 尝试为变量分配值时出现问题。当我尝试按以下顺序将日期作为元组或列表时,问题就会出现: 为什么要打apping? 我如何解决它? 令牌在Python中是什么意思? 问题答案: 在Python 3中,数字前导零是不允许的。例如: 等是不允许的,但应改为和。 但是,在Python 2中,前导零表示该数字是一个 八进制数 (以8为底),因此,或分别表示和,并且以八进制表示,但由于它不是有效的八

  • 我遵循本教程使用JWT令牌。令牌到期时间设置为仅5分钟,但如果我想在使用1分钟后使令牌无效,该怎么办?我希望能够对API进行调用,以删除我的令牌。 我正在使用Express和Node。 从我能收集到的信息来看,我的选择是拥有一个存储令牌的令牌db。当我想让我的令牌过期时,我会从DB中过期/删除该令牌。 我还看到人们随意地说“移除”物理硬盘空间中的令牌,但我无法找出令牌的物理存储位置,以便我移除它。

  • 目前访问类型处于联机状态。当我需要访问驱动器上的文件/文件夹时,我将浏览器重定向到Google URL并获得访问代码: 一切运转良好!但我只需要第一次重定向。 当我谷歌时,在google Drive API文档中,我发现我可以通过浏览器重定向获得刷新令牌,并将其保存在数据库中。(换句话说,我可以使用脱机访问)。 而且每次当我需要从google drive读取数据时,我使用刷新令牌获得访问令牌,而无

  • 这个问题以前被问过很多次,也被回答过很多次,但是我不知道我做错了什么。从Firebase控制台向整个应用程序发送通知可以正常工作,但如果我向单个令牌发送通知,则Firebase控制台会出现错误:"Firebase注册令牌无效。检查令牌格式” 我正在Iphone设备上测试该应用程序。 已在创建新密钥https://developer.apple.com/account/ios/authkey/ 下载

  • 我需要使用json格式刷新GA令牌,但我无法使其工作。使用参数时效果非常好。请让我知道如果你看到任何缺陷!谢谢!!!! Works(无JSON)= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = curl-d " client _ id = { myId } 不起作用 (json) ====