Spring Security 与 Angular - OAuth 2.0 登录 REST 风格

问题描述 投票:0回答:1

我的 Angular 应用程序部署到 localhost:4200,Spring 应用程序位于 localhost:8080。我正在尝试以纯粹的 REST 风格实现 OAuth2 安全性,所以完全是@RestController。我看到的所有示例都需要返回一个不鼓励的视图。

以下是预期流程:

1)我的 Angular 按钮点击: http://localhost:8080/OAuthTrial/api/oauth-login

2)它应该重定向到 Google Auth 屏幕(我正在尝试让 Google 工作,这样我就可以转换到我们的自定义 OAuth 服务器)

3)用户进行身份验证,并回击 Spring 应用程序中的回调端点并获取“代码”

4)Spring 应用程序交换访问令牌的“代码”和 JWT 的访问令牌,并应将其发送回 Angular 应用程序

5)所有 API 端点都必须使用 JWT 进行保护,Angular 应用程序将使用收到的 JWT 来请求该端点。 Spring 应用程序使用 Auth 服务器验证 JWT。

我试图通过 Spring Security 过滤器链设置来完成这项工作,但未能成功。所有示例都涉及返回视图。我正在努力不这样做。

所以我的要求是:

1)如何在 Spring Security 中进行配置。我尝试手动执行此操作(向 Google Auth 服务器发出 HTTPS 请求),并按预期获得所有响应,但使变量在全局可用、身份验证设置等。我发现我也必须手动执行此操作。所以我想我会使用标准实现。

2)当我尝试更改“oauth-login”端点中的 Http“Location”标头时,出现以下错误:

Access to XMLHttpRequest at 'https://accounts.google.com/o/oauth2/v2/auth 
(redirected from 'http://localhost:8080/GoogleOpenId/api/login') from origin 'http://localhost:4200' 
has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

无论如何都要缓解

3)这个流程不可能吗?我正在努力避免隐式流程。据我所知,这里的 SPA 网站不支持 PKCE 授权码。 因此,我尝试使用授权代码来实现此功能,其中我的 Spring 应用程序是 OAuth 客户端,也是资源服务器。

如果社区可以提供 SecurityConfigs 和任何其他配置以及任何相关知识,我们将不胜感激。

提前致谢

angular spring-security spring-security-oauth2
1个回答
0
投票

oauth2Login
安全性基于会话(并且需要 CSRF 保护)。只有
oauth2ResourceServer
安全性是基于代币并且可以是无状态的。

正如您已经想到的,现在建议仅使用“机密”客户端(带有秘密,这需要它在服务器上运行),而不是将单页或移动应用程序配置为“公共”客户端。

实际上,将令牌保留在服务器上并且仅依赖前端和后端之间的会话(具有CSRF保护)更安全:

  • 会话 cookie 可以(并且应该)对 Javascript 代码隐藏
  • 会话可以失效,但访问令牌不能

最好的选择可能是使用像 spring-cloud-gateway 这样的 OAuth2 BFF,在配置为资源服务器的 REST API 之前,使用

oauth2Login
TokenRelay
过滤器配置为 OAuth2 客户端。我为此写了一个教程

顺便说一句,Google 可能只会提供不透明的令牌,您无法将这些令牌有效地用作您自己的资源服务器的访问令牌。您应该使用 Google 作为身份提供商来配置您自己的授权服务器 (Keycloak),并在 Keycloak 上登录您的用户(“使用 Google 登录”按钮)以仅使用您的身份验证服务器颁发的令牌。

© www.soinside.com 2019 - 2024. All rights reserved.