使用 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...)所以它看起来像
现在它将我发送到 auth 服务器的登录页面,在我登录后,我希望它将我重定向到 localhost/token(这是一个获取代码的获取请求,它会检索代码并执行 post 请求获取 jwt 并保存它)但是相反,我收到了一个无效的重定向 uri,我真的不确定这是我的实现还是服务器的问题
EDIT2: 我犯了一个愚蠢的错误,没有在 Auth 服务器中添加 http://localhost:8080/token 作为重定向 url,因为我认为我不需要到
根据您使用的是 MVC 还是 Webflux,将需要不同的方法:
- MVC:包括一个 "security filter" 来做到这一点。您将能够在以下链接中看到示例:
- Webflux:配置自己的安全管理器。您将能够在以下链接中看到示例:
Webflux Security Configuration
正如你在两者中看到的那样,调用了一个外部服务(使用 MVC 中的 RestTemplate
和 Webflux 中的 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)。使用令牌,您应该能够访问受保护的资源。希望有帮助
我正在尝试使用 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...)所以它看起来像
现在它将我发送到 auth 服务器的登录页面,在我登录后,我希望它将我重定向到 localhost/token(这是一个获取代码的获取请求,它会检索代码并执行 post 请求获取 jwt 并保存它)但是相反,我收到了一个无效的重定向 uri,我真的不确定这是我的实现还是服务器的问题
EDIT2: 我犯了一个愚蠢的错误,没有在 Auth 服务器中添加 http://localhost:8080/token 作为重定向 url,因为我认为我不需要到
根据您使用的是 MVC 还是 Webflux,将需要不同的方法:
- MVC:包括一个 "security filter" 来做到这一点。您将能够在以下链接中看到示例:
- Webflux:配置自己的安全管理器。您将能够在以下链接中看到示例:
Webflux Security Configuration
正如你在两者中看到的那样,调用了一个外部服务(使用 MVC 中的 RestTemplate
和 Webflux 中的 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)。使用令牌,您应该能够访问受保护的资源。希望有帮助