使用 Java Spring 执行授权代码授予流程 Rest Api

Execute an Authorization Code Grant Flow Using Java Spring Rest Api

我正在尝试使用 Java spring rest Api 调用需要授权的第 3 方端点,因此我需要执行授权代码授予流程。

我了解我需要首先获取代码的流程然后将代码交换为 JWT 和 最后 使用 JWT 进行安全调用。

对我来说没有意义的是,当我只使用没有 UI 的后端 rest api 时,我应该如何设置重定向 URI。通常,用户会被重定向到登录页面,他们可以在其中使用 username/password 或第三方帐户 (google/facebook...)

登录

经过大量谷歌搜索后,所有搜索都以保护我自己的端点的指南结束,而不是从我的 spring 启动服务

访问安全端点

编辑:值得一提的是,我只使用了一个没有任何前端(或 MVC)的后端,在 @Partha 的评论之后我做了以下事情:

首先,我添加了一个新的登录端点,当通过浏览器访问时(这不适用于swagger/postman)它应该将用户重定向到授权服务器:

@GetMapping
public void login(HttpServletResponse httpServletResponse) {
    httpServletResponse.setHeader("Location", getAuthServerEndpoint());
    httpServletResponse.setStatus(302);
}

我构建端点以获取所需的所有数据的地方(client_id,redirect_uri...)所以它看起来像

https://idpserver.bla/oauth/authorize?client_id=xyz&redirect_uri=http://localhost:8080/token&response_type=code&scope=xyz

现在它将我发送到 auth 服务器的登录页面,在我登录后,我希望它将我重定向到 localhost/token(这是一个获取代码的获取请求,它会检索代码并执行 post 请求获取 jwt 并保存它)但是相反,我收到了一个无效的重定向 uri,我真的不确定这是我的实现还是服务器的问题

EDIT2: 我犯了一个愚蠢的错误,没有在 Auth 服务器中添加 http://localhost:8080/token 作为重定向 url,因为我认为我不需要到

根据您使用的是 MVC 还是 Webflux,将需要不同的方法:

  • MVC:包括一个 "security filter" 来做到这一点。您将能够在以下链接中看到示例:

MVC Securiry Manager

MVC Security Filter

MVC Security Configuration

  • Webflux:配置自己的安全管理器。您将能够在以下链接中看到示例:

Webflux Securiry Manager

Webflux Securiry Context

Webflux Security Configuration

正如你在两者中看到的那样,调用了一个外部服务(使用 MVC 中的 RestTemplateWebflux 中的 WebClient ), 以获取所需的授权信息并决定 "logged user" 是否通过所需的安全逻辑。

您可以根据需要进行调整。

不太确定你是怎么尝试的..这里的想法是..你的api服务器应该有一个获取端点/登录。在你的 /login 控制器中,你应该重定向到 IDP 说 http://idpserver.bla?client_id=xxx&grant_type=code&nonce=yyy&redirect_uri=http://localhost:8080/token ( note, its redirect, not make an api request ). So, with this, when you hit http://localhost:8080/login in ur browser, you should see it being redirected to IDP. now you enter ur credentials, IDP validates that and redirect back to http://localhost:8080/token?code=XYZABC 或类似的东西。 /token API 的控制器代码应该从 url 参数中读取代码。并调用(这是 api 调用,而不是重定向)到 IDP,以根据您的范围将代码交换为令牌(idToken / accessToken)。使用令牌,您应该能够访问受保护的资源。希望有帮助