使用 Spring Boot、OAuth 和 JWT 保护 SPA?
Securing a SPA with Spring Boot, OAuth, and JWT?
我一直在通过 this tutorial which shows how to secure a single page application using several scenarios going from simple to our own Authorization Server that delegates authentication to a provider. The first scenario uses the Authorization Code Grant 让用户登录。
假设我们在这种情况下用我们自己的替换 Facebook 的 OAuth 服务器并将其配置为 return JWT 令牌。
如果 SPA 想要使用 JWT 令牌通过在资源服务器之间进行负载平衡的边缘服务器保护请求,应该使用哪个 OAuth 流程?
另外,如果我们想使用 JWT 令牌替换 spring 中默认的 JSESSION 和 CSRF 支持,应该如何配置 spring boot / spring 安全? IIUC JWT 令牌可以用作这两个功能的替代品。
更新
根据 Manish 的回答,假设我们使用 OAuth 2 隐式流程,我们:
- 在资源服务器上添加@EnableResourceServer 注释
- 使用 OpenID Connect 客户端实现隐式流
所以一旦完成,假设每个请求都包含 JWT 令牌作为 Bearer Header,那么 POST 请求是安全的,或者我们还需要配置 CSRF 吗?
这将取决于您的应用程序对安全的敏感程度,但建议对公共客户端 (SPA) 使用隐式流。
教程基于授权代码流程,如果您将用您的 STS 替换 Facebook,它仍将使用授权代码流程,因为 @EnableOAuth2Sso 将 JWT 令牌存储在服务器上并将 cookie 发送到浏览器,它还使用刷新令牌来获取新的 JWT 令牌。这是一个基于 API 网关模式使用 public 客户端 (SPA) 实现授权码流程的自定义流程。
要实现隐式流 - 不要在服务器端使用 @EnableOAuth2Sso,只需公开 REST API 并使用 @EnableResourceServer 保护它。并且你需要使用oidc-client来实现隐式流link is here https://github.com/IdentityModel/oidc-client-js
仅当您将在浏览器的 cookie 中存储 JWT 令牌或会话标识符时,才需要 CSRF 保护。
我一直在通过 this tutorial which shows how to secure a single page application using several scenarios going from simple to our own Authorization Server that delegates authentication to a provider. The first scenario uses the Authorization Code Grant 让用户登录。
假设我们在这种情况下用我们自己的替换 Facebook 的 OAuth 服务器并将其配置为 return JWT 令牌。
如果 SPA 想要使用 JWT 令牌通过在资源服务器之间进行负载平衡的边缘服务器保护请求,应该使用哪个 OAuth 流程?
另外,如果我们想使用 JWT 令牌替换 spring 中默认的 JSESSION 和 CSRF 支持,应该如何配置 spring boot / spring 安全? IIUC JWT 令牌可以用作这两个功能的替代品。
更新
根据 Manish 的回答,假设我们使用 OAuth 2 隐式流程,我们:
- 在资源服务器上添加@EnableResourceServer 注释
- 使用 OpenID Connect 客户端实现隐式流
所以一旦完成,假设每个请求都包含 JWT 令牌作为 Bearer Header,那么 POST 请求是安全的,或者我们还需要配置 CSRF 吗?
这将取决于您的应用程序对安全的敏感程度,但建议对公共客户端 (SPA) 使用隐式流。
教程基于授权代码流程,如果您将用您的 STS 替换 Facebook,它仍将使用授权代码流程,因为 @EnableOAuth2Sso 将 JWT 令牌存储在服务器上并将 cookie 发送到浏览器,它还使用刷新令牌来获取新的 JWT 令牌。这是一个基于 API 网关模式使用 public 客户端 (SPA) 实现授权码流程的自定义流程。
要实现隐式流 - 不要在服务器端使用 @EnableOAuth2Sso,只需公开 REST API 并使用 @EnableResourceServer 保护它。并且你需要使用oidc-client来实现隐式流link is here https://github.com/IdentityModel/oidc-client-js
仅当您将在浏览器的 cookie 中存储 JWT 令牌或会话标识符时,才需要 CSRF 保护。