使用Spring和JWT进行基于令牌的身份验证

时间:2019-12-21 22:45:51

标签: java spring authentication jwt

我正在使用Spring Security和JWT为我的移动应用程序实现身份验证/授权系统,我对系统的实际设计有一些疑问。 这是允许用户访问安全的REST API的身份验证/授权流程:

  1. 移动应用程序使用 basic 身份验证方案将请求以及用户名和密码发送到/ auth / token端点。 服务器对返回JWT访问和刷新令牌的用户进行身份验证。

  2. 对端点/ api / **表示的受保护资源的所有后续请求都是通过访问令牌执行的,访问令牌已由服务器验证并信任。验证和信任令牌的逻辑由在弹簧的BasicAuthenticationFilter之前执行的令牌过滤器执行。

  3. 如果令牌不再有效,则客户端将刷新令牌(JWT)发送到/ auth / refresh端点,该端点将验证此令牌,如果可信,则返回新的访问令牌。 / auth / refresh端点是公开公开的,但是它依赖于JWT签名必须有效且受信任的事实。

我也正在考虑使用OAuth,但是我想知道是否可以使用此体系结构设计,或者该体系结构设计可能存在漏洞或可伸缩性问题。 我对身份验证系统还很陌生,我试图了解无需使用OAuth即可实施该身份验证的正确方法。

1 个答案:

答案 0 :(得分:0)

您描述的内容与oauth的密码流程基本相同,除了缺少的clientid和secret。 无论是应用程序还是Web应用程序,都绝对不应将accesstoken尤其是refresh令牌转发给实际的应用程序。

始终在后部和前部通道中思考。前通道是应用程序运行的地方。不可信的环境,例如手机,客户端渲染的应用程序等。

这些环境可能会受到威胁。
因此,您的访问令牌应始终保存在服务器端。

但是:您不必为所描述的用例添加jwt。
如果只需要登录,那么启用启用了csrf验证检查的会话登录机制会更安全。

但是,如果您想使用JWT,建议您使用OAUTH的代码流或确保访问令牌存储在受信任的服务器端。

例如:

  1. 如果用户登录,则返回一个会话cookie。
  2. 此后,他还可以为特殊客户端(在本例中为您的资源服务器或zuul代理)以及诸如“ read_profile,make_payments”之类的范围获得名为authCode的代码。
  3. 此authCode现在已发送到您的资源服务器或(位于端点前面的zuul代理)
  4. 资源服务器本身具有自己的客户端凭据,现在可以通过身份验证服务器进行身份验证,并获得访问令牌以交换authcode。

无论如何,您的用户都将基于双方进行会话身份验证,并且您的资源服务器持有该用户的访问令牌。