Tag: jwt

处理JWT到期和JWT有效负载更新

我有一个基于Koa的Node.js后端,用于我的个人/业余爱好应用程序。 我用JWT令牌实现了会话处理。 客户端(AngularJS)在成功login后获取令牌并将令牌存储在某个地方(目前在sessionStorage但对于这个问题目的不重要)。 我有两个问题: 当我需要更新JWT代表的用户logging时,比方说,用户打开了2FA,所以我要求他提供他的电话号码,我想在用户的logging中设置这个电话号码。 目前,在电话号码成功validation后,我打电话给我的后端更新用户logging,我创build一个新的JWT令牌与更新的用户logging(我排除敏感信息从JWT令牌像散列密码,但我想包括客户端使用的电话号码)。 当某些凭证更改并使用此新令牌更新现有客户端令牌时,是否可以创build新令牌? 我是否永远不会创build另一个令牌,只有在成功validation后才创build一个令牌? 我如何更新令牌中的有效载荷? 我应该如何处理过期的JWT令牌? 在我看来,我有3(可能)的情况: 2.1。 智威汤逊(JWT)设置为短暂的生活,比如15分钟。 如果后端服务器回复401 Unauthenticated“Invalid token”(我猜这是koa-jwt的默认行为),那么我会自动注销我的客户端,并要求重新validation。 但是我也build立了一个互补的中间件,这个中间件是后端链中的最后一个,用刷新的到期来重新创build令牌,并且客户端也用已刷新的令牌代替现有的令牌。 因此,如果用户处于活动状态,并且每个受保护的API调用都使用该应用程序,则在成功的情况下,将创build一个新的令牌来replace旧的令牌。 2.2。 JWT的设置时间很长,比如说1周,如果到期,我会从客户那里select重新authentication。 2.3。 复制https://tools.ietf.org/html/rfc6749#section-1.5 。 在成功validation后创buildJWT令牌时,我们发送一个access_token以及一个refresh_token。 当access_token过期并且服务器响应HTTP 401'无效标记'( koa-jwt默认值)时,客户端将refresh_token发送给支持者以要求新的access_token(以及可选的新的refresh_token)。 在这种情况下,我不完全了解refresh_token如何validation旧的access_token以提供新的令牌? 或者为什么我们需要有一个refresh_token? 关于上层主题(JWT更新和JWT到期)的任何通用build议将会有所帮助。

如何在注销时销毁JWT令牌?

我正在使用jwt插件和策略在hapijs。 我可以在login用户时创buildjwt token,并通过“jwt”策略使用相同的标记validation其他API。 我将“request.state.USER_SESSION”中的标记设置为cookie,其中USER_SESSION是标记名称。 另外我不保存这些令牌在数据库中。 但是如何在注销的时候销毁jwt令牌。 请build议一个方法。

超级testing,testing安全的REST API

我正在编写由jwt保护的REST API的集成testing。 一个API操作POST /user/token返回一个给定username和password的jwt ,然后使用该令牌来执行一系列操作,例如: GET /user/:id 在路由使用jwt({secret: secret.secretToken}) ,令牌包含在http头Authorization 。 当使用超级testing进行testing时,我可以进行嵌套testing,但是我想先获取令牌,然后将此令牌用于其他操作testing。 POST /user/token => 12345 GET /user/:id, `Authorization Bearer 12345` GET /user/:foo, `Authorization Bearer 12345` 如何避免为每个操作testing(见下文)生成一个新的标记,但只使用一个由POST / user / token生成的标记。 it('should get a valid token for user: user1', function(done) { request(url) .post('/user/token') .send({ _id: user1._id, password: user1.password }) .expect(200) // created .end(function(err, res) { […]

Json Web令牌不会过期

我刚刚实现了一个json Web令牌authentication,在我的后端我发送由jsonwebtoken创build的jsonwebtoken给客户端如下: var token = jwt.sign(user, secret.secretToken, { expiresInMinutes: 1 }); return res.json({ token: token }); 而在客户端,我只是将这个令牌存储到SessionStorage中。 事情是令牌不会在一分钟后过期,我错过了什么? 编辑:我实现了这个post中显示的相同的东西。

使用NodeJS服务器devise移动身份validation

我最近在为一个iOS应用程序的安全和用户身份validation问题挣扎,主要的问题是如何让用户注册任何第三方服务(或本地用户帐户),仍然保持安全和模块化的过程。 我提出的解决scheme是相当复杂的,我不是100%确定,如果所有这一切都是最佳实践,所以我想我会问,并得到什么build议和指针我可以修复,什么效果好,什么是坏等。 首先是authentication的问题。 我喜欢将authentication的想法与用户的想法分开。 对我来说,身份validation是由设备或客户端执行的,与特定用户无关,而用户帐户是由于身份validation而创build或检索的。 你可以做的是将客户端的身份validation视为一个进程,然后对用户进行身份validation(检查是否存在帐户等),以便有两层安全性。 假设客户端成功authentication,但用户密码错误,整体authentication失败,松散耦合这两个概念是有利的。 为了实现身份validation,我使用了JWT(JSON Web Tokens)通过cookie,原因很多。 1)它们在移动设备上工作得更好2)无会话,这使得服务器的实现变得更容易,并且据我所知,不受CORS攻击。 JWT似乎是使用移动设备时更好的解决scheme。 我使用了大量的npm库,最值得注意的是express-jwt和jsonwebtoken在服务器端进行身份validation。 正如我上面提到的,我不仅要执行身份validation,还希望允许用户注册任何他们想要的第三方服务,例如Facebook,Twitter,以减less注册期间的用户摩擦。 在思考这个问题之后,我花了很长时间search,提出了一个身份authentication系统的概念,authentication系统中的每个“账户types”被视为一个单独的身份提供者,并被推广为提供诸如access_token ,user_id,到期数据等。身份提供者很像在许多应用程序设置页面中看到的“已关联的帐户”。 在iOS的一面,我做了一个抽象类,为了支持每个服务,我创build了一个具体的子类, FacebookIdentityProvider , LocalIdentityProvider (email / password)等等。 在服务器端,我使用Passport模块来备份每种身份提供者。 例如,他们有一个facebook令牌模块,一个用户的电子邮件和密码等。所以我做了一个API路由/authenticate ,我的客户向序列化的身份提供商请求,并基于标识符string, local , facebook-token ,护照会根据提供的信息调用相应的子模块来validation该提供者。 总的来说,安全stream程如下所示: 客户端检查磁盘是否存在以前的JWT令牌(使用encryption箱进行安全存储)。 如果find令牌,客户端向我的verify端点发出请求。 该端点将validation令牌是否仍然有效并且没有过期。 如果令牌没有过期,客户端将被发送一个200,并与世界一切好。 如果不是,那么客户端将向我的refresh_token端点发出一个请求,其中包含已过期的令牌,它将尝试重新发送令牌。 如果失败,则客户端向我的authenticate端点发出请求,该端点只能由用户操作调用。 如果在磁盘上最初没有发现令牌,则在3的末尾发生同样的事情,客户端必须等待用户进行authentication。 所有这些工作都已经完成并且实现了,但是我仍然对一些事情有些模糊。 首先,我在express-jwt页面上读取了关于撤销令牌的内容。 什么决定了什么时候我应该撤销令牌并重新login用户? 每当它无限期地到期时,保持刷新令牌是没有意义的。 其次,当我将序列化身份提供者发送到服务器时,我传递一个额外信息的字典,这个信息将被护照用来根据进程进行身份validation。 如果成功,则为该用户创build身份提供者并存储在数据库中。 这是足够的,还是应该做更多的access_token和其他领域,我从一个成功的电话回来? 特别是对于Facebook SDK,当客户端通过应用程序进行身份validation时,我获得访问令牌,然后在客户端再次与服务器进行身份validation时,获得另一个令牌。 我有一个额外的想法是有人集成了每个请求通过头或查询parameter passing一个API密钥。 API密钥将被保密,并在客户端得到保护。 我认为这会做的是添加另一层“身份validation”,甚至还没有通过身份validation过程的客户端。 只有拥有api-key的客户才能够首先达到我的api,而且只有这些客户才能够进行身份validation。 我的背景是正式的networking安全(我从来没有任何好处),现在是全栈式移动开发,所以我对这个东西有更好的把握,但是我觉得好像在缺乏一些潜在的危险漏洞。 我不幸的是不能发布代码,因为这是我的业务,​​但如果有什么我不明确,只是评论,我会很乐意详细说明。 另外我觉得我应该提到,所有这些都是通过使用Nginxconfiguration的SSL完成的,并且我所有的iOSnetworking请求都是使用Overcoat进行的 […]

与JQuery一起使用JWT,不断得到一个错误

我目前正在使用JSONWebtoken与NodeJSbuild立一个API。 当我尝试使用标头中的标记时,我收到错误403,它直接转到下面代码中的else语句,这意味着标记根本就不存在。 以下是我在服务器端获取令牌的方法: router.use(function(req, res, next){ var token = req.body.token || req.query.token || req.headers['x-access-token']; //decode token if(token) { jwt.verify(token, app.get('secretKey'), function(err, decoded){ if(err) return res.json({ success:false, message: 'failed, token problem'}); else { req.decoded = decoded; next(); } }); }else { return res.status(403).send({ success:false, message: 'token not provided' }) } }); 在客户端,我使用JQuery并将其保存在cookie中: 令牌作为数据的作品: $.ajax({ type:'GET', dataType: […]

在NodeJS后端使用JWT和Active Directoryauthentication

我正在构build一个由Angular前端和Node.JS后端组成的Intranet Web应用程序。 应用程序需要使用企业Active Directory进行身份validation和授权。 我正在考虑如何以一种安全的方式最好地实现这一点。 我计划使用Active Directory节点模块实际与AD通信,以便在用户login时进行身份validation,并检查某些受限操作的安全组成员身份等。 但是,我不太确定授权我的后端端点的最佳方式是什么。 AD模块不提供任何令牌/票证,即使我假设Kerberos用于实际的身份validation过程。 在我开发的其他已validation的应用程序中,当用户login时,我生成了一个jsonwebtoken,然后在每个后端path中传递并validation该标记,在对AD进行身份validation时也是一个好主意? 编辑:问题的第二部分催生单独的线程: JWT令牌的服务器端处理的最佳做法 另外,对于实际validation令牌的最佳实践,我有一个更为普遍的关注。 假设用于JWT生成的“秘密”被破坏(在我的场景中,许多人可能有权访问系统的源代码,但不能访问系统本身)。 我是否相信恶意用户可以只用这些信息代表任何给定的用户生成一个令牌,而不用ADvalidation在我的API请求中使用该令牌? 令牌通常使用jwt.sign(payload, secretOrPrivateKey, options)生成jwt.sign(payload, secretOrPrivateKey, options) 。 或者,假设恶意用户可以获得一个实际的令牌(在过期之前)。 对我来说,似乎不必知道用户的用户名和密码,现在安全性已经降低到必须知道用户名和JWT秘密。 这是一个有效的关注,我该怎么做才能防止这种情况? 到目前为止,我最大的希望是使用服务器端会话login后存储有关当前用户的信息,以便即使在访问后端端点时恶意生成并使用令牌,除非用户实际已经通过login路由,通过ADauthentication,并在会话中存储一些信息。 我还考虑过在每个 API端点中实际使用AD进行身份validation,但这需要在每个请求中发送AD用户名/密码,这又要求敏感信息必须存储在客户端的sessionstorage或localstorage中,最有可能是一个坏主意。 所以,问题: 1)将AD授权与JWT结合为不记名令牌是合理的,还是使用AD进行authenticationbuild立安全后端+前端的首选方式是什么? 2)如果JWT是一个好主意,那么使用JWT保护端点的最佳做法是什么? 使用服务器端会话是否合理? 有趣的是,我已经发现了很多关于如何最好地实现基于令牌的authentication的例子(一般来说,或者特别是用NodeJS),但是其中有许多似乎有这样或那样的缺陷。

使用JWT进行环回authentication

我想了解如何将自定义JWT路由安装到loopbacks安全模型中。 我的应用程序有一个涉及SMS的身份validation“跳舞”,这个身份validation会使用出色的描述来生成有效的JWT令牌。 我使用jsonwebtoken ,事情按预期工作。 在获得令牌后,我的angular.js客户端会发送带有Authorisation: JWT ..token..标头中的每个请求的标识(发现有冲突的文档,一个说JWT,一个承载者,但是我可以弄清楚)。 现在我想在循环应用程序中使用令牌。 我想使用ACL系统环回提供的。 我读过以下资源: 使用JSON Web令牌validationNode.js API 环回,在用户login 第三方login(护照) 环回,进行authentication的请求 智威汤逊的护照策略 环回OAuth2.0源 环回卫星 我不清楚我的下一步是什么。 我有工作: 用户“login” – 生成JWT 用户login使用用户名/密码(将退休) 在环回中使用ACL实现(当我访问ACL受保护的资源时,正如我们所期望的那样,发生4xx错误) 我的JWT令牌正确(?)在请求的头部 我需要: 基于JWT令牌的angular色兼容环回ACL的有效用户 非常感谢帮助

如何使用JWT使用NodeJS客户端库访问Google Directory(Admin SDK)?

我正在尝试创build一个服务器应用程序,将用户添加/删除到我的域组。 请注意,它不会与用户有任何交互,它是服务器到服务器的应用程序。 我在Google API Console中注册我的应用程序,下载密钥并通过发布将其转换为.pem openssl pkcs12 -in my_google_key.p12 -out my_google_key.pem -nocerts -nodes 然后我去了域pipe理,安全 – >高级设置 – >authentication – >pipe理OAuth客户端访问。 在那里,我在授权API客户端添加了一条logging。 我使用了我从Console中的服务帐户获得的客户端ID,并使用范围: https://www.googleapis.com/auth/admin.directory.group. 我安装了用于nodejs的googleapis npm install googleapis 这是我的代码: var googleapis = require('googleapis'); var SERVICE_ACCOUNT_EMAIL = 'My Service Account E-mail Address'; var SERVICE_ACCOUNT_KEY_FILE = 'my_google_key.pem'; // The .pem file is at the root of my application […]

Nodejs / mongodb-检查用户是否具有pipe理员权限(基于令牌的身份validation)

在我的express / mongoose应用程序中,我定义了verifyOrdinaryUser函数来检查用户是否在服务器上进行身份validation。 哪个效果很好,但是我已经在下面定义了verifyAdmin函数来检查用户是否也具有pipe理权限(我使用passport-local-mongoose模块来定义用户模式)。 正如你可以看到在verifyOrdinaryUser()函数中检查用户的令牌,它会加载一个名为解码的新属性的请求对象,我试图在verifyAdmin重用,这就是当我在postman中得到以下错误。 { "message": "Cannot read property '_doc' of undefined", "error": {} } 以下是 var User = require('../models/user'); var jwt = require('jsonwebtoken'); var config = require('../config.js'); exports.getToken = function (user) { return jwt.sign(user, config.secretKey, { expiresIn: 3600 }); }; exports.verifyOrdinaryUser = function (req, res, next) { // check header or url parameters […]