相关疑难解决方法(0)

JWT Token身份验证,过期令牌仍在工作,.net核心Web Api

我正在构建一个.net核心web api.

前言 - 我已根据https://stormpath.com/blog/token-authentication-asp-net-corehttps://dev.to/samueleresca/developing-token-authentication-using-aspnet-实施了令牌身份验证核心.我还在github上阅读了一些问题,在这里也是如此.

这也派上用场了https://goblincoding.com/2016/07/24/asp-net-core-policy-based-authorisation-using-json-web-tokens/.

实施之后,我感觉我错过了一些东西.

我创建了一个位于Web客户端的简单Angular应用程序.当我进行身份验证时,会向客户端发送令牌.我现在将它存储在会话中(仍然在开发中,因此将解决以后存储它的安全问题).

不确定这个(JWT(JSON Web Token)自动延长到期时间)是有用的,因为我没有实现刷新令牌,据我所见.

我注意到,当我调用logout,然后再次重新登录时,会向客户端发送一个新令牌 - 正如预期的那样.但是,如果令牌到期时间已过(我将其设置为1分钟进行测试)然后刷新页面,则令牌似乎在我的应用程序中保持不变.即好像令牌永不过期?!

我本来希望客户端返回401 Unauthorized错误,然后我可以处理强制用户重新进行身份验证.

这不是这应该如何工作?是否有一些自动刷新令牌魔法在默认的背景中进行(我没有在教程中明确设置任何刷新令牌的概念)?或者我错过了一些关于令牌身份验证的概念?

此外 - 如果这是一个永久刷新的令牌,如果令牌被泄露,我是否应该关注安全性?

谢谢你的帮助

authentication token jwt .net-core

9
推荐指数
3
解决办法
5920
查看次数

为什么要使用 JWT 刷新令牌

我不确定我是否理解刷新令牌的概念。我知道他们在做什么 - 将它们存储在某个地方,每当访问令牌过期时,就为他们获取一个新的访问令牌。

不泄露这个刷新令牌显然非常重要,否则第三方可以获得新的访问令牌。因此,它需要保持额外的安全。

我的问题是:为什么不让长期访问令牌更加安全?安全性的区别在哪里?

以下是 auth0.com 对这一事实的描述,例如:

好处:泄漏访问令牌的访问窗口更短(这些访问令牌很快过期,减少泄漏令牌允许访问受保护资源的机会)”

这对我来说没有任何意义。所以访问令牌很快过期,因此如果它被泄露,它“还不错”。

另一方面,如果刷新令牌泄漏,则非常糟糕。那么为什么不尝试让访问令牌与刷新令牌一样安全,并获得完全相同的结果,但要管理的令牌少了一个?

oauth-2.0 jwt refresh-token

8
推荐指数
1
解决办法
4086
查看次数

如何重置 JWT 令牌过期时间?

我创建了一个 JWT 令牌以及过期时间以用于身份验证目的。每次当应用程序中出现 url 时,我都会检查令牌。我想增加 JWT 令牌的过期时间。以下是我的做法。但令牌将通过创建令牌时已设置的过期时间来过期。

//creating JWT token only once when user logged in

String jwtToken = new String(Jwts.builder().setSubject(user.getUserId())
                    .setExpiration(expTime).setIssuedAt(new Date())
                    .signWith(SignatureAlgorithm.HS256, "secretkey").compact());

// checking the presence of token every time

Claims claims = Jwts.parser().setSigningKey("secretkey")
                            .parseClaimsJws(jwtToken).getBody();

claims.setExpiration(time); // trying to reset the expiration time
Run Code Online (Sandbox Code Playgroud)

我不知道出了什么问题。任何帮助将非常感激。

java jwt

7
推荐指数
2
解决办法
4万
查看次数

如何在客户端处理访问令牌和刷新令牌

我正在使用AngularJS客户端创建一个网站,并在REST中与后端(在另一个域中)进行通信。

为了验证每个调用,我通过每个HTTPS调用的标头传递一个令牌:“授权:承载access_tokenXXXXXX”

当令牌过期时,由于refresh_token,我能够创建一个新令牌。

access_token和refresh_token需要存储在客户端,因为浏览器需要在HTTP请求标头中将其设置为明文形式。

我的问题是:

问题1:建议使用哪种方式存储access_token和refresh_token以使其对浏览器可用,从而使其相对安全?(我有安静的敏感数据,例如个人照片)

问题2:access_token和refresh_token的建议生存期(=无法使用之前的时间)是多少?(仅供参考,我会在401响应后刷新令牌,并且我的应用是社交应用)

问题3:我有建筑方面的问题吗?我是否应该更改它以便根本不使用JavaScript并使用仅HTTP的cookie?

谢谢 :)

杰弗里

更新:

我最终选择了仅HTTP cookie。我正在使用Django Oauth Toolkit,因此Django正在等待HTTP标头(而不是Cookie)中的授权。

为了解决这个问题,我正在使用一个中间件,该中间件收集cookie的令牌并将其设置在标题中。它还应该允许我在access_token过期之前重新验证用户身份(使用刷新令牌)。

browser security restful-authentication access-token

5
推荐指数
1
解决办法
5017
查看次数

在REST API上"注销"无用吗?

考虑到,根据定义,REST API是无状态的:"注销"操作是无用的吗?

我的意思是,我正在使用加密的JWT创建REST API.每个令牌都有一个到期时间,比方说,60分钟.如果我在数据库表上保存API生成的最后一个令牌,那么"注销"将从有效令牌表中删除它们.但是,如果我这样做,我理解API将不再是无状态的,对吧?

所以,我明白我不应该这样做.我正在考虑的唯一解决方案是将JWT到期时间缩短到5分钟,不执行"注销"操作并让令牌过期.

这是正确的方法吗?

rest api-design logout jwt

5
推荐指数
2
解决办法
6401
查看次数

使用Django Rest框架进行单点登录服务的任何可能方式?

我正在尝试使用ionic2和django rest框架开发移动本机应用程序。我找到了支持出色的jwt身份验证的django-rest-framework-jwt库。但是,它不会自动刷新令牌,因此,只要令牌过期,移动应用程序的用户就应该输入其用户名和密码。

我已经检查了下面的另一个stackoverflow问题。 JWT(JSON Web令牌)自动延长有效期

用户有什么办法不必再次输入用户名和密码?还是可以让令牌不过期并将其保存在移动应用程序的本地存储中,这样用户不必再次登录?

提前致谢!

django jwt django-rest-framework ionic2

5
推荐指数
1
解决办法
1836
查看次数

在发送许多ajax请求时处理axios拦截器

我使用Larave + JWT和vue2 + vuex2 + axios

因此,当用户登录时,我将身份验证令牌存储在vuex存储中.当令牌过期时,我需要刷新它.为了刷新它,我需要发送相同的令牌进行/refresh路由,并获得一个新的令牌.至少我是如何得到的,实际上它是有效的.

问题是拦截器捕获401响应并尝试刷新令牌,但是,如果在我的组件中我发送了许多带有过期令牌的请求,该怎么办?由于ajax请求是异步的,因此拦截器代码会运行很多次.所以我收到了很多刷新请求.刷新初始令牌后,它将被视为无效.当拦截器尝试刷新无效令牌服务器响应错误时,我重定向到登录页面.

这是代码:

axios.interceptors.response.use((response) => {
  return response;
}, (error) => {
  const originalRequest = error.config;

  if (error.response.status === 401 && !originalRequest._retry) {
    originalRequest._retry = true

    axios.post('auth/refresh').then((response) => {
      let token = response.data.token

      store.dispatch('auth/setAuthToken', token)

      let authorizationHeader = `Bearer ${token}`

      axios.defaults.headers = { 'Authorization': authorizationHeader }
      originalRequest.headers['Authorization'] = authorizationHeader

      return axios(originalRequest)
    }, (error) => {
      store.dispatch('auth/clearAuthInfo')
      router.push({ name: 'login' })
    })
  }

  return Promise.reject(error);
});
Run Code Online (Sandbox Code Playgroud)

ajax vue.js axios vuex vuejs2

5
推荐指数
1
解决办法
2609
查看次数

如何生成刷新令牌?

我正在我的一个节点应用程序中实现 JWT。我想知道,是否有任何明确的格式/结构可以生成刷新令牌?

通过明确的格式,我的意思是刷新令牌是否包含任何像 JWT 这样的声明?

更新

让我们假设刷新令牌是:(fdb8fdbecf1d03ce5e6125c067733c0d51de209c取自Auth0)。现在,我应该从中了解什么?

  • 这是一个随机的唯一字符串吗?
  • 这是一个内部有声明的加密字符串吗?

node.js express jwt refresh-token

4
推荐指数
1
解决办法
2981
查看次数