我正在尝试构建spring-angular2(spring to spring)应用程序,我选择OAuth2作为安全模型。我的新应用程序有3个部分。 Auth服务器,后端服务器和前端(角度2)。目前我正在使用OAuth2仅用于身份验证目的
根据我目前的设计,我的服务器(业务层)将与auth服务器进行通信以进行身份验证(基于authorization_code),并将接收OAuth2令牌(短期访问令牌和更长时间的刷新令牌)。我的目的是使用此刷新令牌在需要时生成访问令牌,直到其到期,之后,重定向到auth服务器进行登录。所有令牌管理都将在服务器上处理,前端对此不了解。
现在有了这个设计,当我运行我的应用程序时,angular2应用程序将首先加载,它将尝试访问受保护的URL(作为auth检查)。如果服务器返回401错误,angular将强制网页重定向到auth服务器进行登录。后端服务器使用会话来处理安全性(默认的oauth2client设置)。这里的问题是,当会话因空闲而到期(默认30分钟)时,我将无法使用刷新令牌(10天有效期),春季安全会将网页重定向到auth服务器进行登录。
我认为将会话有效期延长到10天并不是一个好主意。因此,我计划避免设计中的会话,在用户模型(db)中存储令牌,并向浏览器发送一些唯一的ID,用于访问此令牌并使用过滤器创建Authentication对象。 Angular会将此id存储在localstorage中,并发送每个请求标头。
如果我需要在此问题上添加更多输入,请告诉我。
我需要你的建议
1)这种架构是否良好?你有什么建议可以改善吗?
2)有什么办法,我可以处理刷新令牌而不用担心会话空闲超时吗? (正如我之前提到的,我是Spring世界的新手。所以我可能会遗漏一些小的东西)
3)如果我没有会话,你怎么建议我应该将独特的id传达给浏览器(angular2)?我也想避免使用cookies。 url查询字符串是否只能在此设置中将此唯一值传递给angular app?
答案 0 :(得分:0)
与Spring无关,但对于OAuth应用程序,不需要服务器端,因为访问令牌是承载令牌。但在你的情况下,我猜你可以将刷新令牌限制为25分钟,以便在你的会话空闲之前你得到一个新的令牌,但在这里再次(如果我已经正确理解)问题将是你的会话仍将在服务器上超时并且仍将重定向用户以进行身份验证。
逻辑上,您的资源服务器应该只有一个过滤器,可以自己或使用Authz Server验证令牌并授予访问权限。服务器端没有SESSION管理。另外,请考虑注销方案。