繁体   English   中英

验证 Spring Boot API

[英]Authenticating Spring Boot APIs

背景:

我有一些想要验证的 API 路由(约 15 个)。 现在,我可以在本地运行 spring boot 服务器 ( mvn spring boot run ) 并调用所有 API。 我还可以部署到 Heroku 并从 Heroku 云平台调用 API。 这很棒!

这是问题所在:

  1. 我需要为 API 提供身份验证。 这个想法是,在运行 spring boot 服务器时,我需要传入一个令牌才能使 API 调用正常工作。 如果没有,那么我应该得到一些未经授权的错误(我认为是 401 或 403)。 此外,我需要能够按角色(用户、管理员等)分隔这些 API。

  2. 理想情况下,我想构建一个可以调用这些 API 的测试客户端(也许是一个网页)。 我不确定身份验证在这里如何工作。

我有点困惑,因为我尝试使用 Auth0 但这似乎只适用于 1 个 API? Auth0 允许我生成令牌,但我不确定如何将它与 SpringBoot 集成。 它要求观众,但我不确定应该是什么(特别是因为我在本地运行 Spring Boot 服务器)。

接下来我要看的是 Spring Security。

为您的应用程序设置 Sprint 安全性。 hwoto 上什至有一个示例表单 Auth0 可以执行此操作: https ://auth0.com/docs/quickstart/backend/java-spring-security5/interactive

一旦你运行了 spring security,你就可以相应地注释你的方法。 例如@PreAuthorize("isAuthenticated()")

如果授权检查失败,spring 将自动响应错误代码403

访问令牌的受众是为其发出令牌的资源服务器。 在您的情况下,可能是http://localhost:8080 这将在生产中发生变化。 客户在获取访问令牌时应请求此受众。

资源服务器应该配置spring-boot-starter-oauth2-resource-server 未经授权的请求的 Spring 默认 HTTP 状态是 302(重定向到登录),但资源服务器返回 401 是最佳实践,这是一个简单的任务:

http.exceptionHandling().authenticationEntryPoint((request, response, authException) -> {
  response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Restricted Content\"");
  response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
});

有关资源服务器配置的更多详细信息,您可以查看我写的这篇教程 它涵盖权限映射和基于角色的访问控制。 它是为 Keycloak 设计的,但是切换到任何其他 OIDC 授权服务器(包括 Auth0)主要是编辑属性的问题(除了第一个教程,其中授权转换器实现必须稍微修改以读取您在中配置的声明Auth0 放置组/角色)。

客户端如何获得访问令牌取决于用例:如果代表用户,则应使用authorization-code流(对于“富”客户端使用 PKCE),但我们客户端是以自己的名义(没有特定经过身份验证的用户的上下文),则应使用client-credentials 对于 Spring 客户端(Thymeleaf UI 以及像WebClient这样的 REST 客户端,请使用spring-boot-starter-oauth2-client

我强烈建议您使用 JUnit 而不是客户端 UI 来测试您的应用程序。 如果您不知道如何模拟身份和 HTTP 请求,请参阅我已经链接的教程。

如果您仍然想构建一个带有 UI 的客户端来查询您的 API,您可以通过公开 OpenAPI 规范(请参阅 springdoc-openapi 了解相关信息)并使用 openapi-generator 生成一个客户端库来节省相当多的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM