我正在使用Spring Security和JWT为我的移动应用程序实现身份验证/授权系统,我对系统的实际设计有一些疑问。 这是允许用户访问安全的REST API的身份验证/授权流程:
移动应用程序使用 basic 身份验证方案将请求以及用户名和密码发送到/ auth / token端点。 服务器对返回JWT访问和刷新令牌的用户进行身份验证。
对端点/ api / **表示的受保护资源的所有后续请求都是通过访问令牌执行的,访问令牌已由服务器验证并信任。验证和信任令牌的逻辑由在弹簧的BasicAuthenticationFilter之前执行的令牌过滤器执行。
如果令牌不再有效,则客户端将刷新令牌(JWT)发送到/ auth / refresh端点,该端点将验证此令牌,如果可信,则返回新的访问令牌。 / auth / refresh端点是公开公开的,但是它依赖于JWT签名必须有效且受信任的事实。
我也正在考虑使用OAuth,但是我想知道是否可以使用此体系结构设计,或者该体系结构设计可能存在漏洞或可伸缩性问题。 我对身份验证系统还很陌生,我试图了解无需使用OAuth即可实施该身份验证的正确方法。
答案 0 :(得分:0)
您描述的内容与oauth的密码流程基本相同,除了缺少的clientid和secret。 无论是应用程序还是Web应用程序,都绝对不应将accesstoken尤其是refresh令牌转发给实际的应用程序。
始终在后部和前部通道中思考。前通道是应用程序运行的地方。不可信的环境,例如手机,客户端渲染的应用程序等。
这些环境可能会受到威胁。
因此,您的访问令牌应始终保存在服务器端。
但是:您不必为所描述的用例添加jwt。
如果只需要登录,那么启用启用了csrf验证检查的会话登录机制会更安全。
但是,如果您想使用JWT,建议您使用OAUTH的代码流或确保访问令牌存储在受信任的服务器端。
例如:
无论如何,您的用户都将基于双方进行会话身份验证,并且您的资源服务器持有该用户的访问令牌。