网上有很多关于使用JWT( Json Web Token )进行authentication的信息。 但是,在多域环境中使用JWT令牌进行单一login解决scheme时,我仍然没有find明确的解释。 我为一家在不同主机上有很多网站的公司工作。 我们使用example1.com和example2.com 。 我们需要一个单一的login解决scheme,这意味着如果用户在example1.com上进行身份validation,我们希望他也可以自动在example2.com上进行身份validation。 使用OpenId Connectstream程,我知道想要在example1.com上进行身份validation的用户将首先被redirect到身份validation服务器 (或OP :“OpenId Provider”)。 用户在该服务器上进行身份validation,然后使用签名的JWT令牌将其redirect回原始的example1.com站点。 (我知道还有一个stream程会返回一个中间标记 ,稍后它可以交换为真正的JWT标记,但我不认为这对我们是必需的)… 所以现在用户又回到了example1.com并通过身份validation! 他可以发出请求,将JWT令牌传递给Authentication头,服务器可以validation已签名的JWT,因此能够识别用户。 太好了! 第一个问题: JWT令牌应该如何存储在客户端上? 还有很多关于这方面的信息,人们似乎认为使用Web Storage是一种好方法,而不是老式的cookies 。 我们希望JWT在浏览器重新启动之间保持持久性,因此我们使用Local Storage ,而不是Session Storage … 现在,用户可以重新启动浏览器,只要JWT令牌没有过期,他仍然会在example1.com上进行身份validation! 另外,如果example1.com需要向我们的另一个域发出Ajax请求,我知道configurationCORS将允许。 但是我们的主要用例并不是跨域请求,它有一个单一的login解决scheme ! 所以主要的问题是: 现在,如果用户访问example2.com并且希望他使用他已有的JWT令牌进行身份validation,那么stream程应该是什么? Local Storage似乎不允许跨域访问,所以此时浏览器无法读取JWT令牌向example2.com发出请求! 应该 : 用户被redirect到authentication服务器了吗? 当用户对example1.com进行身份validation时 , 身份validation服务器可能已经为用户设置了一个cookie,因此example2.com的这个新的身份validation请求可以使用该cookie来查看该用户是否已经过身份validation,并立即将其redirect回example2.com与相同的JWT令牌? 或者example2.com上的浏览器是否可以访问JWT令牌而无需再次访问authentication服务器 ? 我看到有跨存储解决scheme ,但那些广泛使用? 他们是跨域SSO环境的build议解决scheme吗? 我们不想要任何花哨的东西,我们会对最常用的解决scheme感到满意!
我正在尝试使用JWT为我的RESTful API实现无状态身份validation。 AFAIK,JWT基本上是一个在REST调用期间作为HTTP头传递的encryptionstring。 但是如果窃听者看到了请求并窃取了令牌呢? 那么他可以用我的身份伪造请求? 实际上,这个问题适用于所有基于令牌的authentication 。 如何防止呢? 像HTTPS这样的安全通道?
使用数据库会话令牌系统,我可以使用用户名/密码进行用户login,服务器可以生成令牌(例如uuid)并将其存储在数据库中,并将该令牌返回给客户端。 其上的每个请求都会包含该令牌,服务器将查找令牌是否有效以及它属于哪个用户。 使用JWT,不需要将会话/令牌相关的任何内容保存到数据库中,这要归功于服务器上保存的密钥和客户端保存并随每个请求一起发送的签名令牌的组合。 这是好的,但除了保存数据库检查每个请求(这将是快速的,因为它只是检查一个哈希表),我不清楚使用JWT的优点是什么。 你能熟悉这个解释吗? 让我们忽略cookie,它是特别的一个数据库自定义令牌如上所述和JWT,我试图比较和理解的好处 。
我正在我的身份validation服务器上实现OAuth 2.0 JWT access_token。 但是,我并不清楚JWT“aud”声明和client_id http头值之间的区别。 他们是一样的吗? 如果不是,你能解释两者的区别吗? 我怀疑是“aud”是指资源服务器,而client_id是指authentication服务器认可的客户端应用程序之一(即web应用程序或IOS应用程序)。 在我目前的情况下,我的资源服务器也是我的Web应用程序客户端。
我想知道的最佳实践,无需更改密码/注销时db分配JWT无效。 我有下面的想法通过点击用户数据库来处理上述2个案例。 1.密码更改的情况下,我检查存储在用户数据库中的密码(散列)。 2.退出login时,我将最后退出时间保存在用户数据库中,因此通过比较令牌创build时间和退出时间,我可以使这种情况失效。 但是,这两种情况是以每次用户点击api时触及用户db为代价的。 任何最佳实践表示赞赏。 更新:我不认为我们可以使JWT无效,而不击中分贝。 所以我想出了一个解决scheme。 我已经发布了我的答案,如果您有任何疑虑,欢迎您。
我正在编写一个Angular Web应用程序,在这个应用程序中通过一个JWT标记来处理authentication,这意味着每个请求都有一个包含所有必要信息的“authentication”标题。 这适用于REST调用,但我不明白应该如何处理后端文件的下载链接(这些文件驻留在托pipeWeb服务的同一台服务器上)。 我不能使用常规的<a href='…'/>链接,因为它们不会携带任何标题,authentication将失败。 window.open(…)的各种咒语也一样。 我想到的一些解决scheme: 在服务器上生成临时不安全的下载链接 将身份validation信息作为urlparameter passing并手动处理 通过XHR获取数据并保存文件客户端。 以上所有都不尽如人意。 1是我现在使用的解决scheme。 我不喜欢它有两个原因:首先它不是理想的安全明智,其次它的工作,但它需要相当多的工作,特别是在服务器上:下载一些我需要调用一个服务,产生一个新的“随机“url,将其存储在某个地方(可能在数据库上)一段时间,然后将其返回给客户端。 客户端得到的url,并使用window.open或类似的。 当请求时,新的url应该检查它是否仍然有效,然后返回数据。 2似乎至less有这么多的工作。 3似乎很多工作,即使使用可用的库,以及很多潜在的问题。 (我需要提供我自己的下载状态栏,加载整个文件在内存中,然后要求用户在本地保存文件)。 这个任务似乎是一个非常基本的,所以我想知道是否有更简单的,我可以使用。 我不一定在找“解决scheme”的解决scheme。 经常的Javascript会没事的。
我正在使用Auth0来处理我的Web应用程序中的身份validation。 我正在使用ASP.NET Core v1.0.0和Angular 2 rc5,而且我对通常的身份validation/安全性知之甚less。 在用于ASP.NET Core Web Api的Auth0文档中,对于 RS256和HS256,JWTalgorithm有两种select。 这可能是一个愚蠢的问题,但是: RS256和HS256有什么区别? 什么是用例(如果适用)?
我正在开发一个使用Java和AngularJS开发的Web应用程序,并select实现令牌authentication和授权。 出于练习的目的,我已经到了将凭据发送到服务器的地步,生成随机令牌存储并将其发送回客户端。 在服务器的每个请求中,我都将标记附加在标题中,并且完美地工作。 对于authentication的angular度来看是完美的,并不需要更多。 但是,我现在想跟踪用户types(admin,普通用户…),以及它的id,或任何其他唯一字段; 据我所知,我必须encryption在令牌,我在发送回login到客户端的过程中。 那是对的吗? 是否有任何JWT库,您可以生成,encryption和解密这些令牌? 链接到图书馆的API和Maven的依赖将非常感激。 谢谢
我一直在阅读关于智威汤逊。 但是从我所读的内容来看,这不是一种authentication机制,而更像是authentication机制中的一个关键组件。 我目前已经实现了一个可行的解决scheme,但只是试用智威汤逊,看看它是如何工作的。 但是现在我所知道的是如何利用它。 从我的经验来看,它基本上只是一个encryption机制,给你一个独特的encryption密钥。 你也可以把信息放在这个令牌里面。 我想要在ASP.NET web api 2上实现它,以供移动应用程序使用。 所以第一步: 服务器:login(用户,密码) 服务器=>应用程序:login好的,inheritance你的JWT app => server:获取我的configuration文件(向请求发送JWT)服务器然后解密JWT并确定请求标识。 现在,这只是我的理解,看我可能是完全错误的道路上。 智威汤逊的理想,所以你不必每个请求进行身份validation? 我只validation一次用户凭证(在初始login时),然后服务器可以简单地使用JWT,而不必在数据库中查找用户pw和用户。 我只是想使用JWT来识别用户是谁。 然后,我会authentication他们后,然后授权。 据我所知,与新的MVC和身份validation和授权有很大的混淆。 所以我的问题归结为。 我如何安全有效地使用JWT实现身份validation机制? 我不想只是咳嗽起来,似乎工作,并没有任何安全隐含的想法。 我确信有一些资源可能devise了一个适合我的要求的安全机制。 我的要求是: 每次会话一次只能检查数据库的用户凭据一次? 由于使用bcrypt使用了大量的资源来比较密码。 必须能够从他们的请求中识别用户。 (即他们是谁,userId就足够了),最好不要访问数据库 应尽可能降低开销,关于服务器端处理请求的资源。 如果入侵者不得不复制设备先前的请求,那么他不应该能够访问真实的用户数据。 (明显) 谢谢
(从这个线程产生,因为这是一个真正的问题,而不是特定于NodeJS等) 我正在使用身份validation来实现REST API服务器,并且我已经成功实现了JWT令牌处理,以便用户可以通过带有用户名/密码的/ login端点进行login,然后从服务器密钥生成JWT令牌并返回给客户。 然后令牌在每个经过validation的API请求中从客户端传递到服务器,服务器密钥用于validation令牌。 但是,我正在试图了解确切地说明如何以及在多大程度上validation令牌的最佳实践,以build立真正安全的系统。 究竟应该参与“validation”令牌? 使用服务器密钥validation签名是否足够,还是应该交叉检查服务器中存储的某些数据的令牌和/或令牌载荷? 基于令牌的authentication系统只会像每个请求中传递用户名/密码一样安全,只要获取令牌的难度要高于获取用户的密码。 但是,在我看到的例子中,生成令牌所需的唯一信息是用户名和服务器端的秘密。 这是否意味着假设一个恶意用户获得了有关服务器机密的知识,他现在可以代表任何用户生成令牌,从而不仅可以访问给定用户,而且密码是获得,但实际上所有的用户帐户? 这带来了我的问题: 1)JWT令牌validation是否应限于validation令牌本身的签名,仅依赖服务器秘密的完整性,还是附带单独的validation机制? 在某些情况下,我已经看到了令牌和服务器会话的组合使用,在通过/ login端点成功login后,会话被build立。 API请求validation令牌,并将令牌中发现的解码数据与会话中存储的一些数据进行比较。 但是,使用会话意味着使用cookie,从某种意义上讲,它违背了使用基于令牌的方法的目的。 这也可能会导致某些客户的问题。 可以想象,服务器将所有令牌当前正在使用的内存caching或类似内容保留下来,以确保即使服务器秘密受到攻击,攻击者可以生成“有效”令牌,但只能通过/ login端点生成的确切令牌会被接受。 这是合理的还是多余的/矫枉过正的? 2)如果JWT签名validation是validation令牌的唯一手段,意味着服务器秘密的完整性是突破点,那么应该如何pipe理服务器机密? 从环境variables中读取并在每个已部署的堆栈上创build(随机化?)一次? 重新定制或定期轮换(如果是的话,如何处理在循环之前创build的现有有效令牌,但需要在循环后进行validation,如果服务器在任何给定的时间保持当前秘密和先前的秘密, ? 别的东西? 当涉及到服务器机密被泄密的风险时,也许我只是过于偏执狂,这当然是一个更加普遍的问题,需要在所有密码的情况下解决。