【发布时间】:2020-04-11 20:15:55
【问题描述】:
我正在尝试各种基于 Java Spring 的安全实现,如下所示
1. JWT 身份验证
- 用户访问/
- Springboot 识别为受保护资源并将用户重定向到 /login
- 用户输入凭据,浏览器执行 POST 到 /authenticate
- 服务器验证凭据并生成 JWT 令牌。设置为响应头并重定向到 /
- 浏览器加载 /. AngularJS 识别响应头中的 JWT 令牌并将其存储在 localStorage 中
- 所有后续调用都将在标头中包含 Bearer 令牌(通过 httpInterceptor 注入)
注意:无状态会话
2。 OAuth2 身份验证
- 用户访问/
- Springboot 识别为受保护资源并将用户重定向到 /login
- /login 被 Spring 安全拦截。使用生成的状态重定向到 Oauth2 授权服务器并将 URL 重定向回应用程序
- 用户输入凭据
- Oauth 服务器重定向回应用程序 URL“/login?code=xxx&state=yyy”
- /login 被 Spring 安全拦截。识别代码和状态,生成 Cookie 并设置在响应头中。重定向到 /
- 浏览器加载 /。浏览器识别响应标头中的 cookie 并将其存储。
- 如果调用 /user,Principal 对象将填充 JWT,我可以按如下方式提取该 JWT
@RequestMapping(value= {"/user")
public ResponseEntity<Map<String, String>> user(Principal principal) throws Exception {
OAuth2Authentication obj = (OAuth2Authentication) principal;
authentication = obj.getUserAuthentication();
OAuth2AuthenticationDetails oAuth2AuthenticationDetails = (OAuth2AuthenticationDetails) obj.getDetails();
String jwt = oAuth2AuthenticationDetails.getTokenValue();
- 所有后续调用都将在请求中包含 Cookie
注意:在服务器端创建一个有状态会话来存储会话详细信息。这需要解密 cookie 并识别用户
现在我想使用 Oauth2+JWT 实现安全性,但同时无状态,如下所示
3。 OAuth2 + JWT + 无状态
- 用户访问/
- Springboot 识别为受保护资源并将用户重定向到 /login
- /login 被 Spring 安全拦截。使用生成的状态重定向到 Oauth2 授权服务器并将 URL 重定向回应用程序
- 用户输入凭据
- Oauth 服务器重定向回应用程序 URL“/login?code=xxx&state=yyy”
- /login 被 Spring 安全拦截。识别代码和状态,通过调用提取 JWT 令牌 OAuth2AuthenticationDetails.getTokenValue() 并在响应中设置 标题。重定向到 /
- 浏览器加载 /. AngularJS 识别响应头中的 JWT 令牌并将其存储在 localStorage 中
- 所有后续调用都将在标头中包含 Bearer 令牌(通过 httpInterceptor 注入)
问题
我正在尝试弄清楚如何实现上面突出显示的步骤
【问题讨论】:
-
编辑 1:这个问题 stackoverflow.com/questions/51456479/… 与我正在尝试做的事情相反,即在重定向到 OAuth 服务器时发送参数
-
您找到解决方案了吗?我也想实现第三个实现。
标签: angularjs spring-boot oauth-2.0 jwt